The SEO Framework - Version 3.0.4

Version Description

  • Illustrious =

Release date:

  • February 25th, 2017

Did you know?

  • We're working on an extension for keyword and subject analysis, named Focus.
  • In its current state, it's already on par with other solutions, but we are going to take it even further.
  • More details will follow in a blog post, which we'll link to on our Twitter page when the features are ready.

Summarized:

  • This is a maintenance release with over 10 bugs fixed. Most notoriously were pixel guideline calculation errors and home page title errors.
  • Open Graph and Twitter custom title and description options have been added to every post, page, and CPT.
  • The description character count and pixel length guidelines have been updated.
  • All publicly queryable CPT posts and pages now support SEO settings and are included in the sitemap. No more messing with filters is needed.

About the new description guidelines:

  • Google increased their SERP's description length a few months ago, so we've updated the upper-limit guidelines.
  • We recommend enforcing these new guidelines for new pages, cornerstone pages, and the home page.
  • Although the description lengths have been updated, the transient cache isn't invalidated.
  • Over time the cache will refresh itself, this is done automatically by WordPress, or via your caching plugin's transients handler (if applicable).

About the social meta input:

  • There are new Open Graph and Twitter inputs in the SEO Settings.
  • The Twitter settings, when left empty, will use the Open Graph output.
  • The Open Graph settings, when left empty, will use the SEO meta output.
  • As always, auto-generated Open Graph and Twitter descriptions won't use prefixes.

Found unwanted links in the sitemap?

  • If you find posts in the sitemap that shouldn't be there, please refer to our renewed FAQ.
  • The FAQ entry title is "The sitemap contains unwanted links".

View the detailed log.

Download this release

Release Info

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

Code changes from version 3.0.3 to 3.0.4

Files changed (55) hide show
  1. autodescription.php +3 -3
  2. inc/classes/admin-init.class.php +27 -20
  3. inc/classes/admin-pages.class.php +16 -4
  4. inc/classes/cache.class.php +1 -1
  5. inc/classes/compat.class.php +1 -1
  6. inc/classes/core.class.php +36 -34
  7. inc/classes/debug.class.php +3 -3
  8. inc/classes/deprecated.class.php +1 -1
  9. inc/classes/detect.class.php +17 -16
  10. inc/classes/doing-it-right.class.php +71 -11
  11. inc/classes/feed.class.php +1 -1
  12. inc/classes/generate-description.class.php +97 -6
  13. inc/classes/generate-image.class.php +2 -1
  14. inc/classes/generate-ldjson.class.php +4 -3
  15. inc/classes/generate-title.class.php +118 -34
  16. inc/classes/generate-url.class.php +3 -5
  17. inc/classes/generate.class.php +1 -1
  18. inc/classes/init.class.php +4 -1
  19. inc/classes/inpost.class.php +18 -3
  20. inc/classes/load.class.php +1 -1
  21. inc/classes/metaboxes.class.php +8 -8
  22. inc/classes/post-data.class.php +20 -12
  23. inc/classes/profile.class.php +1 -1
  24. inc/classes/query.class.php +1 -1
  25. inc/classes/render.class.php +17 -13
  26. inc/classes/sanitize.class.php +3 -2
  27. inc/classes/site-options.class.php +2 -2
  28. inc/classes/sitemaps.class.php +141 -131
  29. inc/classes/term-data.class.php +17 -11
  30. inc/classes/user-data.class.php +1 -1
  31. inc/compat/plugin-bbpress.php +2 -1
  32. inc/compat/plugin-wpml.php +1 -1
  33. inc/functions/deprecated.php +1 -1
  34. inc/functions/optionsapi.php +1 -1
  35. inc/functions/plugin-activation.php +1 -1
  36. inc/functions/plugin-deactivation.php +1 -1
  37. inc/functions/plugin-test-server.php +4 -4
  38. inc/functions/upgrade.php +1 -1
  39. inc/interfaces/debug.interface.php +1 -1
  40. inc/views/inpost/seo-settings-singular.php +119 -7
  41. inc/views/inpost/seo-settings-tt.php +2 -1
  42. inc/views/metaboxes/homepage-metabox.php +2 -1
  43. inc/views/metaboxes/schema-metabox.php +1 -0
  44. language/autodescription.pot +217 -199
  45. lib/css/tsf-rtl.css +7 -6
  46. lib/css/tsf-rtl.min.css +1 -1
  47. lib/css/tsf.css +7 -6
  48. lib/css/tsf.min.css +1 -1
  49. lib/js/externs/tsf.externs.js +2 -2
  50. lib/js/externs/tsf.externs.protected.js +2 -2
  51. lib/js/tsf.js +365 -73
  52. lib/js/tsf.min.js +1 -1
  53. load.php +1 -1
  54. readme.txt +79 -32
  55. wpml-config.xml +13 -0
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 any WordPress website.
6
- * Version: 3.0.3
7
  * Author: Sybre Waaijer
8
  * Author URI: https://theseoframework.com/
9
  * License: GPLv3
@@ -15,7 +15,7 @@ defined( 'ABSPATH' ) or die;
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
@@ -51,7 +51,7 @@ defined( 'ABSPATH' ) or die;
51
  *
52
  * @since 1.0.0
53
  */
54
- define( 'THE_SEO_FRAMEWORK_VERSION', '3.0.3' );
55
 
56
  /**
57
  * 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 any WordPress website.
6
+ * Version: 3.0.4
7
  * Author: Sybre Waaijer
8
  * Author URI: https://theseoframework.com/
9
  * License: GPLv3
15
 
16
  /**
17
  * The SEO Framework plugin
18
+ * Copyright (C) 2015 - 2018 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
51
  *
52
  * @since 1.0.0
53
  */
54
+ define( 'THE_SEO_FRAMEWORK_VERSION', '3.0.4' );
55
 
56
  /**
57
  * The plugin Database version.
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 - 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
@@ -207,11 +207,12 @@ class Admin_Init extends Init {
207
  * @since 2.6.0
208
  * @staticvar array $strings : The l10n strings.
209
  * @since 2.7.0 Added AJAX nonce: 'autodescription-ajax-nonce'
210
- * @since 2.8.0 1. Added input detection: 'hasInput'
211
- * 2. Reworked output.
212
- * 3. Removed unused caching.
213
- * 4. Added dynamic output control.
214
  * @since 2.9.0 Added boolean $returnValue['states']['isSettingsPage']
 
215
  *
216
  * @return array $strings The l10n strings.
217
  */
@@ -265,7 +266,7 @@ class Admin_Init extends Init {
265
  $ishome = true;
266
 
267
  if ( $use_additions ) {
268
- $additions = $home_tagline ? $home_tagline : $description;
269
  } else {
270
  $additions = '';
271
  }
@@ -369,7 +370,7 @@ class Admin_Init extends Init {
369
  'descriptionSeparator' => $description_separator,
370
  'titleLocation' => $title_location,
371
  'titlePixelGuideline' => 600,
372
- 'descPixelGuideline' => $is_post_edit ? ( $this->is_page() ? 920 : 820 ) : 920,
373
  ),
374
  'other' => $this->additional_js_l10n( null, array(), true ),
375
  );
@@ -555,18 +556,22 @@ class Admin_Init extends Init {
555
 
556
  $_colors = $GLOBALS['_wp_admin_css_colors'];
557
 
558
- if ( ! isset( $_colors[ $scheme ]->colors ) || ! is_array( $_colors[ $scheme ]->colors ) )
559
- return '';
 
 
 
560
 
561
- $_scheme = $_colors[ $scheme ]->colors;
562
 
563
- $bg = $_scheme[0];
564
- $bg_accent = $_scheme[1];
565
- $color = $_scheme[2];
566
- $color_accent = $_scheme[3];
567
 
568
- $bg_alt_font = '#' . $this->get_relative_fontcolor( $bg );
569
- // $bg_accent_alt_font = '#' . $this->get_relative_fontcolor( $bg_accent );
 
570
 
571
  $css = array(
572
  '.tsf-flex-nav-tab .tsf-flex-nav-tab-radio:checked + .tsf-flex-nav-tab-label' => array(
@@ -574,7 +579,7 @@ class Admin_Init extends Init {
574
  ),
575
  '.tsf-tooltip-text-wrap' => array(
576
  "background-color:$bg_accent",
577
- "color:$bg_alt_font",
578
  ),
579
  '.tsf-tooltip-arrow:after' => array(
580
  "border-top-color:$bg_accent",
@@ -588,10 +593,12 @@ class Admin_Init extends Init {
588
  * Applies filters 'the_seo_framework_admin_color_css'
589
  *
590
  * @since 3.0.0
591
- * @param array $css The current styles.
592
- * @param string $scheme The current admin scheme.
 
 
593
  */
594
- $css = (array) \apply_filters( 'the_seo_framework_admin_color_css', $css, $scheme );
595
 
596
  $out = '';
597
  foreach ( $css as $attr => $style )
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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
207
  * @since 2.6.0
208
  * @staticvar array $strings : The l10n strings.
209
  * @since 2.7.0 Added AJAX nonce: 'autodescription-ajax-nonce'
210
+ * @since 2.8.0 1 : Added input detection: 'hasInput'
211
+ * 2 : Reworked output.
212
+ * 3 : Removed unused caching.
213
+ * 4 : Added dynamic output control.
214
  * @since 2.9.0 Added boolean $returnValue['states']['isSettingsPage']
215
+ * @since 3.0.4 `descPixelGuideline` has been increased from "920 and 820" to "1820 and 1720" respectively.
216
  *
217
  * @return array $strings The l10n strings.
218
  */
266
  $ishome = true;
267
 
268
  if ( $use_additions ) {
269
+ $additions = $home_tagline ?: $description;
270
  } else {
271
  $additions = '';
272
  }
370
  'descriptionSeparator' => $description_separator,
371
  'titleLocation' => $title_location,
372
  'titlePixelGuideline' => 600,
373
+ 'descPixelGuideline' => $is_post_edit ? ( $this->is_page() ? 1820 : 1720 ) : 1820,
374
  ),
375
  'other' => $this->additional_js_l10n( null, array(), true ),
376
  );
556
 
557
  $_colors = $GLOBALS['_wp_admin_css_colors'];
558
 
559
+ if (
560
+ ! isset( $_colors[ $scheme ]->colors )
561
+ || ! is_array( $_colors[ $scheme ]->colors )
562
+ || count( $_colors[ $scheme ]->colors ) < 4
563
+ ) return '';
564
 
565
+ $colors = $_colors[ $scheme ]->colors;
566
 
567
+ $bg = $colors[0];
568
+ $bg_accent = $colors[1];
569
+ $color = $colors[2];
570
+ $color_accent = $colors[3];
571
 
572
+ // TODO fix this.
573
+ // $bg_alt_font = '#' . $this->get_relative_fontcolor( $bg );
574
+ $bg_accent_alt_font = '#' . $this->get_relative_fontcolor( $bg_accent );
575
 
576
  $css = array(
577
  '.tsf-flex-nav-tab .tsf-flex-nav-tab-radio:checked + .tsf-flex-nav-tab-label' => array(
579
  ),
580
  '.tsf-tooltip-text-wrap' => array(
581
  "background-color:$bg_accent",
582
+ "color:$bg_accent_alt_font",
583
  ),
584
  '.tsf-tooltip-arrow:after' => array(
585
  "border-top-color:$bg_accent",
593
  * Applies filters 'the_seo_framework_admin_color_css'
594
  *
595
  * @since 3.0.0
596
+ * @since 3.0.4 Now passes $colors.
597
+ * @param array $css The current styles. Empty it to disable conditional styling.
598
+ * @param string $scheme The current admin scheme name.
599
+ * @param array $colors The current admin scheme values.
600
  */
601
+ $css = (array) \apply_filters( 'the_seo_framework_admin_color_css', $css, $scheme, $colors );
602
 
603
  $out = '';
604
  foreach ( $css as $attr => $style )
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 - 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
@@ -871,18 +871,30 @@ class Admin_Pages extends Inpost {
871
  }
872
 
873
  /**
874
- * Outputs floating title HTML for JavaScript.
875
  *
876
- * @since 3.0.0
877
  */
878
- public function output_floating_title_elements() {
879
  ?>
 
880
  <span id="tsf-title-offset" class="hide-if-no-js"></span>
881
  <span id="tsf-title-placeholder" class="hide-if-no-js"></span>
882
  <span id="tsf-title-placeholder-prefix" class="hide-if-no-js"></span>
883
  <?php
884
  }
885
 
 
 
 
 
 
 
 
 
 
 
 
886
  /**
887
  * Outputs character counter wrap for both JavaScript and no-Javascript.
888
  *
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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
871
  }
872
 
873
  /**
874
+ * Outputs floating and reference title HTML elements for JavaScript.
875
  *
876
+ * @since 3.0.4
877
  */
878
+ public function output_js_title_elements() {
879
  ?>
880
+ <span id="tsf-title-reference" style="display:none"></span>
881
  <span id="tsf-title-offset" class="hide-if-no-js"></span>
882
  <span id="tsf-title-placeholder" class="hide-if-no-js"></span>
883
  <span id="tsf-title-placeholder-prefix" class="hide-if-no-js"></span>
884
  <?php
885
  }
886
 
887
+ /**
888
+ * Outputs reference description HTML elements for JavaScript.
889
+ *
890
+ * @since 3.0.4
891
+ */
892
+ public function output_js_description_elements() {
893
+ ?>
894
+ <span id="tsf-description-reference" style="display:none"></span>
895
+ <?php
896
+ }
897
+
898
  /**
899
  * Outputs character counter wrap for both JavaScript and no-Javascript.
900
  *
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 - 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
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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/compat.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
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
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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/core.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
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
@@ -820,6 +820,9 @@ class Core {
820
  * @since 2.8.0
821
  * @since 2.9.0 Now adds a little more relative softness based on rel_lum.
822
  * @since 2.9.2 (Typo): Renamed from 'get_relatitve_fontcolor' to 'get_relative_fontcolor'.
 
 
 
823
  *
824
  * @param string $hex The 3 to 6 character RGB hex. '#' prefix is supported.
825
  * @return string The hexadecimal RGB relative font color, without '#' prefix.
@@ -839,41 +842,41 @@ class Core {
839
  $g = hexdec( $hex[1] );
840
  $b = hexdec( $hex[2] );
841
 
842
- //* Convert to sRGB for relative luminance.
843
- $sr = 0.2125 * $r;
844
- $sg = 0.7154 * $g;
845
- $sb = 0.0721 * $b;
846
- $rel_lum = 1 - ( $sr + $sg + $sb ) / 255;
847
-
848
- //* Convert to relative intvals between 1 and 0 for L from HSL
849
- // $rr = $r / 255;
850
- // $rg = $g / 255;
851
- // $rb = $b / 255;
852
- // $luminance = ( min( $rr, $rg, $rb ) + max( $rr, $rg, $rb ) ) / 2;
853
-
854
- //* Get perceptive luminance (greyscale) according to W3C.
855
- $gr = 0.2989 * $r;
856
- $gg = 0.5870 * $g;
857
- $gb = 0.1140 * $b;
858
- $per_lum = 1 - ( $gr + $gg + $gb ) / 255;
859
-
860
- //* Invert colors if they hit luminance boundaries.
861
  if ( $rel_lum < 0.5 ) {
862
- //* Build dark. Add softness.
863
- $gr = $gr * $per_lum / 8 / 0.2989 + 8 * 0.2989 / $rel_lum;
864
- $gg = $gg * $per_lum / 8 / 0.5870 + 8 * 0.5870 / $rel_lum;
865
- $gb = $gb * $per_lum / 8 / 0.1140 + 8 * 0.1140 / $rel_lum;
866
  } else {
867
- //* Build light. Add (subtract) softness.
868
- $gr = 255 - $gr * $per_lum / 8 * 0.2989 - 8 * 0.2989 / $rel_lum;
869
- $gg = 255 - $gg * $per_lum / 8 * 0.5870 - 8 * 0.5870 / $rel_lum;
870
- $gb = 255 - $gb * $per_lum / 8 * 0.1140 - 8 * 0.1140 / $rel_lum;
871
  }
872
 
873
- //* Complete hexvals.
874
- $retr = str_pad( dechex( $gr ), 2, '0', STR_PAD_LEFT );
875
- $retg = str_pad( dechex( $gg ), 2, '0', STR_PAD_LEFT );
876
- $retb = str_pad( dechex( $gb ), 2, '0', STR_PAD_LEFT );
877
 
878
  return $retr . $retg . $retb;
879
  }
@@ -888,8 +891,7 @@ class Core {
888
  * @since 2.9.0 : 1. Removed word boundary requirement for strong.
889
  * 2. Now accepts regex count their numeric values in string.
890
  * 3. Fixed header 1~6 calculation.
891
- * @since 2.9.3 : 1. Added $args parameter.
892
- * 2. TODO It now uses substr_replace instead of str_replace to prevent duplicated replacements.
893
  * @link https://wordpress.org/plugins/about/readme.txt
894
  *
895
  * @param string $text The text that might contain markdown. Expected to be escaped.
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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
820
  * @since 2.8.0
821
  * @since 2.9.0 Now adds a little more relative softness based on rel_lum.
822
  * @since 2.9.2 (Typo): Renamed from 'get_relatitve_fontcolor' to 'get_relative_fontcolor'.
823
+ * @since 3.0.4 : Now uses WCAG's relative luminance formula
824
+ * @link https://www.w3.org/TR/2008/REC-WCAG20-20081211/#visual-audio-contrast-contrast
825
+ * @link https://www.w3.org/WAI/GL/wiki/Relative_luminance
826
  *
827
  * @param string $hex The 3 to 6 character RGB hex. '#' prefix is supported.
828
  * @return string The hexadecimal RGB relative font color, without '#' prefix.
842
  $g = hexdec( $hex[1] );
843
  $b = hexdec( $hex[2] );
844
 
845
+ $get_relative_luminance = function( $v ) {
846
+ //= Convert to 0~1 value.
847
+ $v = $v / 255;
848
+
849
+ if ( $v > .03928 ) {
850
+ $lum = pow( ( $v + .055 ) / 1.055, 2.4 );
851
+ } else {
852
+ $lum = $v / 12.92;
853
+ }
854
+ return $lum;
855
+ };
856
+
857
+ //* Use sRGB for relative luminance.
858
+ $sr = 0.2126 * $get_relative_luminance( $r );
859
+ $sg = 0.7152 * $get_relative_luminance( $g );
860
+ $sb = 0.0722 * $get_relative_luminance( $b );
861
+ $rel_lum = ( $sr + $sg + $sb );
862
+
863
+ //= Invert colors if they hit luminance boundaries.
864
  if ( $rel_lum < 0.5 ) {
865
+ //* Build dark greyscale.
866
+ $gr = 255 - ( $r * 0.2989 / 8 ) * $rel_lum;
867
+ $gg = 255 - ( $g * 0.5870 / 8 ) * $rel_lum;
868
+ $gb = 255 - ( $b * 0.1140 / 8 ) * $rel_lum;
869
  } else {
870
+ //* Build light greyscale.
871
+ $gr = ( $r * 0.2989 / 8 ) * $rel_lum;
872
+ $gg = ( $g * 0.5870 / 8 ) * $rel_lum;
873
+ $gb = ( $b * 0.1140 / 8 ) * $rel_lum;
874
  }
875
 
876
+ //* Build RGB hex.
877
+ $retr = str_pad( dechex( round( $gr ) ), 2, '0', STR_PAD_LEFT );
878
+ $retg = str_pad( dechex( round( $gg ) ), 2, '0', STR_PAD_LEFT );
879
+ $retb = str_pad( dechex( round( $gb ) ), 2, '0', STR_PAD_LEFT );
880
 
881
  return $retr . $retg . $retb;
882
  }
891
  * @since 2.9.0 : 1. Removed word boundary requirement for strong.
892
  * 2. Now accepts regex count their numeric values in string.
893
  * 3. Fixed header 1~6 calculation.
894
+ * @since 2.9.3 : Added $args parameter.
 
895
  * @link https://wordpress.org/plugins/about/readme.txt
896
  *
897
  * @param string $text The text that might contain markdown. Expected to be escaped.
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 - 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
@@ -228,7 +228,7 @@ final class Debug implements Debug_Interface {
228
  /**
229
  * Filter whether to trigger an error for _doing_it_wrong() calls.
230
  *
231
- * @since 3.1.0
232
  *
233
  * @param bool $trigger Whether to trigger the error for _doing_it_wrong() calls. Default true.
234
  */
@@ -280,7 +280,7 @@ final class Debug implements Debug_Interface {
280
  /**
281
  * Filter whether to trigger an error for _doing_it_wrong() calls.
282
  *
283
- * @since 3.1.0
284
  *
285
  * @param bool $trigger Whether to trigger the error for _doing_it_wrong() calls. Default true.
286
  */
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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
228
  /**
229
  * Filter whether to trigger an error for _doing_it_wrong() calls.
230
  *
231
+ * @since WP Core 3.1.0
232
  *
233
  * @param bool $trigger Whether to trigger the error for _doing_it_wrong() calls. Default true.
234
  */
280
  /**
281
  * Filter whether to trigger an error for _doing_it_wrong() calls.
282
  *
283
+ * @since WP Core 3.1.0
284
  *
285
  * @param bool $trigger Whether to trigger the error for _doing_it_wrong() calls. Default true.
286
  */
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 - 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
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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/detect.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
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
@@ -249,7 +249,7 @@ class Detect extends Render {
249
  }
250
  }
251
 
252
- //* No class, function or constant found to exist
253
  return false;
254
  }
255
 
@@ -799,7 +799,7 @@ class Detect extends Render {
799
  static $sep_output = null;
800
  static $seplocation_output = null;
801
 
802
- if ( ! isset( $title_output ) || ! isset( $sep_output ) || ! isset( $seplocation_output ) ) {
803
  //* Initiate caches, set up variables.
804
 
805
  if ( '' === $title )
@@ -889,12 +889,13 @@ class Detect extends Render {
889
  public function post_type_supports_inpost( $post_type = null ) {
890
 
891
  if ( isset( $post_type ) && $post_type ) {
892
- $supports = (array) \apply_filters( 'the_seo_framework_custom_post_type_support',
893
- array(
894
- 'title',
895
- 'editor',
896
- )
897
- );
 
898
 
899
  foreach ( $supports as $support ) {
900
  if ( ! \post_type_supports( $post_type, $support ) ) {
@@ -922,23 +923,23 @@ class Detect extends Render {
922
  */
923
  public function post_type_supports_custom_seo( $post_type = '' ) {
924
 
925
- $post_type = $this->get_supported_post_type( true, $post_type );
926
-
927
- if ( empty( $post_type ) )
928
- return false;
929
-
930
  static $supported = array();
931
 
932
  if ( isset( $supported[ $post_type ] ) )
933
  return $supported[ $post_type ];
934
 
 
 
 
 
 
935
  /**
936
  * We now support all posts that allow a title, content editor and excerpt.
937
  * To ease the flow, we have our basic list to check first.
938
  *
939
  * @since 2.3.5
940
  */
941
- if ( \post_type_supports( $post_type, 'autodescription-meta' ) || $this->post_type_supports_inpost( $post_type ) )
942
  return $supported[ $post_type ] = true;
943
 
944
  return $supported[ $post_type ] = false;
@@ -991,7 +992,7 @@ class Detect extends Render {
991
  * Applies filters 'the_seo_framework_supported_post_type' : string
992
  * @since 2.6.2
993
  *
994
- * @param string $post_type The supported post type. Is boolean false if not supported.
995
  * @param string $post_type_evaluated The evaluated post type.
996
  */
997
  $post_type = (string) \apply_filters( 'the_seo_framework_supported_post_type', $post_type, $post_type_evaluated );
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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
249
  }
250
  }
251
 
252
+ //* No globals, constant, function, or class found to exist
253
  return false;
254
  }
255
 
799
  static $sep_output = null;
800
  static $seplocation_output = null;
801
 
802
+ if ( ! isset( $title_output, $sep_output, $seplocation_output ) ) {
803
  //* Initiate caches, set up variables.
804
 
805
  if ( '' === $title )
889
  public function post_type_supports_inpost( $post_type = null ) {
890
 
891
  if ( isset( $post_type ) && $post_type ) {
892
+ /**
893
+ * Applies filters 'the_seo_framework_custom_post_type_support'
894
+ * @since 2.3.5
895
+ * @since 3.0.4 Default parameter now is `[]` instead of `['title','editor']`.
896
+ * @param array $supports The required post type support, like 'title', 'editor'.
897
+ */
898
+ $supports = (array) \apply_filters( 'the_seo_framework_custom_post_type_support', array() );
899
 
900
  foreach ( $supports as $support ) {
901
  if ( ! \post_type_supports( $post_type, $support ) ) {
923
  */
924
  public function post_type_supports_custom_seo( $post_type = '' ) {
925
 
 
 
 
 
 
926
  static $supported = array();
927
 
928
  if ( isset( $supported[ $post_type ] ) )
929
  return $supported[ $post_type ];
930
 
931
+ $post_type = $this->get_supported_post_type( true, $post_type );
932
+
933
+ if ( empty( $post_type ) )
934
+ return $supported[ $post_type ] = false;
935
+
936
  /**
937
  * We now support all posts that allow a title, content editor and excerpt.
938
  * To ease the flow, we have our basic list to check first.
939
  *
940
  * @since 2.3.5
941
  */
942
+ if ( $this->post_type_supports_inpost( $post_type ) )
943
  return $supported[ $post_type ] = true;
944
 
945
  return $supported[ $post_type ] = false;
992
  * Applies filters 'the_seo_framework_supported_post_type' : string
993
  * @since 2.6.2
994
  *
995
+ * @param string|bool $post_type The supported post type. Is boolean false if not supported.
996
  * @param string $post_type_evaluated The evaluated post type.
997
  */
998
  $post_type = (string) \apply_filters( 'the_seo_framework_supported_post_type', $post_type, $post_type_evaluated );
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 - 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
@@ -207,7 +207,7 @@ class Doing_It_Right extends Generate_Ldjson {
207
 
208
  if ( $id ) {
209
  //* Everything but inline-save-tax action.
210
- \add_filter( 'manage_' . $id . '_columns', array( $this, 'add_column' ), 1 );
211
 
212
  /**
213
  * Always load pages and posts.
@@ -217,11 +217,11 @@ class Doing_It_Right extends Generate_Ldjson {
217
  \add_action( 'manage_pages_custom_column', array( $this, 'seo_bar_ajax' ), 1, 3 );
218
  } elseif ( $taxonomy ) {
219
  //* Action: inline-save-tax does not POST screen.
220
- \add_filter( 'manage_edit-' . $taxonomy . '_columns', array( $this, 'add_column' ), 1 );
221
  }
222
 
223
  if ( $taxonomy )
224
- \add_action( 'manage_' . $taxonomy . '_custom_column', array( $this, 'seo_bar_ajax' ), 1, 3 );
225
 
226
  } else {
227
  $id = isset( $screen->id ) ? $screen->id : '';
@@ -232,7 +232,7 @@ class Doing_It_Right extends Generate_Ldjson {
232
  $taxonomy = isset( $screen->taxonomy ) ? $screen->taxonomy : '';
233
 
234
  if ( $taxonomy )
235
- \add_action( 'manage_' . $taxonomy . '_custom_column', array( $this, 'seo_bar' ), 1, 3 );
236
 
237
  /**
238
  * Always load pages and posts.
@@ -306,7 +306,7 @@ class Doing_It_Right extends Generate_Ldjson {
306
  }
307
 
308
  /**
309
- * Echo's the SEO Bar.
310
  *
311
  * @since 2.6.0
312
  * @staticvar string $type
@@ -316,6 +316,34 @@ class Doing_It_Right extends Generate_Ldjson {
316
  * @param string $tax_id this is empty : If it's a taxonomy, this is the taxonomy id
317
  */
318
  public function seo_bar( $column, $post_id, $tax_id = '' ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
319
 
320
  static $type = null;
321
 
@@ -340,12 +368,13 @@ class Doing_It_Right extends Generate_Ldjson {
340
  }
341
 
342
  if ( 'tsf-seo-bar-wrap' === $column )
343
- $this->post_status( $post_id, $type, true );
344
 
 
345
  }
346
 
347
  /**
348
- * Echo's the SEO column in edit screens on Ajax call.
349
  *
350
  * @since 2.1.9
351
  *
@@ -354,6 +383,33 @@ class Doing_It_Right extends Generate_Ldjson {
354
  * @param string $tax_id this is empty : If it's a taxonomy, this is the taxonomy id
355
  */
356
  public function seo_bar_ajax( $column, $post_id, $tax_id = '' ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
357
 
358
  $is_term = false;
359
 
@@ -372,8 +428,10 @@ class Doing_It_Right extends Generate_Ldjson {
372
 
373
  $ajax_id = $column . $post_id;
374
 
375
- $this->post_status_special( $context, '?', 'unknown', $is_term, $ajax_id, true );
376
  }
 
 
377
  }
378
 
379
  /**
@@ -981,6 +1039,8 @@ class Doing_It_Right extends Generate_Ldjson {
981
  * Description Length notices.
982
  *
983
  * @since 2.6.0
 
 
984
  *
985
  * @param int $desc_len The Title length
986
  * @param string $class The current color class.
@@ -1006,12 +1066,12 @@ class Doing_It_Right extends Generate_Ldjson {
1006
 
1007
  // Don't make it okay if it's already bad.
1008
  $class = $bad === $class ? $class : $okay;
1009
- } elseif ( $desc_len > 155 && $desc_len < 175 ) {
1010
  $notice = $i18n['length_too_long'];
1011
 
1012
  // Don't make it okay if it's already bad.
1013
  $class = $bad === $class ? $class : $okay;
1014
- } elseif ( $desc_len >= 175 ) {
1015
  $notice = $i18n['length_far_too_long'];
1016
  $class = $bad;
1017
  } else {
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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
207
 
208
  if ( $id ) {
209
  //* Everything but inline-save-tax action.
210
+ \add_filter( 'manage_' . $id . '_columns', array( $this, 'add_column' ), 10, 1 );
211
 
212
  /**
213
  * Always load pages and posts.
217
  \add_action( 'manage_pages_custom_column', array( $this, 'seo_bar_ajax' ), 1, 3 );
218
  } elseif ( $taxonomy ) {
219
  //* Action: inline-save-tax does not POST screen.
220
+ \add_filter( 'manage_edit-' . $taxonomy . '_columns', array( $this, 'add_column' ), 1, 1 );
221
  }
222
 
223
  if ( $taxonomy )
224
+ \add_filter( 'manage_' . $taxonomy . '_custom_column', array( $this, 'get_taxonomy_seo_bar_ajax' ), 1, 3 );
225
 
226
  } else {
227
  $id = isset( $screen->id ) ? $screen->id : '';
232
  $taxonomy = isset( $screen->taxonomy ) ? $screen->taxonomy : '';
233
 
234
  if ( $taxonomy )
235
+ \add_filter( 'manage_' . $taxonomy . '_custom_column', array( $this, 'get_taxonomy_seo_bar' ), 1, 3 );
236
 
237
  /**
238
  * Always load pages and posts.
306
  }
307
 
308
  /**
309
+ * Echos the SEO Bar.
310
  *
311
  * @since 2.6.0
312
  * @staticvar string $type
316
  * @param string $tax_id this is empty : If it's a taxonomy, this is the taxonomy id
317
  */
318
  public function seo_bar( $column, $post_id, $tax_id = '' ) {
319
+ echo $this->get_seo_bar( $column, $post_id, $tax_id );
320
+ }
321
+
322
+ /**
323
+ * Returns the SEO Bar for taxonomies.
324
+ *
325
+ * @since 3.0.4
326
+ * @staticvar string $type
327
+ *
328
+ * @param string $string The current column string.
329
+ * @param string $column_name Name of the column.
330
+ * @param string $term_id Term ID.
331
+ */
332
+ public function get_taxonomy_seo_bar( $string, $column_name, $term_id ) {
333
+ return $string . $this->get_seo_bar( '', $column_name, $term_id );
334
+ }
335
+
336
+ /**
337
+ * Returns the SEO Bar.
338
+ *
339
+ * @since 3.0.4
340
+ * @staticvar string $type
341
+ *
342
+ * @param string $column the current column : If it's a taxonomy, this is empty
343
+ * @param int $post_id the post id : If it's a taxonomy, this is the column name
344
+ * @param string $tax_id this is empty : If it's a taxonomy, this is the taxonomy id
345
+ */
346
+ public function get_seo_bar( $column, $post_id, $tax_id = '' ) {
347
 
348
  static $type = null;
349
 
368
  }
369
 
370
  if ( 'tsf-seo-bar-wrap' === $column )
371
+ return $this->post_status( $post_id, $type );
372
 
373
+ return '';
374
  }
375
 
376
  /**
377
+ * Echos the SEO column in edit screens on AJAX.
378
  *
379
  * @since 2.1.9
380
  *
383
  * @param string $tax_id this is empty : If it's a taxonomy, this is the taxonomy id
384
  */
385
  public function seo_bar_ajax( $column, $post_id, $tax_id = '' ) {
386
+ echo $this->get_seo_bar_ajax( $column, $post_id, $tax_id );
387
+ }
388
+
389
+ /**
390
+ * Returns the SEO Bar for taxonomies on AJAX.
391
+ *
392
+ * @since 3.0.4
393
+ * @staticvar string $type
394
+ *
395
+ * @param string $string The current column string.
396
+ * @param string $column_name Name of the column.
397
+ * @param string $term_id Term ID.
398
+ */
399
+ public function get_taxonomy_seo_bar_ajax( $string, $column_name, $term_id ) {
400
+ return $string . $this->get_seo_bar_ajax( '', $column_name, $term_id );
401
+ }
402
+
403
+ /**
404
+ * Returns the SEO column in edit screens on AJAX.
405
+ *
406
+ * @since 3.0.4
407
+ *
408
+ * @param string $column the current column : If it's a taxonomy, this is empty
409
+ * @param int $post_id the post id : If it's a taxonomy, this is the column name
410
+ * @param string $tax_id this is empty : If it's a taxonomy, this is the taxonomy id
411
+ */
412
+ public function get_seo_bar_ajax( $column, $post_id, $tax_id = '' ) {
413
 
414
  $is_term = false;
415
 
428
 
429
  $ajax_id = $column . $post_id;
430
 
431
+ return $this->post_status_special( $context, '?', 'unknown', $is_term, $ajax_id );
432
  }
433
+
434
+ return '';
435
  }
436
 
437
  /**
1039
  * Description Length notices.
1040
  *
1041
  * @since 2.6.0
1042
+ * @since 3.0.4 : 1. Threshold "too long" has been increased from 155 to 300.
1043
+ * 2. Threshold "far too long" has been increased to 330 from 175.
1044
  *
1045
  * @param int $desc_len The Title length
1046
  * @param string $class The current color class.
1066
 
1067
  // Don't make it okay if it's already bad.
1068
  $class = $bad === $class ? $class : $okay;
1069
+ } elseif ( $desc_len > 300 && $desc_len < 330 ) {
1070
  $notice = $i18n['length_too_long'];
1071
 
1072
  // Don't make it okay if it's already bad.
1073
  $class = $bad === $class ? $class : $okay;
1074
+ } elseif ( $desc_len >= 330 ) {
1075
  $notice = $i18n['length_far_too_long'];
1076
  $class = $bad;
1077
  } else {
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 - 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
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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 - 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
@@ -39,6 +39,87 @@ class Generate_Description extends Generate {
39
  parent::__construct();
40
  }
41
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  /**
43
  * Creates description. Base function.
44
  *
@@ -107,7 +188,10 @@ class Generate_Description extends Generate {
107
  if ( \apply_filters( 'the_seo_framework_do_shortcodes_in_description', false ) )
108
  $description = \do_shortcode( $description );
109
 
110
- return $this->escape_description( $description );
 
 
 
111
  }
112
 
113
  /**
@@ -130,6 +214,7 @@ class Generate_Description extends Generate {
130
  'is_home' => false,
131
  'get_custom_field' => true,
132
  'social' => false,
 
133
  );
134
 
135
  /**
@@ -139,9 +224,11 @@ class Generate_Description extends Generate {
139
  * @param bool $is_home We're generating for the home page.
140
  * @param bool $get_custom_field Do not fetch custom title when false.
141
  * @param bool $social Generate Social Description when true.
 
142
  * }
143
  *
144
  * @since 2.5.0
 
145
  *
146
  * @param array $defaults The description defaults.
147
  * @param array $args The input args.
@@ -159,6 +246,7 @@ class Generate_Description extends Generate {
159
  $args['is_home'] = isset( $args['is_home'] ) ? (bool) $args['is_home'] : $defaults['is_home'];
160
  $args['get_custom_field'] = isset( $args['get_custom_field'] ) ? (bool) $args['get_custom_field'] : $defaults['get_custom_field'];
161
  $args['social'] = isset( $args['social'] ) ? (bool) $args['social'] : $defaults['social'];
 
162
 
163
  return $args;
164
  }
@@ -473,6 +561,7 @@ class Generate_Description extends Generate {
473
  * Returns the generated description excerpt array for the normal description tag.
474
  *
475
  * @since 2.8.0
 
476
  *
477
  * @param int $id The post/term ID.
478
  * @param bool|object The term object.
@@ -506,12 +595,13 @@ class Generate_Description extends Generate {
506
  * Determine if the title is far too long (72+, rather than 75 in the Title guidelines).
507
  * If this is the case, trim the "title on blogname" part from the description.
508
  * @since 2.8.0
 
509
  */
510
  if ( $additions_length > 71 ) {
511
- $max_char_length = 155;
512
  $trim = true;
513
  } else {
514
- $max_char_length = 155 - $additions_length;
515
  $trim = false;
516
  }
517
 
@@ -761,7 +851,7 @@ class Generate_Description extends Generate {
761
  $id = $this->get_the_real_ID();
762
 
763
  if ( $page_on_front || $this->is_front_page_by_id( $id ) ) :
764
- $title = $this->get_option( 'homepage_title_tagline' ) ?: $this->get_blogdescription();
765
  else :
766
  /**
767
  * No need to parse these when generating social description.
@@ -815,6 +905,7 @@ class Generate_Description extends Generate {
815
  *
816
  * @since 2.3.4
817
  * @since 2.8.2 Now no longer escapes excerpt by accident in processing, preventing "too short" output.
 
818
  * @staticvar array $excerpt_cache Holds the excerpt
819
  * @staticvar array $excerptlength_cache Holds the excerpt length
820
  *
@@ -823,7 +914,7 @@ class Generate_Description extends Generate {
823
  * @param int $max_char_length The maximum excerpt char length.
824
  * @return string $excerpt The excerpt, not escaped.
825
  */
826
- public function generate_excerpt( $page_id, $term = '', $max_char_length = 155 ) {
827
 
828
  static $excerpt_cache = array();
829
  static $excerptlength_cache = array();
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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
39
  parent::__construct();
40
  }
41
 
42
+ /**
43
+ * Returns the Twitter meta description. Falls back to Open Graph description.
44
+ *
45
+ * @since 3.0.4
46
+ * @uses $this->get_open_graph_description()
47
+ *
48
+ * @param int|null $id The post or term ID. Falls back to queried ID.
49
+ * @param bool $escape Whether to escape the description.
50
+ * @return string Twitter Description.
51
+ */
52
+ public function get_twitter_description( $id = null, $escape = true ) {
53
+
54
+ if ( is_null( $id ) )
55
+ $id = $this->get_the_real_ID();
56
+
57
+ $desc = $this->get_custom_field( '_twitter_description', $id )
58
+ ?: $this->get_open_graph_description( $id, false );
59
+
60
+ return $escape ? $this->escape_description( $desc ) : $desc;
61
+ }
62
+
63
+ /**
64
+ * Returns the Open Graph meta description. Falls back to meta description.
65
+ *
66
+ * @since 3.0.4
67
+ * @uses $this->get_generated_open_graph_description()
68
+ *
69
+ * @param int|null $id The post or term ID. Falls back to queried ID.
70
+ * @param bool $escape Whether to escape the description.
71
+ * @return string Open Graph Description.
72
+ */
73
+ public function get_open_graph_description( $id = null, $escape = true ) {
74
+
75
+ if ( is_null( $id ) )
76
+ $id = $this->get_the_real_ID();
77
+
78
+ $desc = $this->get_custom_field( '_open_graph_description', $id )
79
+ ?: $this->get_generated_open_graph_description( $id, false );
80
+
81
+ return $escape ? $this->escape_description( $desc ) : $desc;
82
+ }
83
+
84
+ /**
85
+ * Returns the autogenerated open graph meta description. Falls back to meta description.
86
+ *
87
+ * @since 3.0.4
88
+ * @uses $this->get_generated_open_graph_description()
89
+ *
90
+ * @param int|null $id The post or term ID. Falls back to queried ID.
91
+ * @param bool $escape Whether to escape the description.
92
+ * @return string Autogenerated Twitter Description.
93
+ */
94
+ public function get_generated_twitter_description( $id = null, $escape = true ) {
95
+ return $this->get_generated_open_graph_description( $id, $escape );
96
+ }
97
+
98
+ /**
99
+ * Returns the autogenerated open graph meta description. Falls back to meta description.
100
+ *
101
+ * @since 3.0.4
102
+ * @uses $this->generate_description()
103
+ * @staticvar array $cache
104
+ *
105
+ * @param int|null $id The post or term ID. Falls back to queried ID.
106
+ * @param bool $escape Whether to escape the description.
107
+ * @return string Autogenerated Open Graph Description.
108
+ */
109
+ public function get_generated_open_graph_description( $id = null, $escape = true ) {
110
+
111
+ if ( is_null( $id ) )
112
+ $id = $this->get_the_real_ID();
113
+
114
+ static $cache = array();
115
+
116
+ $desc = isset( $cache[ $id ] )
117
+ ? $cache[ $id ]
118
+ : $cache[ $id ] = $this->generate_description( '', array( 'id' => $id, 'social' => true, 'escape' => false ) );
119
+
120
+ return $escape ? $this->escape_description( $desc ) : $desc;
121
+ }
122
+
123
  /**
124
  * Creates description. Base function.
125
  *
188
  if ( \apply_filters( 'the_seo_framework_do_shortcodes_in_description', false ) )
189
  $description = \do_shortcode( $description );
190
 
191
+ if ( $args['escape'] )
192
+ $description = $this->escape_description( $description );
193
+
194
+ return $description;
195
  }
196
 
197
  /**
214
  'is_home' => false,
215
  'get_custom_field' => true,
216
  'social' => false,
217
+ 'escape' => true,
218
  );
219
 
220
  /**
224
  * @param bool $is_home We're generating for the home page.
225
  * @param bool $get_custom_field Do not fetch custom title when false.
226
  * @param bool $social Generate Social Description when true.
227
+ * @param bool $escape Whether to escape the description.
228
  * }
229
  *
230
  * @since 2.5.0
231
+ * @since 3.0.4 Added escape parameter.
232
  *
233
  * @param array $defaults The description defaults.
234
  * @param array $args The input args.
246
  $args['is_home'] = isset( $args['is_home'] ) ? (bool) $args['is_home'] : $defaults['is_home'];
247
  $args['get_custom_field'] = isset( $args['get_custom_field'] ) ? (bool) $args['get_custom_field'] : $defaults['get_custom_field'];
248
  $args['social'] = isset( $args['social'] ) ? (bool) $args['social'] : $defaults['social'];
249
+ $args['escape'] = isset( $args['escape'] ) ? (bool) $args['escape'] : $defaults['escape'];
250
 
251
  return $args;
252
  }
561
  * Returns the generated description excerpt array for the normal description tag.
562
  *
563
  * @since 2.8.0
564
+ * @since 3.0.4 Now uses 300 characters instead of 155.
565
  *
566
  * @param int $id The post/term ID.
567
  * @param bool|object The term object.
595
  * Determine if the title is far too long (72+, rather than 75 in the Title guidelines).
596
  * If this is the case, trim the "title on blogname" part from the description.
597
  * @since 2.8.0
598
+ * @since 3.0.4 Increased to basis 300, from 155.
599
  */
600
  if ( $additions_length > 71 ) {
601
+ $max_char_length = 300;
602
  $trim = true;
603
  } else {
604
+ $max_char_length = 300 - $additions_length;
605
  $trim = false;
606
  }
607
 
851
  $id = $this->get_the_real_ID();
852
 
853
  if ( $page_on_front || $this->is_front_page_by_id( $id ) ) :
854
+ $title = $this->get_home_page_tagline();
855
  else :
856
  /**
857
  * No need to parse these when generating social description.
905
  *
906
  * @since 2.3.4
907
  * @since 2.8.2 Now no longer escapes excerpt by accident in processing, preventing "too short" output.
908
+ * @since 3.0.4 The default $max_char_length has been increased from 155 to 300.
909
  * @staticvar array $excerpt_cache Holds the excerpt
910
  * @staticvar array $excerptlength_cache Holds the excerpt length
911
  *
914
  * @param int $max_char_length The maximum excerpt char length.
915
  * @return string $excerpt The excerpt, not escaped.
916
  */
917
+ public function generate_excerpt( $page_id, $term = '', $max_char_length = 300 ) {
918
 
919
  static $excerpt_cache = array();
920
  static $excerptlength_cache = array();
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 - 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
@@ -118,6 +118,7 @@ class Generate_Image extends Generate_Url {
118
  /**
119
  * Applies filters 'the_seo_framework_ld_json_breadcrumb_image' : string
120
  * @since 2.7.0
 
121
  * @param string $image The current image.
122
  * @param int $id The page, post, product or term ID.
123
  * @param bool $singular Whether the ID is singular.
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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
118
  /**
119
  * Applies filters 'the_seo_framework_ld_json_breadcrumb_image' : string
120
  * @since 2.7.0
121
+ * TODO deprecate filter and exchange with a suiting name.
122
  * @param string $image The current image.
123
  * @param int $id The page, post, product or term ID.
124
  * @param bool $singular Whether the ID is singular.
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 - 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
@@ -447,7 +447,7 @@ class Generate_Ldjson extends Generate_Image {
447
  $taxonomies = $this->get_hierarchical_taxonomies_as( 'names', \get_post_type( $post_id ) );
448
 
449
  /**
450
- * Applies filters 'the_seo_framework_ld_json_breadcrumb_terms'
451
  *
452
  * @since 3.0.0
453
  * @param array|string $taxonomies The assigned hierarchical taxonomies.
@@ -471,7 +471,7 @@ class Generate_Ldjson extends Generate_Image {
471
  * Applies filter 'the_seo_framework_ld_json_breadcrumb_terms' : array
472
  * @since 2.8.0
473
  *
474
- * @param array $terms The LD+JSON terms that are being used
475
  * @param int $post_id The current Post ID.
476
  * @param string $taxonomy The current taxonomy (either category or product_cat).
477
  */
@@ -865,6 +865,7 @@ class Generate_Ldjson extends Generate_Image {
865
  /**
866
  * Applies filters the_seo_framework_json_breadcrumb_output
867
  * @since 2.4.2
 
868
  */
869
  $filter = (bool) \apply_filters( 'the_seo_framework_json_breadcrumb_output', true );
870
  $option = $this->is_option_checked( 'ld_json_breadcrumbs' );
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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
447
  $taxonomies = $this->get_hierarchical_taxonomies_as( 'names', \get_post_type( $post_id ) );
448
 
449
  /**
450
+ * Applies filters 'the_seo_framework_ld_json_breadcrumb_taxonomies'
451
  *
452
  * @since 3.0.0
453
  * @param array|string $taxonomies The assigned hierarchical taxonomies.
471
  * Applies filter 'the_seo_framework_ld_json_breadcrumb_terms' : array
472
  * @since 2.8.0
473
  *
474
+ * @param array $terms The candidate terms.
475
  * @param int $post_id The current Post ID.
476
  * @param string $taxonomy The current taxonomy (either category or product_cat).
477
  */
865
  /**
866
  * Applies filters the_seo_framework_json_breadcrumb_output
867
  * @since 2.4.2
868
+ * @param bool $output
869
  */
870
  $filter = (bool) \apply_filters( 'the_seo_framework_json_breadcrumb_output', true );
871
  $option = $this->is_option_checked( 'ld_json_breadcrumbs' );
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 - 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
@@ -41,6 +41,87 @@ class Generate_Title extends Generate_Description {
41
  parent::__construct();
42
  }
43
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  /**
45
  * Gets the title. Main function.
46
  * Always use this function for the title unless you're absolutely sure what you're doing.
@@ -584,6 +665,7 @@ class Generate_Title extends Generate_Description {
584
  * Generate the title based on conditions for the home page.
585
  *
586
  * @since 2.3.4
 
587
  * @access private
588
  *
589
  * @param bool $get_custom_field Fetch Title from Custom Fields.
@@ -592,8 +674,8 @@ class Generate_Title extends Generate_Description {
592
  * @param bool $escape Parse Title through saninitation calls.
593
  * @param bool $get_option Whether to fetch the SEO Settings option.
594
  * @return array {
595
- * 'title' => (string) $title : The Generated Title
596
- * 'blogname' => (string) $blogname : The Generated Blogname
597
  * 'add_tagline' => (bool) $add_tagline : Whether to add the tagline
598
  * 'seplocation' => (string) $seplocation : The Separator Location
599
  * }
@@ -601,22 +683,7 @@ class Generate_Title extends Generate_Description {
601
  public function generate_home_title( $get_custom_field = true, $seplocation = '', $deprecated = '', $escape = true, $get_option = true ) {
602
 
603
  $add_tagline = $this->home_page_add_title_tagline();
604
-
605
- /**
606
- * Add tagline or not based on option
607
- *
608
- * @since 2.2.2
609
- */
610
- if ( $add_tagline ) {
611
- /**
612
- * Tagline based on option.
613
- * @since 2.3.8
614
- */
615
- $blogname = $this->get_option( 'homepage_title_tagline' );
616
- $blogname = $blogname ? $blogname : $this->get_blogdescription();
617
- } else {
618
- $blogname = '';
619
- }
620
 
621
  /**
622
  * Render from function
@@ -638,17 +705,17 @@ class Generate_Title extends Generate_Description {
638
  );
639
 
640
  /**
641
- * Applies filters 'the_seo_framework_home_title_args' : array {
642
- * @param string $title : NOTE: This is the blogname
643
- * @param string $blogname : NOTE: This is the tagline.
644
- * @param bool $add_tagline
645
- * @param string $seplocation : 'left' or 'right'
646
- * }
647
  *
648
  * @since 2.8.0
649
  *
650
  * @param array $args
651
- * @param array $defaults
 
 
 
 
 
652
  */
653
  $args = (array) \apply_filters( 'the_seo_framework_home_title_args', array(), $defaults );
654
 
@@ -799,12 +866,15 @@ class Generate_Title extends Generate_Description {
799
  /**
800
  * Gets the archive Title, including filter. Also works in admin.
801
  *
802
- * @NOTE Taken from WordPress core. Altered to work in the Admin area.
 
803
  *
804
  * @since 2.6.0
805
  * @since 2.9.2 : Added WordPress core filter 'get_the_archive_title'
 
 
806
  *
807
- * @param object $term The Term object.
808
  * @param array $args The Title arguments.
809
  * @return string The Archive Title, not escaped.
810
  */
@@ -904,11 +974,12 @@ class Generate_Title extends Generate_Description {
904
  /**
905
  * Filters the archive title.
906
  *
907
- * @since WordPress Core 4.1.0
908
  *
909
  * @param string $title Archive title to be displayed.
 
910
  */
911
- return \apply_filters( 'get_the_archive_title', $title );
912
  }
913
 
914
  /**
@@ -932,7 +1003,7 @@ class Generate_Title extends Generate_Description {
932
  /**
933
  * Filter the category archive page title.
934
  *
935
- * @since 2.0.10 WP CORE
936
  *
937
  * @param string $term_name Category name for archive being displayed.
938
  */
@@ -941,7 +1012,7 @@ class Generate_Title extends Generate_Description {
941
  /**
942
  * Filter the tag archive page title.
943
  *
944
- * @since 2.3.0 WP CORE
945
  *
946
  * @param string $term_name Tag name for archive being displayed.
947
  */
@@ -950,7 +1021,7 @@ class Generate_Title extends Generate_Description {
950
  /**
951
  * Filter the custom taxonomy archive page title.
952
  *
953
- * @since 3.1.0 WP CORE
954
  *
955
  * @param string $term_name Term name for archive being displayed.
956
  */
@@ -1376,14 +1447,27 @@ class Generate_Title extends Generate_Description {
1376
  return $title;
1377
  }
1378
 
 
 
 
 
 
 
 
 
 
 
 
 
1379
  /**
1380
  * Determines whether to add home page tagline.
1381
  *
1382
  * @since 2.6.0
 
1383
  *
1384
  * @return bool
1385
  */
1386
  public function home_page_add_title_tagline() {
1387
- return $this->is_option_checked( 'homepage_tagline' );
1388
  }
1389
  }
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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
41
  parent::__construct();
42
  }
43
 
44
+ /**
45
+ * Returns the Twitter meta title. Falls back to Open Graph title.
46
+ *
47
+ * @since 3.0.4
48
+ * @uses $this->get_open_graph_title()
49
+ *
50
+ * @param int|null $id The post or term ID. Falls back to queried ID.
51
+ * @param bool $escape Whether to escape the title.
52
+ * @return string Twitter Title.
53
+ */
54
+ public function get_twitter_title( $id = null, $escape = true ) {
55
+
56
+ if ( is_null( $id ) )
57
+ $id = $this->get_the_real_ID();
58
+
59
+ $title = $this->get_custom_field( '_twitter_title', $id )
60
+ ?: $this->get_open_graph_title( $id, false );
61
+
62
+ return $escape ? $this->escape_title( $title ) : $title;
63
+ }
64
+
65
+ /**
66
+ * Returns the Open Graph meta title. Falls back to meta title.
67
+ *
68
+ * @since 3.0.4
69
+ * @uses $this->get_generated_open_graph_title()
70
+ *
71
+ * @param int|null $id The post or term ID. Falls back to queried ID.
72
+ * @param bool $escape Whether to escape the title.
73
+ * @return string Open Graph Title.
74
+ */
75
+ public function get_open_graph_title( $id = null, $escape = true ) {
76
+
77
+ if ( is_null( $id ) )
78
+ $id = $this->get_the_real_ID();
79
+
80
+ $title = $this->get_custom_field( '_open_graph_title', $id )
81
+ ?: $this->get_generated_open_graph_title( $id, false );
82
+
83
+ return $escape ? $this->escape_title( $title ) : $title;
84
+ }
85
+
86
+ /**
87
+ * Returns the autogenerated open graph meta title. Falls back to meta title.
88
+ *
89
+ * @since 3.0.4
90
+ * @uses $this->get_generated_open_graph_title()
91
+ *
92
+ * @param int|null $id The post or term ID. Falls back to queried ID.
93
+ * @param bool $escape Whether to escape the title.
94
+ * @return string Autogenerated Twitter Title.
95
+ */
96
+ public function get_generated_twitter_title( $id = null, $escape = true ) {
97
+ return $this->get_generated_open_graph_title( $id, $escape );
98
+ }
99
+
100
+ /**
101
+ * Returns the autogenerated open graph meta title. Falls back to meta title.
102
+ *
103
+ * @since 3.0.4
104
+ * @uses $this->build_title()
105
+ * @staticvar array $cache
106
+ *
107
+ * @param int|null $id The post or term ID. Falls back to queried ID.
108
+ * @param bool $escape Whether to escape the title.
109
+ * @return string Autogenerated Open Graph Title.
110
+ */
111
+ public function get_generated_open_graph_title( $id = null, $escape = true ) {
112
+
113
+ if ( is_null( $id ) )
114
+ $id = $this->get_the_real_ID();
115
+
116
+ static $cache = array();
117
+
118
+ $title = isset( $cache[ $id ] )
119
+ ? $cache[ $id ]
120
+ : $cache[ $id ] = $this->build_title( '', '', array( 'meta' => true, 'term_id' => $id, 'escape' => false ) );
121
+
122
+ return $escape ? $this->escape_title( $title ) : $title;
123
+ }
124
+
125
  /**
126
  * Gets the title. Main function.
127
  * Always use this function for the title unless you're absolutely sure what you're doing.
665
  * Generate the title based on conditions for the home page.
666
  *
667
  * @since 2.3.4
668
+ * @since 2.3.8 Now checks tagline option.
669
  * @access private
670
  *
671
  * @param bool $get_custom_field Fetch Title from Custom Fields.
674
  * @param bool $escape Parse Title through saninitation calls.
675
  * @param bool $get_option Whether to fetch the SEO Settings option.
676
  * @return array {
677
+ * 'title' => (string) $title : The Generated "Title"
678
+ * 'blogname' => (string) $blogname : The Generated "Blogname"
679
  * 'add_tagline' => (bool) $add_tagline : Whether to add the tagline
680
  * 'seplocation' => (string) $seplocation : The Separator Location
681
  * }
683
  public function generate_home_title( $get_custom_field = true, $seplocation = '', $deprecated = '', $escape = true, $get_option = true ) {
684
 
685
  $add_tagline = $this->home_page_add_title_tagline();
686
+ $blogname = $add_tagline ? $this->get_home_page_tagline() : '';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
687
 
688
  /**
689
  * Render from function
705
  );
706
 
707
  /**
708
+ * Applies filters 'the_seo_framework_home_title_args'
 
 
 
 
 
709
  *
710
  * @since 2.8.0
711
  *
712
  * @param array $args
713
+ * @param array $defaults : {
714
+ * string $title : NOTE: This is the blogname or homepage title option.
715
+ * string $blogname : NOTE: This is the tagline.
716
+ * bool $add_tagline
717
+ * string $seplocation : 'left' or 'right'
718
+ * }
719
  */
720
  $args = (array) \apply_filters( 'the_seo_framework_home_title_args', array(), $defaults );
721
 
866
  /**
867
  * Gets the archive Title, including filter. Also works in admin.
868
  *
869
+ * @NOTE Taken from WordPress core. Altered to work for metadata.
870
+ * @see WP Core get_the_archive_title()
871
  *
872
  * @since 2.6.0
873
  * @since 2.9.2 : Added WordPress core filter 'get_the_archive_title'
874
+ * @since 3.0.4 : 1. Removed WordPress core filter 'get_the_archive_title'
875
+ * 2. Added filter 'the_seo_framework_generated_archive_title'
876
  *
877
+ * @param \WP_Term|null $term The Term object.
878
  * @param array $args The Title arguments.
879
  * @return string The Archive Title, not escaped.
880
  */
974
  /**
975
  * Filters the archive title.
976
  *
977
+ * @since 3.0.4
978
  *
979
  * @param string $title Archive title to be displayed.
980
+ * @param \WP_Term $term The term object.
981
  */
982
+ return \apply_filters( 'the_seo_framework_generated_archive_title', $title, $term );
983
  }
984
 
985
  /**
1003
  /**
1004
  * Filter the category archive page title.
1005
  *
1006
+ * @since WP Core 2.0.10
1007
  *
1008
  * @param string $term_name Category name for archive being displayed.
1009
  */
1012
  /**
1013
  * Filter the tag archive page title.
1014
  *
1015
+ * @since WP Core 2.3.0
1016
  *
1017
  * @param string $term_name Tag name for archive being displayed.
1018
  */
1021
  /**
1022
  * Filter the custom taxonomy archive page title.
1023
  *
1024
+ * @since WP Core 3.1.0
1025
  *
1026
  * @param string $term_name Term name for archive being displayed.
1027
  */
1447
  return $title;
1448
  }
1449
 
1450
+ /**
1451
+ * Returns the home page tagline from option or bloginfo, when set.
1452
+ *
1453
+ * @since 3.0.4
1454
+ * @uses $this->get_blogdescription(), this method already trims.
1455
+ *
1456
+ * @return string The trimmed tagline.
1457
+ */
1458
+ public function get_home_page_tagline() {
1459
+ return trim( $this->get_option( 'homepage_title_tagline' ) ) ?: $this->get_blogdescription() ?: '';
1460
+ }
1461
+
1462
  /**
1463
  * Determines whether to add home page tagline.
1464
  *
1465
  * @since 2.6.0
1466
+ * @since 3.0.4 Now checks for custom tagline or blogname existence.
1467
  *
1468
  * @return bool
1469
  */
1470
  public function home_page_add_title_tagline() {
1471
+ return $this->is_option_checked( 'homepage_tagline' ) && $this->get_home_page_tagline();
1472
  }
1473
  }
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 - 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
@@ -374,14 +374,12 @@ class Generate_Url extends Generate_Title {
374
  case 'day' :
375
  $_day = \get_query_var( 'day' );
376
  $_paginate = $_paginate && $_day == $day;
377
- $_get = 'month';
378
- // Continue switch.
379
 
380
  case 'month' :
381
  $_month = \get_query_var( 'monthnum' );
382
  $_paginate = $_paginate && $_month == $month;
383
- $_get = 'year';
384
- // Continue switch.
385
 
386
  case 'year' :
387
  $_year = \get_query_var( 'year' );
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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
374
  case 'day' :
375
  $_day = \get_query_var( 'day' );
376
  $_paginate = $_paginate && $_day == $day;
377
+ // No break. Get month too.
 
378
 
379
  case 'month' :
380
  $_month = \get_query_var( 'monthnum' );
381
  $_paginate = $_paginate && $_month == $month;
382
+ // No break. Get year too.
 
383
 
384
  case 'year' :
385
  $_year = \get_query_var( 'year' );
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 - 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
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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 - 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
@@ -79,6 +79,9 @@ class Init extends Query {
79
  /**
80
  * Runs the plugin on the front-end.
81
  *
 
 
 
82
  * @since 1.0.0
83
  * @since 2.8.0 Silently deprecated. Displaying legacy roots.
84
  * @deprecated
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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
79
  /**
80
  * Runs the plugin on the front-end.
81
  *
82
+ * To overwrite any of the filters, use (n>0):
83
+ * `add_action( 'init', callback, n );`
84
+ *
85
  * @since 1.0.0
86
  * @since 2.8.0 Silently deprecated. Displaying legacy roots.
87
  * @deprecated
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 - 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
@@ -281,7 +281,7 @@ class Inpost extends Profile {
281
  $is_term = false;
282
 
283
  // Args are passed.
284
- if ( is_array( $args ) && isset( $args['args'] ) ) {
285
  $args_split = $args['args'];
286
 
287
  //* The post type callback arg (translated)
@@ -418,7 +418,9 @@ class Inpost extends Profile {
418
  * Do not use. It will take a little too much time to perfect this.
419
  *
420
  * @since 2.9.0
 
421
  * @access private
 
422
  * @ignore
423
  * @todo Remove and refactor caller.
424
  *
@@ -426,9 +428,20 @@ class Inpost extends Profile {
426
  * @param string $doctitle_placeholder. Passed by reference.
427
  * @param string $desc_len_parsed. Passed by reference.
428
  * @param string $description_placeholder. Passed by reference.
 
429
  */
430
  public function _get_inpost_general_tab_vars( &$tit_len_parsed, &$doctitle_placeholder, &$desc_len_parsed, &$description_placeholder ) {
431
 
 
 
 
 
 
 
 
 
 
 
432
  $post_id = $this->get_the_real_ID();
433
  $is_static_frontpage = $this->is_static_frontpage( $post_id );
434
 
@@ -473,7 +486,7 @@ class Inpost extends Profile {
473
  );
474
  }
475
  $generated_doctitle = $this->title( '', '', '', $generated_doctitle_args );
476
- $generated_description = $this->generate_description_from_id( $generated_description_args );
477
 
478
  /**
479
  * Start Title vars
@@ -551,5 +564,7 @@ class Inpost extends Profile {
551
  */
552
  $doctitle_placeholder = $generated_doctitle;
553
  $description_placeholder = $generated_description;
 
 
554
  }
555
  }
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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
281
  $is_term = false;
282
 
283
  // Args are passed.
284
+ if ( isset( $args['args'] ) ) {
285
  $args_split = $args['args'];
286
 
287
  //* The post type callback arg (translated)
418
  * Do not use. It will take a little too much time to perfect this.
419
  *
420
  * @since 2.9.0
421
+ * @since 3.0.4 Added caching.
422
  * @access private
423
+ * @staticvar $cache
424
  * @ignore
425
  * @todo Remove and refactor caller.
426
  *
428
  * @param string $doctitle_placeholder. Passed by reference.
429
  * @param string $desc_len_parsed. Passed by reference.
430
  * @param string $description_placeholder. Passed by reference.
431
+ * @return void
432
  */
433
  public function _get_inpost_general_tab_vars( &$tit_len_parsed, &$doctitle_placeholder, &$desc_len_parsed, &$description_placeholder ) {
434
 
435
+ static $cache = array();
436
+
437
+ if ( ! empty( $cache ) ) {
438
+ //! Overwrites variables passed by reference via variable variables.
439
+ foreach ( $cache as $k => $v ) {
440
+ $$k = $v;
441
+ }
442
+ return;
443
+ }
444
+
445
  $post_id = $this->get_the_real_ID();
446
  $is_static_frontpage = $this->is_static_frontpage( $post_id );
447
 
486
  );
487
  }
488
  $generated_doctitle = $this->title( '', '', '', $generated_doctitle_args );
489
+ $generated_description = $this->generate_description( '', $generated_description_args );
490
 
491
  /**
492
  * Start Title vars
564
  */
565
  $doctitle_placeholder = $generated_doctitle;
566
  $description_placeholder = $generated_description;
567
+
568
+ $cache = compact( 'tit_len_parsed', 'doctitle_placeholder', 'desc_len_parsed', 'description_placeholder' );
569
  }
570
  }
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 - 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
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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 - 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
@@ -48,13 +48,13 @@ class Metaboxes extends Site_Options {
48
  *
49
  * @param string $id The Nav Tab ID
50
  * @param array $tabs the tab content {
51
- * $tabs = tab ID key = array(
52
- * $tabs['name'] => tab name
53
- * $tabs['callback'] => string|array callback function
54
- * $tabs['dashicon'] => string Dashicon
55
- * $tabs['args'] => mixed optional callback function args
56
- * )
57
- * }
58
  * @param string $version the The SEO Framework version for debugging. May be emptied.
59
  * @param bool $use_tabs Whether to output tabs, only works when $tabs is greater than 1.
60
  */
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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
48
  *
49
  * @param string $id The Nav Tab ID
50
  * @param array $tabs the tab content {
51
+ * $tabs = tab ID key = array(
52
+ * $tabs['name'] => tab name
53
+ * $tabs['callback'] => string|array callback function
54
+ * $tabs['dashicon'] => string Dashicon
55
+ * $tabs['args'] => mixed optional callback function args
56
+ * )
57
+ * }
58
  * @param string $version the The SEO Framework version for debugging. May be emptied.
59
  * @param bool $use_tabs Whether to output tabs, only works when $tabs is greater than 1.
60
  */
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 - 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
@@ -98,17 +98,21 @@ class Post_Data extends Detect {
98
  return;
99
 
100
  $defaults = array(
101
- '_genesis_title' => '',
102
- '_genesis_description' => '',
103
- '_genesis_canonical_uri' => '',
104
- 'redirect' => '', // Will be displayed in custom fields when set...
105
- '_social_image_url' => '',
106
- '_social_image_id' => 0,
107
- '_genesis_noindex' => 0,
108
- '_genesis_nofollow' => 0,
109
- '_genesis_noarchive' => 0,
110
- 'exclude_local_search' => 0, // Will be displayed in custom fields when set...
111
- 'exclude_from_archive' => 0, // Will be displayed in custom fields when set...
 
 
 
 
112
  );
113
 
114
  /**
@@ -120,10 +124,14 @@ class Post_Data extends Detect {
120
  foreach ( (array) $data as $key => $value ) :
121
  switch ( $key ) :
122
  case '_genesis_title' :
 
 
123
  $data[ $key ] = $this->s_title_raw( $value );
124
  continue 2;
125
 
126
  case '_genesis_description' :
 
 
127
  $data[ $key ] = $this->s_description_raw( $value );
128
  continue 2;
129
 
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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
98
  return;
99
 
100
  $defaults = array(
101
+ '_genesis_title' => '',
102
+ '_genesis_description' => '',
103
+ '_genesis_canonical_uri' => '',
104
+ 'redirect' => '', // Will be displayed in custom fields when set...
105
+ '_social_image_url' => '',
106
+ '_social_image_id' => 0,
107
+ '_genesis_noindex' => 0,
108
+ '_genesis_nofollow' => 0,
109
+ '_genesis_noarchive' => 0,
110
+ 'exclude_local_search' => 0, // Will be displayed in custom fields when set...
111
+ 'exclude_from_archive' => 0, // Will be displayed in custom fields when set...
112
+ '_open_graph_title' => '',
113
+ '_open_graph_description' => '',
114
+ '_twitter_title' => '',
115
+ '_twitter_description' => '',
116
  );
117
 
118
  /**
124
  foreach ( (array) $data as $key => $value ) :
125
  switch ( $key ) :
126
  case '_genesis_title' :
127
+ case '_open_graph_title' :
128
+ case '_twitter_title' :
129
  $data[ $key ] = $this->s_title_raw( $value );
130
  continue 2;
131
 
132
  case '_genesis_description' :
133
+ case '_open_graph_description' :
134
+ case '_twitter_description' :
135
  $data[ $key ] = $this->s_description_raw( $value );
136
  continue 2;
137
 
inc/classes/profile.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
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
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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 - 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
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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/render.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
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
@@ -230,7 +230,8 @@ class Render extends Admin_Init {
230
  * Renders og:description meta tag
231
  *
232
  * @since 1.3.0
233
- * @uses $this->description_from_cache()
 
234
  *
235
  * @return string The Open Graph description meta tag.
236
  */
@@ -244,7 +245,7 @@ class Render extends Admin_Init {
244
  * @since 2.3.0
245
  * @since 2.7.0 Added output within filter.
246
  */
247
- $description = (string) \apply_filters( 'the_seo_framework_ogdescription_output', $this->description_from_cache( true ), $this->get_the_real_ID() );
248
 
249
  if ( $description )
250
  return '<meta property="og:description" content="' . \esc_attr( $description ) . '" />' . "\r\n";
@@ -280,8 +281,9 @@ class Render extends Admin_Init {
280
  /**
281
  * Renders the Open Graph title meta tag.
282
  *
283
- * @uses $this->title_from_cache()
284
  * @since 2.0.3
 
 
285
  *
286
  * @return string The Open Graph title meta tag.
287
  */
@@ -295,7 +297,7 @@ class Render extends Admin_Init {
295
  * @since 2.3.0
296
  * @since 2.7.0 Added output within filter.
297
  */
298
- $title = (string) \apply_filters( 'the_seo_framework_ogtitle_output', $this->title_from_cache( '', '', '', true ), $this->get_the_real_ID() );
299
 
300
  if ( $title )
301
  return '<meta property="og:title" content="' . \esc_attr( $title ) . '" />' . "\r\n";
@@ -567,8 +569,9 @@ class Render extends Admin_Init {
567
  /**
568
  * Renders Twitter Title meta tag.
569
  *
570
- * @uses $this->title_from_cache()
571
  * @since 2.2.2
 
572
  *
573
  * @return string The Twitter Title meta tag.
574
  */
@@ -582,7 +585,7 @@ class Render extends Admin_Init {
582
  * @since 2.3.0
583
  * @since 2.7.0 Added output within filter.
584
  */
585
- $title = (string) \apply_filters( 'the_seo_framework_twittertitle_output', $this->title_from_cache( '', '', '', true ), $this->get_the_real_ID() );
586
 
587
  if ( $title )
588
  return '<meta name="twitter:title" content="' . \esc_attr( $title ) . '" />' . "\r\n";
@@ -593,8 +596,9 @@ class Render extends Admin_Init {
593
  /**
594
  * Renders Twitter Description meta tag.
595
  *
596
- * @uses $this->description_from_cache()
597
  * @since 2.2.2
 
 
598
  *
599
  * @return string The Twitter Descritpion meta tag.
600
  */
@@ -608,7 +612,7 @@ class Render extends Admin_Init {
608
  * @since 2.3.0
609
  * @since 2.7.0 Added output within filter.
610
  */
611
- $description = (string) \apply_filters( 'the_seo_framework_twitterdescription_output', $this->description_from_cache( true ), $this->get_the_real_ID() );
612
 
613
  if ( $description )
614
  return '<meta name="twitter:description" content="' . \esc_attr( $description ) . '" />' . "\r\n";
@@ -1159,7 +1163,7 @@ class Render extends Admin_Init {
1159
  }
1160
 
1161
  /**
1162
- * Determines whether we can use Open Graph tags.
1163
  *
1164
  * @since 2.6.0
1165
  * @staticvar bool $cache
@@ -1177,7 +1181,7 @@ class Render extends Admin_Init {
1177
  }
1178
 
1179
  /**
1180
- * Determines whether we can use Facebook tags.
1181
  *
1182
  * @since 2.6.0
1183
  * @staticvar bool $cache
@@ -1195,7 +1199,7 @@ class Render extends Admin_Init {
1195
  }
1196
 
1197
  /**
1198
- * Determines whether we can use Twitter tags.
1199
  *
1200
  * @since 2.6.0
1201
  * @since 2.8.2 : Now also considers Twitter card type output.
@@ -1214,7 +1218,7 @@ class Render extends Admin_Init {
1214
  }
1215
 
1216
  /**
1217
- * Determines whether we can use Google+ tags.
1218
  *
1219
  * @since 2.6.0
1220
  * @staticvar bool $cache
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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
230
  * Renders og:description meta tag
231
  *
232
  * @since 1.3.0
233
+ * @since 3.0.4 No longer uses $this->description_from_cache()
234
+ * @uses $this->get_open_graph_title()
235
  *
236
  * @return string The Open Graph description meta tag.
237
  */
245
  * @since 2.3.0
246
  * @since 2.7.0 Added output within filter.
247
  */
248
+ $description = (string) \apply_filters( 'the_seo_framework_ogdescription_output', $this->get_open_graph_description(), $this->get_the_real_ID() );
249
 
250
  if ( $description )
251
  return '<meta property="og:description" content="' . \esc_attr( $description ) . '" />' . "\r\n";
281
  /**
282
  * Renders the Open Graph title meta tag.
283
  *
 
284
  * @since 2.0.3
285
+ * @since 3.0.4 No longer uses $this->title_from_cache()
286
+ * @uses $this->get_open_graph_title()
287
  *
288
  * @return string The Open Graph title meta tag.
289
  */
297
  * @since 2.3.0
298
  * @since 2.7.0 Added output within filter.
299
  */
300
+ $title = (string) \apply_filters( 'the_seo_framework_ogtitle_output', $this->get_open_graph_title(), $this->get_the_real_ID() );
301
 
302
  if ( $title )
303
  return '<meta property="og:title" content="' . \esc_attr( $title ) . '" />' . "\r\n";
569
  /**
570
  * Renders Twitter Title meta tag.
571
  *
572
+ * @uses $this->get_twitter_title()
573
  * @since 2.2.2
574
+ * @since 3.0.4 No longer uses $this->title_from_cache()
575
  *
576
  * @return string The Twitter Title meta tag.
577
  */
585
  * @since 2.3.0
586
  * @since 2.7.0 Added output within filter.
587
  */
588
+ $title = (string) \apply_filters( 'the_seo_framework_twittertitle_output', $this->get_twitter_title(), $this->get_the_real_ID() );
589
 
590
  if ( $title )
591
  return '<meta name="twitter:title" content="' . \esc_attr( $title ) . '" />' . "\r\n";
596
  /**
597
  * Renders Twitter Description meta tag.
598
  *
 
599
  * @since 2.2.2
600
+ * @since 3.0.4 No longer uses $this->description_from_cache()
601
+ * @uses $this->get_twitter_description()
602
  *
603
  * @return string The Twitter Descritpion meta tag.
604
  */
612
  * @since 2.3.0
613
  * @since 2.7.0 Added output within filter.
614
  */
615
+ $description = (string) \apply_filters( 'the_seo_framework_twitterdescription_output', $this->get_twitter_description(), $this->get_the_real_ID() );
616
 
617
  if ( $description )
618
  return '<meta name="twitter:description" content="' . \esc_attr( $description ) . '" />' . "\r\n";
1163
  }
1164
 
1165
  /**
1166
+ * Determines whether we can use Open Graph tags on the front-end.
1167
  *
1168
  * @since 2.6.0
1169
  * @staticvar bool $cache
1181
  }
1182
 
1183
  /**
1184
+ * Determines whether we can use Facebook tags on the front-end.
1185
  *
1186
  * @since 2.6.0
1187
  * @staticvar bool $cache
1199
  }
1200
 
1201
  /**
1202
+ * Determines whether we can use Twitter tags on the front-end.
1203
  *
1204
  * @since 2.6.0
1205
  * @since 2.8.2 : Now also considers Twitter card type output.
1218
  }
1219
 
1220
  /**
1221
+ * Determines whether we can use Google+ tags on the front-end.
1222
  *
1223
  * @since 2.6.0
1224
  * @staticvar bool $cache
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 - 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
@@ -932,14 +932,15 @@ class Sanitize extends Admin_Pages {
932
  * @return string 'in_query' or 'post_query'
933
  */
934
  public function s_alter_query_type( $new_value ) {
935
-
936
  switch ( $new_value ) {
937
  case 'in_query' :
938
  case 'post_query' :
939
  return (string) $new_value;
 
940
 
941
  default :
942
  return 'in_query';
 
943
  }
944
  }
945
 
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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
932
  * @return string 'in_query' or 'post_query'
933
  */
934
  public function s_alter_query_type( $new_value ) {
 
935
  switch ( $new_value ) {
936
  case 'in_query' :
937
  case 'post_query' :
938
  return (string) $new_value;
939
+ break;
940
 
941
  default :
942
  return 'in_query';
943
+ break;
944
  }
945
  }
946
 
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 - 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
@@ -122,7 +122,7 @@ class Site_Options extends Sanitize {
122
  'display_seo_bar_metabox' => 0, // SEO Bar post SEO Settings.
123
 
124
  'display_pixel_counter' => 1, // Pixel counter.
125
- 'display_character_counter' => 0, // Character counter.
126
 
127
  // General. Canonical.
128
  'canonical_scheme' => 'automatic', // Canonical URL scheme.
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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
122
  'display_seo_bar_metabox' => 0, // SEO Bar post SEO Settings.
123
 
124
  'display_pixel_counter' => 1, // Pixel counter.
125
+ 'display_character_counter' => 1, // Character counter.
126
 
127
  // General. Canonical.
128
  'canonical_scheme' => 'automatic', // Canonical URL scheme.
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 - 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
@@ -541,6 +541,7 @@ class Sitemaps extends Metaboxes {
541
  * @since 2.2.9
542
  * @since 2.8.0 Now adjusts memory limit when possible.
543
  * @since 2.9.3 No longer crashes on WordPress sites below WP 4.6.
 
544
  *
545
  * @return string The sitemap content.
546
  */
@@ -552,20 +553,6 @@ class Sitemaps extends Metaboxes {
552
 
553
  $content = '';
554
 
555
- /**
556
- * Applies filters the_seo_framework_sitemap_exclude_ids : array of id's
557
- *
558
- * @since 2.5.2
559
- * @since 2.8.0 : No longer accepts '0' as entry.
560
- */
561
- $excluded = (array) \apply_filters( 'the_seo_framework_sitemap_exclude_ids', array() );
562
-
563
- if ( empty( $excluded ) ) {
564
- $excluded = '';
565
- } else {
566
- $excluded = array_flip( $excluded );
567
- }
568
-
569
  /**
570
  * Maximum pages and posts to fetch.
571
  * A total of 2100, consisting of 3 times $max_posts
@@ -594,9 +581,7 @@ class Sitemaps extends Metaboxes {
594
  * We can't get specific on the home page, unfortunately.
595
  */
596
  $sitemaps_modified = $this->is_option_checked( 'sitemaps_modified' );
597
- if ( $sitemaps_modified ) {
598
- $page_lastmod = $post_lastmod = $home_lastmod = true;
599
- }
600
 
601
  /**
602
  * Generation time output
@@ -655,21 +640,28 @@ class Sitemaps extends Metaboxes {
655
  unset( $latest_pages[ $key_on_front ] );
656
  }
657
 
658
- //* Render frontpage.
659
- if ( '' === $excluded || empty( $excluded[ $id_on_front ] ) ) :
660
- //* Fetch the noindex option from the page and homepage.
661
- $indexed = ! $this->get_option( 'homepage_noindex' ) && ( ! $id_on_front || ! $this->get_custom_field( '_genesis_noindex', $id_on_front ) );
662
-
663
- //* Continue if indexed.
664
- if ( $indexed ) {
 
 
 
 
 
 
 
 
665
  $content .= "\t<url>\n";
666
- $content .= "\t\t<loc>" . $this->get_homepage_permalink() . "</loc>\n";
667
 
668
  // Keep it consistent. Only parse if page_lastmod is true.
669
  if ( $home_lastmod ) {
670
  if ( $page_on_front ) {
671
- $front_object = \get_post( $id_on_front );
672
- $front_modified_gmt = isset( $front_object->post_modified_gmt ) ? $front_object->post_modified_gmt : '0000-00-00 00:00:00';
673
  } else {
674
  $args = array(
675
  'numberposts' => 1,
@@ -680,10 +672,9 @@ class Sitemaps extends Metaboxes {
680
  'order' => 'DESC',
681
  'offset' => 0,
682
  );
683
- $post = \wp_get_recent_posts( $args, OBJECT );
684
- $front_object = isset( $post[0] ) ? $post[0] : null;
685
- unset( $post );
686
- $front_modified_gmt = isset( $front_object->post_date_gmt ) ? $front_object->post_date_gmt : '0000-00-00 00:00:00';
687
  }
688
 
689
  if ( '0000-00-00 00:00:00' !== $front_modified_gmt )
@@ -693,27 +684,29 @@ class Sitemaps extends Metaboxes {
693
  $content .= "\t\t<priority>1.0</priority>\n";
694
  $content .= "\t</url>\n";
695
  }
696
- endif;
 
 
697
 
698
- //* Render the page for posts.
699
  if ( $page_on_front && $page_for_posts_id ) :
700
-
701
  //* Remove ID for blog from list and add frontpage to list.
702
  if ( false !== $key_for_posts = array_search( $page_for_posts_id, $latest_pages, true ) ) {
703
  unset( $latest_pages[ $key_for_posts ] );
704
  }
705
 
706
- if ( '' === $excluded || empty( $excluded[ $page_for_posts_id ] ) ) :
707
- //* Fetch the noindex option from the page and homepage.
708
- $indexed = ! $this->get_custom_field( '_genesis_noindex', $page_for_posts_id );
709
- $page = \get_post( $page_for_posts_id );
710
 
711
- //* Continue if indexed.
712
- if ( $indexed && isset( $page->ID ) ) {
 
713
  $content .= "\t<url>\n";
714
- $content .= "\t\t<loc>" . $this->create_canonical_url( array( 'id' => $page->ID ) ) . "</loc>\n";
715
 
716
- // Keep it consistent. Only parse if page_lastmod is true.
717
  if ( $page_lastmod ) {
718
  $args = array(
719
  'numberposts' => 1,
@@ -724,10 +717,10 @@ class Sitemaps extends Metaboxes {
724
  'order' => 'DESC',
725
  'offset' => 0,
726
  );
727
- $post = \wp_get_recent_posts( $args, OBJECT );
728
- $lastest_post = isset( $post[0] ) ? $post[0] : null;
729
  $latest_post_published_gmt = isset( $lastest_post->post_date_gmt ) ? $lastest_post->post_date_gmt : '0000-00-00 00:00:00';
730
- $page_for_posts_modified_gmt = $page->post_modified_gmt;
731
 
732
  if ( strtotime( $latest_post_published_gmt ) > strtotime( $page_for_posts_modified_gmt ) ) {
733
  $page_modified_gmt = $latest_post_published_gmt;
@@ -742,44 +735,38 @@ class Sitemaps extends Metaboxes {
742
  $content .= "\t\t<priority>0.9</priority>\n";
743
  $content .= "\t</url>\n";
744
  }
745
- endif;
746
 
 
 
747
  endif;
748
 
749
- /**
750
- * This can be heavy.
751
- */
752
  foreach ( $latest_pages as $page_id ) :
753
  $page = \get_post( $page_id );
 
 
754
 
755
- if ( isset( $page->ID ) ) :
756
- $page_id = $page->ID;
757
- if ( '' === $excluded || empty( $excluded[ $page_id ] ) ) {
758
- //* Fetch the noindex option, per page.
759
- $indexed = ! $this->get_custom_field( '_genesis_noindex', $page_id );
760
 
761
- //* Continue if indexed.
762
- if ( $indexed ) {
763
- $content .= "\t<url>\n";
764
- $content .= "\t\t<loc>" . $this->create_canonical_url( array( 'id' => $page_id ) ) . "</loc>\n";
765
 
766
- // Keep it consistent. Only parse if page_lastmod is true.
767
- if ( $page_lastmod ) {
768
- $page_modified_gmt = $page->post_modified_gmt;
769
 
770
- if ( '0000-00-00 00:00:00' !== $page_modified_gmt )
771
- $content .= "\t\t<lastmod>" . $this->gmt2date( $timestamp_format, $page_modified_gmt ) . "</lastmod>\n";
772
- }
773
 
774
- $content .= "\t\t<priority>0.9</priority>\n";
775
- $content .= "\t</url>\n";
776
- }
777
- }
778
- endif;
779
  endforeach;
780
 
781
  //* Free memory.
782
- unset( $latest_pages );
783
  endif;
784
 
785
  if ( $totalposts ) {
@@ -842,43 +829,37 @@ class Sitemaps extends Metaboxes {
842
  */
843
  foreach ( $latest_posts as $post_id ) :
844
  $post = \get_post( $post_id );
 
 
845
 
846
- if ( isset( $post->ID ) ) :
847
- $post_id = $post->ID;
848
- if ( '' === $excluded || empty( $excluded[ $post_id ] ) ) {
849
- //* Fetch the noindex option, per page.
850
- $indexed = ! $this->get_custom_field( '_genesis_noindex', $post_id );
851
-
852
- //* Continue if indexed
853
- if ( $indexed ) {
854
 
855
- $content .= "\t<url>\n";
856
- // No need to use static vars
857
- $content .= "\t\t<loc>" . $this->create_canonical_url( array( 'id' => $post_id ) ) . "</loc>\n";
858
 
859
- // Keep it consistent. Only parse if page_lastmod is true.
860
- if ( $post_lastmod ) {
861
- $post_modified_gmt = $post->post_modified_gmt;
862
 
863
- if ( '0000-00-00 00:00:00' !== $post_modified_gmt )
864
- $content .= "\t\t<lastmod>" . $this->gmt2date( $timestamp_format, $post_modified_gmt ) . "</lastmod>\n";
865
- }
866
 
867
- $content .= "\t\t<priority>" . number_format( $priority, 1 ) . "</priority>\n";
868
- $content .= "\t</url>\n";
869
 
870
- // Lower the priority for the next pass.
871
- $priority = $priority - $prioritydiff;
872
 
873
- // Cast away negative numbers.
874
- $priority = $priority <= 0 ? 0 : (float) $priority;
875
- }
876
- }
877
- endif;
878
  endforeach;
879
 
880
  //* Free memory.
881
- unset( $latest_posts );
882
  endif;
883
 
884
  if ( $total_cpt_posts ) :
@@ -956,48 +937,38 @@ class Sitemaps extends Metaboxes {
956
  * This can be heavy.
957
  */
958
  foreach ( $latest_cpt_posts as $ctp_post_id ) :
959
-
960
  $ctp_post = \get_post( $ctp_post_id );
 
 
961
 
962
- if ( isset( $ctp_post->ID ) ) :
963
- $cpt_id = $ctp_post->ID;
964
-
965
- if ( '' === $excluded || empty( $excluded[ $cpt_id ] ) ) {
966
-
967
- //* Fetch the noindex option, per page.
968
- $indexed = ! $this->get_custom_field( '_genesis_noindex', $cpt_id );
969
 
970
- //* Continue if indexed
971
- if ( $indexed ) {
972
-
973
- $content .= "\t<url>\n";
974
- //* No need to use static vars
975
- $content .= "\t\t<loc>" . $this->create_canonical_url( array( 'id' => $cpt_id ) ) . "</loc>\n";
976
-
977
- //* Keep it consistent. Only parse if page_lastmod is true.
978
- if ( $post_lastmod ) {
979
- $cpt_modified_gmt = $ctp_post->post_modified_gmt;
980
-
981
- //* Some CPT don't set modified time.
982
- if ( '0000-00-00 00:00:00' !== $cpt_modified_gmt )
983
- $content .= "\t\t<lastmod>" . $this->gmt2date( $timestamp_format, $cpt_modified_gmt ) . "</lastmod>\n";
984
- }
985
 
986
- $content .= "\t\t<priority>" . number_format( $priority_cpt, 1 ) . "</priority>\n";
987
- $content .= "\t</url>\n";
988
 
989
- // Lower the priority for the next pass.
990
- $priority_cpt = $priority_cpt - $prioritydiff_cpt;
991
 
992
- // Cast away negative numbers.
993
- $priority_cpt = $priority_cpt <= 0 ? 0 : (float) $priority_cpt;
994
- }
995
- }
996
- endif;
997
  endforeach;
998
 
999
  //* Free memory.
1000
- unset( $latest_cpt_posts );
1001
  endif;
1002
 
1003
  /**
@@ -1061,6 +1032,45 @@ class Sitemaps extends Metaboxes {
1061
  return $content;
1062
  }
1063
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1064
  /**
1065
  * Ping search engines on post publish.
1066
  *
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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
541
  * @since 2.2.9
542
  * @since 2.8.0 Now adjusts memory limit when possible.
543
  * @since 2.9.3 No longer crashes on WordPress sites below WP 4.6.
544
+ * @since 3.0.4 No longer outputs empty URL entries.
545
  *
546
  * @return string The sitemap content.
547
  */
553
 
554
  $content = '';
555
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
556
  /**
557
  * Maximum pages and posts to fetch.
558
  * A total of 2100, consisting of 3 times $max_posts
581
  * We can't get specific on the home page, unfortunately.
582
  */
583
  $sitemaps_modified = $this->is_option_checked( 'sitemaps_modified' );
584
+ $page_lastmod = $post_lastmod = $home_lastmod = (bool) $sitemaps_modified;
 
 
585
 
586
  /**
587
  * Generation time output
640
  unset( $latest_pages[ $key_on_front ] );
641
  }
642
 
643
+ //= Render frontpage.
644
+ $front_page = $page_on_front ? \get_post( $id_on_front ) : null;
645
+ $render_front = false;
646
+ if ( ! $this->get_option( 'homepage_noindex' ) ) {
647
+ if ( $page_on_front ) {
648
+ $render_front = isset( $front_page->ID )
649
+ && $this->is_post_included_in_sitemap( $front_page->ID )
650
+ && ! $this->is_protected( $front_page->ID );
651
+ } else {
652
+ $render_front = $this->is_post_included_in_sitemap( $id_on_front );
653
+ }
654
+ }
655
+ if ( $render_front ) {
656
+ $_url = $this->get_homepage_permalink();
657
+ if ( $_url ) {
658
  $content .= "\t<url>\n";
659
+ $content .= "\t\t<loc>" . $_url . "</loc>\n";
660
 
661
  // Keep it consistent. Only parse if page_lastmod is true.
662
  if ( $home_lastmod ) {
663
  if ( $page_on_front ) {
664
+ $front_modified_gmt = isset( $front_page->post_modified_gmt ) ? $front_page->post_modified_gmt : '0000-00-00 00:00:00';
 
665
  } else {
666
  $args = array(
667
  'numberposts' => 1,
672
  'order' => 'DESC',
673
  'offset' => 0,
674
  );
675
+ $latests_posts = \wp_get_recent_posts( $args, OBJECT );
676
+ $latest_post = isset( $latests_posts[0] ) ? $latests_posts[0] : null;
677
+ $front_modified_gmt = isset( $latest_post->post_date_gmt ) ? $latest_post->post_date_gmt : '0000-00-00 00:00:00';
 
678
  }
679
 
680
  if ( '0000-00-00 00:00:00' !== $front_modified_gmt )
684
  $content .= "\t\t<priority>1.0</priority>\n";
685
  $content .= "\t</url>\n";
686
  }
687
+ //* Free memory.
688
+ unset( $latests_posts, $latest_post, $front_page );
689
+ }
690
 
691
+ //= Render the page for posts.
692
  if ( $page_on_front && $page_for_posts_id ) :
 
693
  //* Remove ID for blog from list and add frontpage to list.
694
  if ( false !== $key_for_posts = array_search( $page_for_posts_id, $latest_pages, true ) ) {
695
  unset( $latest_pages[ $key_for_posts ] );
696
  }
697
 
698
+ $blog_page = \get_post( $page_for_posts_id );
699
+ $render_blog = isset( $blog_page->ID )
700
+ && $this->is_post_included_in_sitemap( $blog_page->ID )
701
+ && ! $this->is_protected( $blog_page->ID );
702
 
703
+ if ( $render_blog ) {
704
+ $_url = $this->create_canonical_url( array( 'id' => $blog_page->ID ) );
705
+ if ( $_url ) {
706
  $content .= "\t<url>\n";
707
+ $content .= "\t\t<loc>" . $_url . "</loc>\n";
708
 
709
+ // Keep it consistent. Only parse if $page_lastmod is true.
710
  if ( $page_lastmod ) {
711
  $args = array(
712
  'numberposts' => 1,
717
  'order' => 'DESC',
718
  'offset' => 0,
719
  );
720
+ $lastest_posts = \wp_get_recent_posts( $args, OBJECT );
721
+ $lastest_post = isset( $lastest_posts[0] ) ? $lastest_posts[0] : null;
722
  $latest_post_published_gmt = isset( $lastest_post->post_date_gmt ) ? $lastest_post->post_date_gmt : '0000-00-00 00:00:00';
723
+ $page_for_posts_modified_gmt = $blog_page->post_modified_gmt;
724
 
725
  if ( strtotime( $latest_post_published_gmt ) > strtotime( $page_for_posts_modified_gmt ) ) {
726
  $page_modified_gmt = $latest_post_published_gmt;
735
  $content .= "\t\t<priority>0.9</priority>\n";
736
  $content .= "\t</url>\n";
737
  }
738
+ }
739
 
740
+ //* Free memory.
741
+ unset( $latest_posts, $latest_post, $blog_page );
742
  endif;
743
 
 
 
 
744
  foreach ( $latest_pages as $page_id ) :
745
  $page = \get_post( $page_id );
746
+ if ( empty( $page->ID ) || ! $this->is_post_included_in_sitemap( $page->ID ) )
747
+ continue;
748
 
749
+ $_url = $this->create_canonical_url( array( 'id' => $page->ID ) );
750
+ if ( ! $_url )
751
+ continue;
 
 
752
 
753
+ $content .= "\t<url>\n";
754
+ $content .= "\t\t<loc>" . $_url . "</loc>\n";
 
 
755
 
756
+ // Keep it consistent. Only parse if page_lastmod is true.
757
+ if ( $page_lastmod ) {
758
+ $page_modified_gmt = $page->post_modified_gmt;
759
 
760
+ if ( '0000-00-00 00:00:00' !== $page_modified_gmt )
761
+ $content .= "\t\t<lastmod>" . $this->gmt2date( $timestamp_format, $page_modified_gmt ) . "</lastmod>\n";
762
+ }
763
 
764
+ $content .= "\t\t<priority>0.9</priority>\n";
765
+ $content .= "\t</url>\n";
 
 
 
766
  endforeach;
767
 
768
  //* Free memory.
769
+ unset( $latest_pages, $page );
770
  endif;
771
 
772
  if ( $totalposts ) {
829
  */
830
  foreach ( $latest_posts as $post_id ) :
831
  $post = \get_post( $post_id );
832
+ if ( empty( $post->ID ) || ! $this->is_post_included_in_sitemap( $post->ID ) )
833
+ continue;
834
 
835
+ $_url = $this->create_canonical_url( array( 'id' => $post->ID ) );
836
+ if ( ! $_url )
837
+ continue;
 
 
 
 
 
838
 
839
+ $content .= "\t<url>\n";
840
+ // No need to use static vars
841
+ $content .= "\t\t<loc>" . $_url . "</loc>\n";
842
 
843
+ // Keep it consistent. Only parse if page_lastmod is true.
844
+ if ( $post_lastmod ) {
845
+ $post_modified_gmt = $post->post_modified_gmt;
846
 
847
+ if ( '0000-00-00 00:00:00' !== $post_modified_gmt )
848
+ $content .= "\t\t<lastmod>" . $this->gmt2date( $timestamp_format, $post_modified_gmt ) . "</lastmod>\n";
849
+ }
850
 
851
+ $content .= "\t\t<priority>" . number_format( $priority, 1 ) . "</priority>\n";
852
+ $content .= "\t</url>\n";
853
 
854
+ // Lower the priority for the next pass.
855
+ $priority = $priority - $prioritydiff;
856
 
857
+ // Cast away negative numbers.
858
+ $priority = $priority <= 0 ? 0 : (float) $priority;
 
 
 
859
  endforeach;
860
 
861
  //* Free memory.
862
+ unset( $latest_posts, $post );
863
  endif;
864
 
865
  if ( $total_cpt_posts ) :
937
  * This can be heavy.
938
  */
939
  foreach ( $latest_cpt_posts as $ctp_post_id ) :
 
940
  $ctp_post = \get_post( $ctp_post_id );
941
+ if ( empty( $ctp_post->ID ) || ! $this->is_post_included_in_sitemap( $ctp_post->ID ) )
942
+ continue;
943
 
944
+ $_url = $this->create_canonical_url( array( 'id' => $ctp_post->ID ) );
945
+ if ( ! $_url )
946
+ continue;
 
 
 
 
947
 
948
+ $content .= "\t<url>\n";
949
+ //* No need to use static vars
950
+ $content .= "\t\t<loc>" . $_url . "</loc>\n";
951
+
952
+ //* Keep it consistent. Only parse if $post_lastmod is true.
953
+ if ( $post_lastmod ) {
954
+ $cpt_modified_gmt = $ctp_post->post_modified_gmt;
955
+ //* Some CPT don't set modified time.
956
+ if ( '0000-00-00 00:00:00' !== $cpt_modified_gmt )
957
+ $content .= "\t\t<lastmod>" . $this->gmt2date( $timestamp_format, $cpt_modified_gmt ) . "</lastmod>\n";
958
+ }
 
 
 
 
959
 
960
+ $content .= "\t\t<priority>" . number_format( $priority_cpt, 1 ) . "</priority>\n";
961
+ $content .= "\t</url>\n";
962
 
963
+ // Lower the priority for the next pass.
964
+ $priority_cpt = $priority_cpt - $prioritydiff_cpt;
965
 
966
+ // Cast away negative numbers.
967
+ $priority_cpt = $priority_cpt <= 0 ? 0 : (float) $priority_cpt;
 
 
 
968
  endforeach;
969
 
970
  //* Free memory.
971
+ unset( $latest_cpt_posts, $ctp_post );
972
  endif;
973
 
974
  /**
1032
  return $content;
1033
  }
1034
 
1035
+ /**
1036
+ * Determines if post is possibly included in the sitemap.
1037
+ *
1038
+ * This is a weak check, as the filter might not be present outside of the
1039
+ * sitemap's scope.
1040
+ * The URL also isn't checked, nor the position.
1041
+ *
1042
+ * @since 3.0.4
1043
+ *
1044
+ * @param int $id The post ID to check. When 0, the custom field will not be checked.
1045
+ * @return bool True if included, false otherwise.
1046
+ */
1047
+ public function is_post_included_in_sitemap( $id ) {
1048
+
1049
+ static $excluded = null;
1050
+ if ( null === $excluded ) {
1051
+ /**
1052
+ * Applies filters the_seo_framework_sitemap_exclude_ids : array of id's
1053
+ *
1054
+ * @since 2.5.2
1055
+ * @since 2.8.0 : No longer accepts '0' as entry.
1056
+ */
1057
+ $excluded = (array) \apply_filters( 'the_seo_framework_sitemap_exclude_ids', array() );
1058
+
1059
+ if ( empty( $excluded ) ) {
1060
+ $excluded = array();
1061
+ } else {
1062
+ $excluded = array_flip( $excluded );
1063
+ }
1064
+ }
1065
+
1066
+ $included = empty( $excluded[ $id ] );
1067
+ if ( $included && $id ) {
1068
+ $included = ! $this->get_custom_field( '_genesis_noindex', $id );
1069
+ }
1070
+
1071
+ return $included;
1072
+ }
1073
+
1074
  /**
1075
  * Ping search engines on post publish.
1076
  *
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 - 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
@@ -91,6 +91,7 @@ class Term_Data extends Post_Data {
91
  *
92
  * @since 2.7.0
93
  * @since 2.8.0 : Added filter.
 
94
  * @staticvar array $cache
95
  *
96
  * @param int $term_id The Term ID.
@@ -311,6 +312,8 @@ class Term_Data extends Post_Data {
311
  *
312
  * @since 2.6.0
313
  * @since 2.9.4 Added $term->label and $term->labels->singular_name as additional fallbacks.
 
 
314
  * @staticvar string $term_name : Caution: This function only runs once per screen and doesn't check the term type more than once.
315
  *
316
  * @param object $term The Taxonomy Term object.
@@ -330,6 +333,8 @@ class Term_Data extends Post_Data {
330
  $term_name = array();
331
  }
332
 
 
 
333
  if ( isset( $term->taxonomy ) ) {
334
  $tax_type = $term->taxonomy;
335
 
@@ -344,26 +349,27 @@ class Term_Data extends Post_Data {
344
 
345
  if ( $singular ) {
346
  if ( isset( $term_labels[ $tax_type ]->singular_name ) )
347
- return $term_name[ $singular ] = $term_labels[ $tax_type ]->singular_name;
348
  } else {
349
  if ( isset( $term_labels->name ) )
350
- return $term_name[ $singular ] = $term_labels[ $tax_type ]->name;
351
  }
352
  } elseif ( isset( $term->label ) ) {
353
- return $term->label;
354
  } elseif ( isset( $term->labels->singular_name ) ) {
355
- return $term->labels->singular_name;
356
  }
357
 
358
- if ( $fallback ) {
359
  //* Fallback to Page as it is generic.
360
- if ( $singular )
361
- return $term_name[ $singular ] = \esc_html__( 'Page', 'autodescription' );
362
-
363
- return $term_name[ $singular ] = \esc_html__( 'Pages', 'autodescription' );
 
364
  }
365
 
366
- return $term_name[ $singular ] = '';
367
  }
368
 
369
  /**
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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
91
  *
92
  * @since 2.7.0
93
  * @since 2.8.0 : Added filter.
94
+ * @since 3.0.0 : Added filter.
95
  * @staticvar array $cache
96
  *
97
  * @param int $term_id The Term ID.
312
  *
313
  * @since 2.6.0
314
  * @since 2.9.4 Added $term->label and $term->labels->singular_name as additional fallbacks.
315
+ * @since 3.0.4 : 1. Now caches ->label and ->singular_name.
316
+ * 2. No longer caches fallbacks.
317
  * @staticvar string $term_name : Caution: This function only runs once per screen and doesn't check the term type more than once.
318
  *
319
  * @param object $term The Taxonomy Term object.
333
  $term_name = array();
334
  }
335
 
336
+ $ret = '';
337
+
338
  if ( isset( $term->taxonomy ) ) {
339
  $tax_type = $term->taxonomy;
340
 
349
 
350
  if ( $singular ) {
351
  if ( isset( $term_labels[ $tax_type ]->singular_name ) )
352
+ $ret = $term_labels[ $tax_type ]->singular_name;
353
  } else {
354
  if ( isset( $term_labels->name ) )
355
+ $ret = $term_labels[ $tax_type ]->name;
356
  }
357
  } elseif ( isset( $term->label ) ) {
358
+ $ret = $term->label;
359
  } elseif ( isset( $term->labels->singular_name ) ) {
360
+ $ret = $term->labels->singular_name;
361
  }
362
 
363
+ if ( $fallback && ! $ret ) {
364
  //* Fallback to Page as it is generic.
365
+ if ( $singular ) {
366
+ return \esc_html__( 'Page', 'autodescription' );
367
+ } else {
368
+ return \esc_html__( 'Pages', 'autodescription' );
369
+ }
370
  }
371
 
372
+ return $term_name[ $singular ] = $ret;
373
  }
374
 
375
  /**
inc/classes/user-data.class.php CHANGED
@@ -8,7 +8,7 @@ defined( 'ABSPATH' ) or die;
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
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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/plugin-bbpress.php CHANGED
@@ -144,6 +144,7 @@ function _bbpress_filter_url_path( $path, $id = 0, $external = false ) {
144
  * This function fixes the Excerpt part.
145
  *
146
  * @since 2.9.0
 
147
  * @access private
148
  *
149
  * @param string $excerpt The excerpt to use.
@@ -152,7 +153,7 @@ function _bbpress_filter_url_path( $path, $id = 0, $external = false ) {
152
  * @param int $max_char_length Determines the maximum length of excerpt after trimming.
153
  * @return string The excerpt.
154
  */
155
- function _bbpress_filter_excerpt_generation( $excerpt = '', $page_id = 0, $term = '', $max_char_length = 155 ) {
156
 
157
  if ( \is_bbpress() ) {
158
  if ( \bbp_is_topic_tag() ) {
144
  * This function fixes the Excerpt part.
145
  *
146
  * @since 2.9.0
147
+ * @since 3.0.4 : Default value for $max_char_length has been increased from 155 to 300.
148
  * @access private
149
  *
150
  * @param string $excerpt The excerpt to use.
153
  * @param int $max_char_length Determines the maximum length of excerpt after trimming.
154
  * @return string The excerpt.
155
  */
156
+ function _bbpress_filter_excerpt_generation( $excerpt = '', $page_id = 0, $term = '', $max_char_length = 300 ) {
157
 
158
  if ( \is_bbpress() ) {
159
  if ( \bbp_is_topic_tag() ) {
inc/compat/plugin-wpml.php CHANGED
@@ -16,7 +16,7 @@ defined( 'ABSPATH' ) and $_this = \the_seo_framework_class() and $this instanceo
16
 
17
  \add_action( 'current_screen', __NAMESPACE__ . '\\_wpml_do_current_screen_action' );
18
  /**
19
- * Adds WPML filters only on SEO plugin page.
20
  *
21
  * @since 2.8.0
22
  * @access private
16
 
17
  \add_action( 'current_screen', __NAMESPACE__ . '\\_wpml_do_current_screen_action' );
18
  /**
19
+ * Adds WPML filters based on current screen.
20
  *
21
  * @since 2.8.0
22
  * @access private
inc/functions/deprecated.php CHANGED
@@ -1,7 +1,7 @@
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
1
  <?php
2
  /**
3
  * The SEO Framework plugin
4
+ * Copyright (C) 2015 - 2018 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/optionsapi.php CHANGED
@@ -1,7 +1,7 @@
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
1
  <?php
2
  /**
3
  * The SEO Framework plugin
4
+ * Copyright (C) 2015 - 2018 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-activation.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 - 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
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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/functions/plugin-deactivation.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 - 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
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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/functions/plugin-test-server.php CHANGED
@@ -1,7 +1,7 @@
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
@@ -43,7 +43,7 @@ function the_seo_framework_test_server_phase() {
43
 
44
  //* @TODO clean this up @ 4.6 requirement. i.e. only check for `get_network()` and $nw->site_id.
45
  //= WP_Network is WP > 4.4.
46
- if ( $ms && class_exists( '\\WP_Network', false ) ) {
47
  //* Try bypassing testing and deactivation gaming when the main blog has already been tested.
48
 
49
  /**
@@ -54,7 +54,7 @@ function the_seo_framework_test_server_phase() {
54
 
55
  //= WP < 4.6 doesn't have get_network().
56
  $nw = function_exists( 'get_network' ) ? get_network() : $GLOBALS['current_site'];
57
- if ( $nw instanceof \WP_Network ) {
58
  //= WP < 4.6 doesn't have property 'site_id'.
59
  $site_id = isset( $nw->site_id ) ? $nw->site_id : (int) $nw->blog_id;
60
 
@@ -104,7 +104,6 @@ function the_seo_framework_test_server_phase() {
104
  return;
105
 
106
  switch ( $test ) :
107
- case 0 :
108
  case 1 :
109
  //* PHP requirements not met, always count up to encourage best standards.
110
  $requirement = 'PHP 5.3.0 or later';
@@ -123,6 +122,7 @@ function the_seo_framework_test_server_phase() {
123
 
124
  default :
125
  wp_die();
 
126
  endswitch;
127
 
128
  //* network_admin_url() falls back to admin_url() on single. But networks can enable single too.
1
  <?php
2
  /**
3
  * The SEO Framework plugin
4
+ * Copyright (C) 2015 - 2018 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
43
 
44
  //* @TODO clean this up @ 4.6 requirement. i.e. only check for `get_network()` and $nw->site_id.
45
  //= WP_Network is WP > 4.4.
46
+ if ( $ms && class_exists( 'WP_Network', false ) ) {
47
  //* Try bypassing testing and deactivation gaming when the main blog has already been tested.
48
 
49
  /**
54
 
55
  //= WP < 4.6 doesn't have get_network().
56
  $nw = function_exists( 'get_network' ) ? get_network() : $GLOBALS['current_site'];
57
+ if ( $nw instanceof WP_Network ) {
58
  //= WP < 4.6 doesn't have property 'site_id'.
59
  $site_id = isset( $nw->site_id ) ? $nw->site_id : (int) $nw->blog_id;
60
 
104
  return;
105
 
106
  switch ( $test ) :
 
107
  case 1 :
108
  //* PHP requirements not met, always count up to encourage best standards.
109
  $requirement = 'PHP 5.3.0 or later';
122
 
123
  default :
124
  wp_die();
125
+ break;
126
  endswitch;
127
 
128
  //* network_admin_url() falls back to admin_url() on single. But networks can enable single too.
inc/functions/upgrade.php CHANGED
@@ -1,7 +1,7 @@
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
1
  <?php
2
  /**
3
  * The SEO Framework plugin
4
+ * Copyright (C) 2015 - 2018 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 - 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
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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/inpost/seo-settings-singular.php CHANGED
@@ -40,18 +40,18 @@ switch ( $instance ) :
40
  'dashicon' => 'admin-generic',
41
  'args' => array( $type ),
42
  ),
43
- 'visibility' => array(
44
- 'name' => __( 'Visibility', 'autodescription' ),
45
- 'callback' => array( $this, 'singular_inpost_box_visibility_tab' ),
46
- 'dashicon' => 'visibility',
47
- 'args' => array( $type ),
48
- ),
49
  'social' => array(
50
  'name' => __( 'Social', 'autodescription' ),
51
  'callback' => array( $this, 'singular_inpost_box_social_tab' ),
52
  'dashicon' => 'share',
53
  'args' => array( $type ),
54
  ),
 
 
 
 
 
 
55
  );
56
 
57
  /**
@@ -120,7 +120,7 @@ switch ( $instance ) :
120
  <div class="tsf-flex-setting-input tsf-flex">
121
  <div id="tsf-title-wrap">
122
  <input class="large-text" type="text" name="autodescription[_genesis_title]" id="autodescription_title" placeholder="<?php echo esc_attr( $doctitle_placeholder ); ?>" value="<?php echo esc_attr( $this->get_custom_field( '_genesis_title' ) ); ?>" autocomplete=off />
123
- <?php echo $this->output_floating_title_elements(); ?>
124
  </div>
125
  </div>
126
  </div>
@@ -146,6 +146,7 @@ switch ( $instance ) :
146
  </div>
147
  <div class="tsf-flex-setting-input tsf-flex">
148
  <textarea class="large-text" name="autodescription[_genesis_description]" id="autodescription_description" placeholder="<?php echo esc_attr( $description_placeholder ); ?>" rows="4" cols="4"><?php echo esc_attr( $this->get_custom_field( '_genesis_description' ) ); ?></textarea>
 
149
  </div>
150
  </div>
151
  <?php
@@ -313,6 +314,117 @@ switch ( $instance ) :
313
  break;
314
 
315
  case 'inpost_social' :
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
316
  //* Fetch image placeholder.
317
  $image_placeholder = $this->get_social_image( array( 'post_id' => $post_id, 'disallowed' => array( 'postmeta' ), 'escape' => false ) );
318
 
40
  'dashicon' => 'admin-generic',
41
  'args' => array( $type ),
42
  ),
 
 
 
 
 
 
43
  'social' => array(
44
  'name' => __( 'Social', 'autodescription' ),
45
  'callback' => array( $this, 'singular_inpost_box_social_tab' ),
46
  'dashicon' => 'share',
47
  'args' => array( $type ),
48
  ),
49
+ 'visibility' => array(
50
+ 'name' => __( 'Visibility', 'autodescription' ),
51
+ 'callback' => array( $this, 'singular_inpost_box_visibility_tab' ),
52
+ 'dashicon' => 'visibility',
53
+ 'args' => array( $type ),
54
+ ),
55
  );
56
 
57
  /**
120
  <div class="tsf-flex-setting-input tsf-flex">
121
  <div id="tsf-title-wrap">
122
  <input class="large-text" type="text" name="autodescription[_genesis_title]" id="autodescription_title" placeholder="<?php echo esc_attr( $doctitle_placeholder ); ?>" value="<?php echo esc_attr( $this->get_custom_field( '_genesis_title' ) ); ?>" autocomplete=off />
123
+ <?php echo $this->output_js_title_elements(); ?>
124
  </div>
125
  </div>
126
  </div>
146
  </div>
147
  <div class="tsf-flex-setting-input tsf-flex">
148
  <textarea class="large-text" name="autodescription[_genesis_description]" id="autodescription_description" placeholder="<?php echo esc_attr( $description_placeholder ); ?>" rows="4" cols="4"><?php echo esc_attr( $this->get_custom_field( '_genesis_description' ) ); ?></textarea>
149
+ <?php echo $this->output_js_description_elements(); ?>
150
  </div>
151
  </div>
152
  <?php
314
  break;
315
 
316
  case 'inpost_social' :
317
+ // Gets custom fields.
318
+ $custom_og_title = $this->get_custom_field( '_open_graph_title', $post_id );
319
+ $custom_tw_title = $this->get_custom_field( '_twitter_title', $post_id );
320
+ $custom_og_desc = $this->get_custom_field( '_open_graph_description', $post_id );
321
+ $custom_tw_desc = $this->get_custom_field( '_twitter_description', $post_id );
322
+
323
+ //! OG input falls back to default input.
324
+ $og_tit_placeholder = $this->get_generated_open_graph_title( $post_id );
325
+ $og_desc_placeholder = $this->get_generated_open_graph_description( $post_id );
326
+ $og_tit_len_parsed = $custom_og_title ? html_entity_decode( $custom_og_title ) : html_entity_decode( $og_tit_placeholder );
327
+ $og_desc_len_parsed = $custom_og_desc ? html_entity_decode( $custom_og_desc ) : html_entity_decode( $og_desc_placeholder );
328
+
329
+ //! Twitter input falls back to OG input.
330
+ $tw_tit_placeholder = $custom_og_title ?: $og_tit_placeholder;
331
+ $tw_desc_placeholder = $custom_og_desc ?: $og_desc_placeholder;
332
+ $tw_tit_len_parsed = $custom_tw_title ? html_entity_decode( $custom_tw_title ) : $og_tit_len_parsed;
333
+ $tw_desc_len_parsed = $custom_tw_desc ? html_entity_decode( $custom_tw_desc ) : $og_desc_len_parsed;
334
+
335
+ $show_og = $this->is_option_checked( 'og_tags' ) && ! $this->detect_og_plugin();
336
+ $show_tw = $this->is_option_checked( 'twitter_tags' ) && ! $this->detect_twitter_card_plugin();
337
+
338
+ ?>
339
+ <div class="tsf-flex-setting tsf-flex" <?php echo $show_og ? '' : 'style=display:none'; ?>>
340
+ <div class="tsf-flex-setting-label tsf-flex">
341
+ <div class="tsf-flex-setting-label-inner-wrap tsf-flex">
342
+ <label for="autodescription_og_title" class="tsf-flex-setting-label-item tsf-flex">
343
+ <div><strong>
344
+ <?php
345
+ esc_html_e( 'Open Graph Title', 'autodescription' );
346
+ ?>
347
+ </strong></div>
348
+ </label>
349
+ <?php
350
+ $this->get_option( 'display_character_counter' )
351
+ and $this->output_character_counter_wrap( 'autodescription_og_title', $og_tit_len_parsed );
352
+ ?>
353
+ </div>
354
+ </div>
355
+ <div class="tsf-flex-setting-input tsf-flex">
356
+ <div id="tsf-og-title-wrap">
357
+ <input class="large-text" type="text" name="autodescription[_open_graph_title]" id="autodescription_og_title" placeholder="<?php echo esc_attr( $og_tit_placeholder ); ?>" value="<?php echo esc_attr( $this->get_custom_field( '_open_graph_title' ) ); ?>" autocomplete=off />
358
+ </div>
359
+ </div>
360
+ </div>
361
+
362
+ <div class="tsf-flex-setting tsf-flex" <?php echo $show_og ? '' : 'style=display:none'; ?>>
363
+ <div class="tsf-flex-setting-label tsf-flex">
364
+ <div class="tsf-flex-setting-label-inner-wrap tsf-flex">
365
+ <label for="autodescription_og_description" class="tsf-flex-setting-label-item tsf-flex">
366
+ <div><strong>
367
+ <?php
368
+ esc_html_e( 'Open Graph Description', 'autodescription' );
369
+ ?>
370
+ </strong></div>
371
+ </label>
372
+ <?php
373
+ $this->get_option( 'display_character_counter' )
374
+ and $this->output_character_counter_wrap( 'autodescription_og_description', $og_desc_len_parsed );
375
+ ?>
376
+ </div>
377
+ </div>
378
+ <div class="tsf-flex-setting-input tsf-flex">
379
+ <textarea class="large-text" name="autodescription[_open_graph_description]" id="autodescription_og_description" placeholder="<?php echo esc_attr( $og_desc_placeholder ); ?>" rows="3" cols="4"><?php echo esc_attr( $this->get_custom_field( '_open_graph_description' ) ); ?></textarea>
380
+ </div>
381
+ </div>
382
+
383
+ <div class="tsf-flex-setting tsf-flex" <?php echo $show_tw ? '' : 'style=display:none'; ?>>
384
+ <div class="tsf-flex-setting-label tsf-flex">
385
+ <div class="tsf-flex-setting-label-inner-wrap tsf-flex">
386
+ <label for="autodescription_twitter_title" class="tsf-flex-setting-label-item tsf-flex">
387
+ <div><strong>
388
+ <?php
389
+ esc_html_e( 'Twitter Title', 'autodescription' );
390
+ ?>
391
+ </strong></div>
392
+ </label>
393
+ <?php
394
+ $this->get_option( 'display_character_counter' )
395
+ and $this->output_character_counter_wrap( 'autodescription_twitter_title', $tw_tit_len_parsed );
396
+ ?>
397
+ </div>
398
+ </div>
399
+ <div class="tsf-flex-setting-input tsf-flex">
400
+ <div id="tsf-twitter-title-wrap">
401
+ <input class="large-text" type="text" name="autodescription[_twitter_title]" id="autodescription_twitter_title" placeholder="<?php echo esc_attr( $tw_tit_placeholder ); ?>" value="<?php echo esc_attr( $this->get_custom_field( '_twitter_title' ) ); ?>" autocomplete=off />
402
+ </div>
403
+ </div>
404
+ </div>
405
+
406
+ <div class="tsf-flex-setting tsf-flex" <?php echo $show_tw ? '' : 'style=display:none'; ?>>
407
+ <div class="tsf-flex-setting-label tsf-flex">
408
+ <div class="tsf-flex-setting-label-inner-wrap tsf-flex">
409
+ <label for="autodescription_twitter_description" class="tsf-flex-setting-label-item tsf-flex">
410
+ <div><strong>
411
+ <?php
412
+ esc_html_e( 'Twitter Description', 'autodescription' );
413
+ ?>
414
+ </strong></div>
415
+ </label>
416
+ <?php
417
+ $this->get_option( 'display_character_counter' )
418
+ and $this->output_character_counter_wrap( 'autodescription_twitter_description', $tw_desc_len_parsed );
419
+ ?>
420
+ </div>
421
+ </div>
422
+ <div class="tsf-flex-setting-input tsf-flex">
423
+ <textarea class="large-text" name="autodescription[_twitter_description]" id="autodescription_twitter_description" placeholder="<?php echo esc_attr( $tw_desc_placeholder ); ?>" rows="3" cols="4"><?php echo esc_attr( $this->get_custom_field( '_twitter_description' ) ); ?></textarea>
424
+ </div>
425
+ </div>
426
+ <?php
427
+
428
  //* Fetch image placeholder.
429
  $image_placeholder = $this->get_social_image( array( 'post_id' => $post_id, 'disallowed' => array( 'postmeta' ), 'escape' => false ) );
430
 
inc/views/inpost/seo-settings-tt.php CHANGED
@@ -132,7 +132,7 @@ $robots_settings = array(
132
  <td>
133
  <div id="tsf-title-wrap">
134
  <input name="autodescription-meta[doctitle]" id="autodescription-meta[doctitle]" type="text" placeholder="<?php echo esc_attr( $title_placeholder ); ?>" value="<?php echo esc_attr( $title ); ?>" size="40" autocomplete=off />
135
- <?php $this->output_floating_title_elements(); ?>
136
  </div>
137
  </td>
138
  </tr>
@@ -156,6 +156,7 @@ $robots_settings = array(
156
  </th>
157
  <td>
158
  <textarea name="autodescription-meta[description]" id="autodescription-meta[description]" placeholder="<?php echo esc_attr( $description_placeholder ); ?>" rows="5" cols="50" class="large-text"><?php echo esc_html( $description ); ?></textarea>
 
159
  </td>
160
  </tr>
161
 
132
  <td>
133
  <div id="tsf-title-wrap">
134
  <input name="autodescription-meta[doctitle]" id="autodescription-meta[doctitle]" type="text" placeholder="<?php echo esc_attr( $title_placeholder ); ?>" value="<?php echo esc_attr( $title ); ?>" size="40" autocomplete=off />
135
+ <?php $this->output_js_title_elements(); ?>
136
  </div>
137
  </td>
138
  </tr>
156
  </th>
157
  <td>
158
  <textarea name="autodescription-meta[description]" id="autodescription-meta[description]" placeholder="<?php echo esc_attr( $description_placeholder ); ?>" rows="5" cols="50" class="large-text"><?php echo esc_html( $description ); ?></textarea>
159
+ <?php echo $this->output_js_description_elements(); ?>
160
  </td>
161
  </tr>
162
 
inc/views/metaboxes/homepage-metabox.php CHANGED
@@ -183,7 +183,7 @@ switch ( $instance ) :
183
  </div>
184
  <p id="tsf-title-wrap">
185
  <input type="text" name="<?php $this->field_name( 'homepage_title' ); ?>" class="large-text" id="<?php $this->field_id( 'homepage_title' ); ?>" placeholder="<?php echo esc_attr( $home_title_placeholder ); ?>" value="<?php echo esc_attr( $this->get_field_value( 'homepage_title' ) ); ?>" autocomplete=off />
186
- <?php $this->output_floating_title_elements(); ?>
187
  </p>
188
  <?php
189
  /**
@@ -239,6 +239,7 @@ switch ( $instance ) :
239
  </div>
240
  <p>
241
  <textarea name="<?php $this->field_name( 'homepage_description' ); ?>" class="large-text" id="<?php $this->field_id( 'homepage_description' ); ?>" rows="3" cols="70" placeholder="<?php echo esc_attr( $description_placeholder ); ?>"><?php echo esc_attr( $this->get_field_value( 'homepage_description' ) ); ?></textarea>
 
242
  </p>
243
  <?php
244
  $this->description( __( 'The meta description can be used to determine the text used under the title on Search Engine results pages.', 'autodescription' ) );
183
  </div>
184
  <p id="tsf-title-wrap">
185
  <input type="text" name="<?php $this->field_name( 'homepage_title' ); ?>" class="large-text" id="<?php $this->field_id( 'homepage_title' ); ?>" placeholder="<?php echo esc_attr( $home_title_placeholder ); ?>" value="<?php echo esc_attr( $this->get_field_value( 'homepage_title' ) ); ?>" autocomplete=off />
186
+ <?php $this->output_js_title_elements(); ?>
187
  </p>
188
  <?php
189
  /**
239
  </div>
240
  <p>
241
  <textarea name="<?php $this->field_name( 'homepage_description' ); ?>" class="large-text" id="<?php $this->field_id( 'homepage_description' ); ?>" rows="3" cols="70" placeholder="<?php echo esc_attr( $description_placeholder ); ?>"><?php echo esc_attr( $this->get_field_value( 'homepage_description' ) ); ?></textarea>
242
+ <?php echo $this->output_js_description_elements(); ?>
243
  </p>
244
  <?php
245
  $this->description( __( 'The meta description can be used to determine the text used under the title on Search Engine results pages.', 'autodescription' ) );
inc/views/metaboxes/schema-metabox.php CHANGED
@@ -183,6 +183,7 @@ switch ( $instance ) :
183
  <?php
184
  $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' ) );
185
  $this->description( __( 'Add the link that leads directly to the social page of this website.', 'autodescription' ) );
 
186
 
187
  $connectedi18n = _x( 'RelatedProfile', 'No spaces. E.g. https://facebook.com/RelatedProfile', 'autodescription' );
188
  $profile18n = _x( 'Profile', 'Social Profile', 'autodescription' );
183
  <?php
184
  $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' ) );
185
  $this->description( __( 'Add the link that leads directly to the social page of this website.', 'autodescription' ) );
186
+ $this->description( __( 'These settings do not affect sharing behavior with the social networks.', 'autodescription' ) );
187
 
188
  $connectedi18n = _x( 'RelatedProfile', 'No spaces. E.g. https://facebook.com/RelatedProfile', 'autodescription' );
189
  $profile18n = _x( 'Profile', 'Social Profile', 'autodescription' );
language/autodescription.pot CHANGED
@@ -1,74 +1,74 @@
1
- # Copyright (C) 2017 The SEO Framework
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 3.0.0\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/autodescription\n"
7
- "POT-Creation-Date: 2017-11-19 18:46:04+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
11
- "PO-Revision-Date: 2017-MO-DA HO:MI+ZONE\n"
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
14
 
15
  #. translators: %s = term name
16
 
17
- #: inc/classes/admin-init.class.php:252
18
  msgid "Make primary %s"
19
  msgstr ""
20
 
21
  #. translators: %s = term name
22
 
23
- #: inc/classes/admin-init.class.php:254
24
  msgid "Primary %s"
25
  msgstr ""
26
 
27
- #: inc/classes/admin-init.class.php:351
28
  msgid "The changes you made will be lost if you navigate away from this page."
29
  msgstr ""
30
 
31
- #: inc/classes/admin-init.class.php:352
32
  msgid "Are you sure you want to reset all SEO settings to their defaults?"
33
  msgstr ""
34
 
35
- #: inc/classes/admin-init.class.php:353
36
  msgid "Good"
37
  msgstr ""
38
 
39
- #: inc/classes/admin-init.class.php:354
40
  msgid "Okay"
41
  msgstr ""
42
 
43
- #: inc/classes/admin-init.class.php:355
44
  msgid "Bad"
45
  msgstr ""
46
 
47
- #: inc/classes/admin-init.class.php:356
48
  msgid "Unknown"
49
  msgstr ""
50
 
51
- #: inc/classes/admin-init.class.php:357
52
  msgid "Private:"
53
  msgstr ""
54
 
55
- #: inc/classes/admin-init.class.php:358
56
  msgid "Protected:"
57
  msgstr ""
58
 
59
  #. translators: Pixel counter. 1: width, 2: guideline
60
 
61
- #: inc/classes/admin-init.class.php:360
62
  msgid "%1$d out of %2$d pixels are used."
63
  msgstr ""
64
 
65
  #. translators: %s = Redirect URL markdown
66
 
67
- #: inc/classes/admin-init.class.php:696
68
  msgid "There has been an error redirecting. Refresh the page or follow [this link](%s)."
69
  msgstr ""
70
 
71
- #: inc/classes/admin-init.class.php:782 inc/classes/admin-init.class.php:843
72
  msgid "Image could not be processed."
73
  msgstr ""
74
 
@@ -96,7 +96,7 @@ msgstr ""
96
  msgid "New SEO Settings have been updated."
97
  msgstr ""
98
 
99
- #: inc/classes/admin-pages.class.php:109 inc/classes/site-options.class.php:439
100
  msgid "SEO Settings"
101
  msgstr ""
102
 
@@ -129,8 +129,8 @@ msgid "Schema Settings"
129
  msgstr ""
130
 
131
  #: inc/classes/admin-pages.class.php:295
132
- #: inc/views/inpost/seo-settings-singular.php:186
133
- #: inc/views/inpost/seo-settings-tt.php:136
134
  msgid "Robots Meta Settings"
135
  msgstr ""
136
 
@@ -146,60 +146,60 @@ msgstr ""
146
  msgid "Feed Settings"
147
  msgstr ""
148
 
149
- #: inc/classes/admin-pages.class.php:796 inc/classes/admin-pages.class.php:807
150
  msgctxt "Button hover"
151
  msgid "Select social image"
152
  msgstr ""
153
 
154
- #: inc/classes/admin-pages.class.php:801 inc/classes/admin-pages.class.php:806
155
  msgid "Select Image"
156
  msgstr ""
157
 
158
- #: inc/classes/admin-pages.class.php:808
159
  msgid "Change Image"
160
  msgstr ""
161
 
162
- #: inc/classes/admin-pages.class.php:809
163
  msgid "Remove Image"
164
  msgstr ""
165
 
166
- #: inc/classes/admin-pages.class.php:810
167
  msgid "Remove selected social image"
168
  msgstr ""
169
 
170
- #: inc/classes/admin-pages.class.php:811
171
  msgctxt "Frame title"
172
  msgid "Select Social Image"
173
  msgstr ""
174
 
175
- #: inc/classes/admin-pages.class.php:812 inc/classes/admin-pages.class.php:858
176
  msgid "Use this image"
177
  msgstr ""
178
 
179
- #: inc/classes/admin-pages.class.php:847 inc/classes/admin-pages.class.php:852
180
  msgid "Select Logo"
181
  msgstr ""
182
 
183
- #: inc/classes/admin-pages.class.php:854
184
  msgid "Change Logo"
185
  msgstr ""
186
 
187
- #: inc/classes/admin-pages.class.php:855
188
  msgid "Remove Logo"
189
  msgstr ""
190
 
191
- #: inc/classes/admin-pages.class.php:856
192
  msgid "Unset selected logo"
193
  msgstr ""
194
 
195
- #: inc/classes/admin-pages.class.php:857
196
  msgctxt "Frame title"
197
  msgid "Select Logo"
198
  msgstr ""
199
 
200
  #. translators: %s = number
201
 
202
- #: inc/classes/admin-pages.class.php:895
203
  msgid "Characters Used: %s"
204
  msgstr ""
205
 
@@ -277,226 +277,226 @@ msgstr ""
277
  msgid "No Archive"
278
  msgstr ""
279
 
280
- #: inc/classes/doing-it-right.class.php:371
281
  msgid "Refresh to see the SEO Bar status."
282
  msgstr ""
283
 
284
- #: inc/classes/doing-it-right.class.php:455
285
  msgid "Post"
286
  msgstr ""
287
 
288
  #. translators: %s = Post type name
289
 
290
- #: inc/classes/doing-it-right.class.php:459 inc/classes/inpost.class.php:310
291
- #: inc/classes/term-data.class.php:361
292
- #: inc/views/metaboxes/schema-metabox.php:197
293
  msgid "Page"
294
  msgstr ""
295
 
296
- #: inc/classes/doing-it-right.class.php:503
297
  msgid "Failed to fetch post ID."
298
  msgstr ""
299
 
300
  #. translators: %s = But or And
301
 
302
- #: inc/classes/doing-it-right.class.php:898
303
  msgid "%s the Title contains the Blogname multiple times."
304
  msgstr ""
305
 
306
  #. translators: 1: Word, 2: Occurrences
307
 
308
- #: inc/classes/doing-it-right.class.php:1069
309
  msgid "%1$s is used %2$d times."
310
  msgstr ""
311
 
312
  #. Translators: %s = Post / Page / Category, etc.
313
 
314
- #: inc/classes/doing-it-right.class.php:1114
315
  msgid "%s is being indexed."
316
  msgstr ""
317
 
318
- #: inc/classes/doing-it-right.class.php:1123
319
  msgid "But you've discouraged indexing for the whole site."
320
  msgstr ""
321
 
322
  #. translators: 1: But or And, 2: Current taxonomy term plural label
323
 
324
- #: inc/classes/doing-it-right.class.php:1147
325
  msgid "%1$s indexing for %2$s have been discouraged."
326
  msgstr ""
327
 
328
  #. translators: 1 = But or And, 1 = Post/Page
329
 
330
- #: inc/classes/doing-it-right.class.php:1160
331
  msgid "%1$s the %2$s is protected from public visibility. This means indexing is discouraged."
332
  msgstr ""
333
 
334
  #. translators: %s = But or And
335
 
336
- #: inc/classes/doing-it-right.class.php:1169
337
  msgid "%s the blog isn't set to public. This means WordPress discourages indexing."
338
  msgstr ""
339
 
340
  #. translators: %s = But or And
341
 
342
- #: inc/classes/doing-it-right.class.php:1183
343
  msgid "%s there are no posts in this term; therefore, indexing has been discouraged."
344
  msgstr ""
345
 
346
- #: inc/classes/doing-it-right.class.php:1267
347
  msgid "%s links aren't being followed."
348
  msgstr ""
349
 
350
- #: inc/classes/doing-it-right.class.php:1273
351
  msgid "%s links are being followed."
352
  msgstr ""
353
 
354
  #. translators: %s = But or And
355
 
356
- #: inc/classes/doing-it-right.class.php:1285
357
  msgid "%s you've discouraged the following of links for the whole site."
358
  msgstr ""
359
 
360
  #. translators: 1: But or And, 2: Current taxonomy term plural label
361
 
362
- #: inc/classes/doing-it-right.class.php:1311
363
  msgid "%1$s following for %2$s have been discouraged."
364
  msgstr ""
365
 
366
  #. translators: %s = But or And
367
 
368
- #: inc/classes/doing-it-right.class.php:1323
369
  msgid "%s the blog isn't set to public. This means WordPress allows the links to be followed regardless."
370
  msgstr ""
371
 
372
- #: inc/classes/doing-it-right.class.php:1375
373
  msgid "Search Engines aren't allowed to archive this %s."
374
  msgstr ""
375
 
376
- #: inc/classes/doing-it-right.class.php:1380
377
  msgid "Search Engines are allowed to archive this %s."
378
  msgstr ""
379
 
380
- #: inc/classes/doing-it-right.class.php:1392
381
  msgid "But you've discouraged archiving for the whole site."
382
  msgstr ""
383
 
384
  #. translators: 1: But or And, 2: Current taxonomy term plural label
385
 
386
- #: inc/classes/doing-it-right.class.php:1418
387
  msgid "%1$s archiving for %2$s have been discouraged."
388
  msgstr ""
389
 
390
  #. translators: %s = But or And
391
 
392
- #: inc/classes/doing-it-right.class.php:1431
393
  msgid "%s the blog isn't set to public. This means WordPress allows the blog to be archived regardless."
394
  msgstr ""
395
 
396
- #: inc/classes/doing-it-right.class.php:1477
397
  msgid "%s isn't being redirected."
398
  msgstr ""
399
 
400
- #: inc/classes/doing-it-right.class.php:1519
401
- #: inc/classes/doing-it-right.class.php:1548
402
  msgid "%s is being redirected. This means no SEO values have to be set."
403
  msgstr ""
404
 
405
- #: inc/classes/doing-it-right.class.php:1522
406
- #: inc/classes/doing-it-right.class.php:1564
407
  msgid "%s is not being indexed. This means no SEO values have to be set."
408
  msgstr ""
409
 
410
- #: inc/classes/doing-it-right.class.php:1678
411
  msgid "Title:"
412
  msgstr ""
413
 
414
- #: inc/classes/doing-it-right.class.php:1679
415
  msgid "Description:"
416
  msgstr ""
417
 
418
- #: inc/classes/doing-it-right.class.php:1680
419
  msgid "Index:"
420
  msgstr ""
421
 
422
- #: inc/classes/doing-it-right.class.php:1681
423
  msgid "Follow:"
424
  msgstr ""
425
 
426
- #: inc/classes/doing-it-right.class.php:1682
427
  msgid "Archive:"
428
  msgstr ""
429
 
430
- #: inc/classes/doing-it-right.class.php:1683
431
  msgid "Redirect:"
432
  msgstr ""
433
 
434
- #: inc/classes/doing-it-right.class.php:1685
435
  msgid "Generated: Automatically generated."
436
  msgstr ""
437
 
438
- #: inc/classes/doing-it-right.class.php:1687
439
  msgctxt "Generated"
440
  msgid "G"
441
  msgstr ""
442
 
443
- #: inc/classes/doing-it-right.class.php:1688
444
  msgctxt "Title"
445
  msgid "T"
446
  msgstr ""
447
 
448
- #: inc/classes/doing-it-right.class.php:1689
449
  msgctxt "Description"
450
  msgid "D"
451
  msgstr ""
452
 
453
- #: inc/classes/doing-it-right.class.php:1690
454
  msgctxt "no-Index"
455
  msgid "I"
456
  msgstr ""
457
 
458
- #: inc/classes/doing-it-right.class.php:1691
459
  msgctxt "no-Follow"
460
  msgid "F"
461
  msgstr ""
462
 
463
- #: inc/classes/doing-it-right.class.php:1692
464
  msgctxt "no-Archive"
465
  msgid "A"
466
  msgstr ""
467
 
468
- #: inc/classes/doing-it-right.class.php:1693
469
  msgctxt "Redirect"
470
  msgid "R"
471
  msgstr ""
472
 
473
- #: inc/classes/doing-it-right.class.php:1695
474
  msgctxt "But there are..."
475
  msgid "But"
476
  msgstr ""
477
 
478
- #: inc/classes/doing-it-right.class.php:1696
479
  msgctxt "And there are..."
480
  msgid "And"
481
  msgstr ""
482
 
483
- #: inc/classes/doing-it-right.class.php:1698
484
  msgid "Length is far too short."
485
  msgstr ""
486
 
487
- #: inc/classes/doing-it-right.class.php:1699
488
  msgid "Length is too short."
489
  msgstr ""
490
 
491
- #: inc/classes/doing-it-right.class.php:1700
492
  msgid "Length is too long."
493
  msgstr ""
494
 
495
- #: inc/classes/doing-it-right.class.php:1701
496
  msgid "Length is far too long."
497
  msgstr ""
498
 
499
- #: inc/classes/doing-it-right.class.php:1702
500
  msgid "Length is good."
501
  msgstr ""
502
 
@@ -507,21 +507,21 @@ msgstr ""
507
 
508
  #. translators: 1: Title, 2: Separator, 3: Excerpt
509
 
510
- #: inc/classes/generate-description.class.php:451
511
  msgctxt "1: Title, 2: Separator, 3: Excerpt"
512
  msgid "%1$s %2$s %3$s"
513
  msgstr ""
514
 
515
  #. translators: 1: Title, 2: on, 3: Blogname
516
 
517
- #: inc/classes/generate-description.class.php:658
518
  msgctxt "1: Title, 2: on, 3: Blogname"
519
  msgid "%1$s %2$s %3$s"
520
  msgstr ""
521
 
522
  #. translators: Front-end output.
523
 
524
- #: inc/classes/generate-description.class.php:695
525
  #: inc/views/metaboxes/description-metabox.php:18
526
  msgctxt "Placement. e.g. Post Title \"on\" Blog Name"
527
  msgid "on"
@@ -529,7 +529,7 @@ msgstr ""
529
 
530
  #. translators: Front-end output.
531
 
532
- #: inc/classes/generate-description.class.php:783
533
  msgid "Latest posts:"
534
  msgstr ""
535
 
@@ -541,158 +541,158 @@ msgstr ""
541
  #. translators: Front-end output. 1: Taxonomy singular name, 2: Current
542
  #. taxonomy term
543
 
544
- #: inc/classes/generate-title.class.php:837
545
- #: inc/classes/generate-title.class.php:897
546
  msgid "%1$s: %2$s"
547
  msgstr ""
548
 
549
  #. translators: Front-end output.
550
 
551
- #: inc/classes/generate-title.class.php:841
552
  msgid "Author: %s"
553
  msgstr ""
554
 
555
  #. translators: Front-end output.
556
 
557
- #: inc/classes/generate-title.class.php:845
558
  msgctxt "yearly archives date format"
559
  msgid "Y"
560
  msgstr ""
561
 
562
  #. translators: Front-end output.
563
 
564
- #: inc/classes/generate-title.class.php:847
565
  msgid "Year: %s"
566
  msgstr ""
567
 
568
  #. translators: Front-end output.
569
 
570
- #: inc/classes/generate-title.class.php:850
571
  msgctxt "monthly archives date format"
572
  msgid "F Y"
573
  msgstr ""
574
 
575
  #. translators: Front-end output.
576
 
577
- #: inc/classes/generate-title.class.php:852
578
  msgid "Month: %s"
579
  msgstr ""
580
 
581
  #. translators: Front-end output.
582
 
583
- #: inc/classes/generate-title.class.php:855
584
  msgctxt "daily archives date format"
585
  msgid "F j, Y"
586
  msgstr ""
587
 
588
  #. translators: Front-end output.
589
 
590
- #: inc/classes/generate-title.class.php:857
591
  msgid "Day: %s"
592
  msgstr ""
593
 
594
  #. translators: Front-end output.
595
 
596
- #: inc/classes/generate-title.class.php:862
597
  msgctxt "post format archive title"
598
  msgid "Asides"
599
  msgstr ""
600
 
601
  #. translators: Front-end output.
602
 
603
- #: inc/classes/generate-title.class.php:865
604
  msgctxt "post format archive title"
605
  msgid "Galleries"
606
  msgstr ""
607
 
608
  #. translators: Front-end output.
609
 
610
- #: inc/classes/generate-title.class.php:868
611
  msgctxt "post format archive title"
612
  msgid "Images"
613
  msgstr ""
614
 
615
  #. translators: Front-end output.
616
 
617
- #: inc/classes/generate-title.class.php:871
618
  msgctxt "post format archive title"
619
  msgid "Videos"
620
  msgstr ""
621
 
622
  #. translators: Front-end output.
623
 
624
- #: inc/classes/generate-title.class.php:874
625
  msgctxt "post format archive title"
626
  msgid "Quotes"
627
  msgstr ""
628
 
629
  #. translators: Front-end output.
630
 
631
- #: inc/classes/generate-title.class.php:877
632
  msgctxt "post format archive title"
633
  msgid "Links"
634
  msgstr ""
635
 
636
  #. translators: Front-end output.
637
 
638
- #: inc/classes/generate-title.class.php:880
639
  msgctxt "post format archive title"
640
  msgid "Statuses"
641
  msgstr ""
642
 
643
  #. translators: Front-end output.
644
 
645
- #: inc/classes/generate-title.class.php:883
646
  msgctxt "post format archive title"
647
  msgid "Audio"
648
  msgstr ""
649
 
650
  #. translators: Front-end output.
651
 
652
- #: inc/classes/generate-title.class.php:886
653
  msgctxt "post format archive title"
654
  msgid "Chats"
655
  msgstr ""
656
 
657
  #. translators: Front-end output.
658
 
659
- #: inc/classes/generate-title.class.php:891
660
  msgid "Archives: %s"
661
  msgstr ""
662
 
663
  #. translators: Front-end output.
664
 
665
- #: inc/classes/generate-title.class.php:901
666
  msgid "Archives"
667
  msgstr ""
668
 
669
  #. translators: Front-end output.
670
 
671
- #: inc/classes/generate-title.class.php:1015
672
  msgid "Untitled"
673
  msgstr ""
674
 
675
  #. translators: Front-end output.
676
 
677
- #: inc/classes/generate-title.class.php:1050
678
  msgid "Search results for:"
679
  msgstr ""
680
 
681
  #. translators: Front-end output.
682
 
683
- #: inc/classes/generate-title.class.php:1226
684
  msgid "Protected: %s"
685
  msgstr ""
686
 
687
  #. translators: Front-end output.
688
 
689
- #: inc/classes/generate-title.class.php:1230
690
  msgid "Private: %s"
691
  msgstr ""
692
 
693
  #. translators: %d = page number. Front-end output.
694
 
695
- #: inc/classes/generate-title.class.php:1278
696
  msgid "Page %d"
697
  msgstr ""
698
 
@@ -707,7 +707,7 @@ msgstr ""
707
  #. translators: %s = Post Type
708
  #. translators: %s = Term type
709
 
710
- #: inc/classes/inpost.class.php:230 inc/views/inpost/seo-settings-tt.php:73
711
  msgid "%s SEO Settings"
712
  msgstr ""
713
 
@@ -731,25 +731,25 @@ msgstr ""
731
 
732
  #. translators: %s = 'The SEO Framework'
733
 
734
- #: inc/classes/render.class.php:1099
735
  msgid "Start %s"
736
  msgstr ""
737
 
738
  #. translators: %s = 'The SEO Framework'
739
 
740
- #: inc/classes/render.class.php:1101
741
  msgid "End %s"
742
  msgstr ""
743
 
744
- #: inc/classes/render.class.php:1102
745
  msgid "by Sybre Waaijer"
746
  msgstr ""
747
 
748
- #: inc/classes/site-options.class.php:439
749
  msgid "here"
750
  msgstr ""
751
 
752
- #: inc/classes/site-options.class.php:440
753
  msgctxt "%s = here"
754
  msgid "View the new options %s."
755
  msgstr ""
@@ -762,11 +762,11 @@ msgstr ""
762
  msgid "Sitemap is served from cache"
763
  msgstr ""
764
 
765
- #: inc/classes/sitemaps.class.php:609
766
  msgid "Sitemap is generated on"
767
  msgstr ""
768
 
769
- #: inc/classes/term-data.class.php:363
770
  msgid "Pages"
771
  msgstr ""
772
 
@@ -789,17 +789,17 @@ msgid "General"
789
  msgstr ""
790
 
791
  #: inc/views/inpost/seo-settings-singular.php:44
792
- msgid "Visibility"
 
793
  msgstr ""
794
 
795
  #: inc/views/inpost/seo-settings-singular.php:50
796
- #: inc/views/metaboxes/homepage-metabox.php:45
797
- msgid "Social"
798
  msgstr ""
799
 
800
  #: inc/views/inpost/seo-settings-singular.php:87
801
- #: inc/views/inpost/seo-settings-tt.php:81
802
- #: inc/views/inpost/seo-settings-tt.php:195
803
  msgid "Doing it Right"
804
  msgstr ""
805
 
@@ -818,113 +818,127 @@ msgstr ""
818
  msgid "Custom %s Description"
819
  msgstr ""
820
 
821
- #: inc/views/inpost/seo-settings-singular.php:165
822
  msgid "Custom Canonical URL"
823
  msgstr ""
824
 
825
- #: inc/views/inpost/seo-settings-singular.php:169
826
  msgid "This urges search engines to go to the outputted URL."
827
  msgstr ""
828
 
829
  #. translators: 1: Option, 2: Post or Page
830
 
831
- #: inc/views/inpost/seo-settings-singular.php:196
832
- #: inc/views/inpost/seo-settings-singular.php:212
833
- #: inc/views/inpost/seo-settings-singular.php:226
834
  msgid "Apply %1$s to this %2$s"
835
  msgstr ""
836
 
837
- #: inc/views/inpost/seo-settings-singular.php:200
838
  msgid "This tells search engines not to show this %s in their search results."
839
  msgstr ""
840
 
841
- #: inc/views/inpost/seo-settings-singular.php:215
842
  msgid "This tells search engines not to follow links on this %s."
843
  msgstr ""
844
 
845
  #. translators: %s = Post type name
846
 
847
- #: inc/views/inpost/seo-settings-singular.php:234
848
  msgid "This tells search engines not to save a cached copy of this %s."
849
  msgstr ""
850
 
851
- #: inc/views/inpost/seo-settings-singular.php:255
852
  msgid "Archive Settings"
853
  msgstr ""
854
 
855
  #. translators: %s = Post type name
856
 
857
- #: inc/views/inpost/seo-settings-singular.php:265
858
  msgid "Exclude this %s from local search"
859
  msgstr ""
860
 
861
  #. translators: %s = Post type name
862
 
863
- #: inc/views/inpost/seo-settings-singular.php:268
864
  msgid "This excludes this %s from local on-site search results."
865
  msgstr ""
866
 
867
  #. translators: %s = Post type name
868
 
869
- #: inc/views/inpost/seo-settings-singular.php:278
870
  msgid "Exclude this %s from all archive listings."
871
  msgstr ""
872
 
873
  #. translators: %s = Post type name
874
 
875
- #: inc/views/inpost/seo-settings-singular.php:281
876
  msgid "This excludes this %s from on-site archive pages."
877
  msgstr ""
878
 
879
- #: inc/views/inpost/seo-settings-singular.php:295
880
  msgid "Custom 301 Redirect URL"
881
  msgstr ""
882
 
883
- #: inc/views/inpost/seo-settings-singular.php:300
884
  msgid "This will force visitors to go to another URL."
885
  msgstr ""
886
 
887
- #: inc/views/inpost/seo-settings-singular.php:324
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
888
  msgid "Custom Social Image URL"
889
  msgstr ""
890
 
891
  #. translators: %s = Post type name
892
 
893
- #: inc/views/inpost/seo-settings-singular.php:330
894
  msgid "Set preferred %s Social Image URL location."
895
  msgstr ""
896
 
 
 
 
 
 
 
 
 
 
 
 
897
  #. translators: %s = Term type
898
 
899
- #: inc/views/inpost/seo-settings-tt.php:94
900
  msgid "%s Title"
901
  msgstr ""
902
 
903
  #. translators: %s = Term type
904
 
905
- #: inc/views/inpost/seo-settings-tt.php:119
906
  msgid "%s Meta Description"
907
  msgstr ""
908
 
909
  #. translators: %s = noindex/nofollow/noarchive
910
 
911
- #: inc/views/inpost/seo-settings-tt.php:142
912
- #: inc/views/inpost/seo-settings-tt.php:158
913
- #: inc/views/inpost/seo-settings-tt.php:174
914
  msgid "Apply %s to this term?"
915
  msgstr ""
916
 
917
- #: inc/views/inpost/seo-settings-tt.php:146
918
- #: inc/views/metaboxes/homepage-metabox.php:361
919
- msgid "This tells search engines not to show this page in their search results."
920
- msgstr ""
921
-
922
- #: inc/views/inpost/seo-settings-tt.php:162
923
- #: inc/views/inpost/seo-settings-tt.php:178
924
- #: inc/views/metaboxes/homepage-metabox.php:371
925
- msgid "This tells search engines not to follow links on this page."
926
- msgstr ""
927
-
928
  #: inc/views/metaboxes/description-metabox.php:17
929
  msgid "Example Title"
930
  msgstr ""
@@ -938,7 +952,7 @@ msgid "Automated Description Settings"
938
  msgstr ""
939
 
940
  #: inc/views/metaboxes/description-metabox.php:42
941
- #: inc/views/metaboxes/homepage-metabox.php:244
942
  msgid "The meta description can be used to determine the text used under the title on Search Engine results pages."
943
  msgstr ""
944
 
@@ -1322,8 +1336,8 @@ msgid "Description"
1322
  msgstr ""
1323
 
1324
  #: inc/views/metaboxes/homepage-metabox.php:71
1325
- #: inc/views/metaboxes/homepage-metabox.php:281
1326
- #: inc/views/metaboxes/homepage-metabox.php:328
1327
  #: inc/views/metaboxes/social-metabox.php:318
1328
  msgid "Home Page"
1329
  msgstr ""
@@ -1347,99 +1361,99 @@ msgstr ""
1347
  #. translators: %s = Home page URL markdown
1348
 
1349
  #: inc/views/metaboxes/homepage-metabox.php:215
1350
- #: inc/views/metaboxes/homepage-metabox.php:260
1351
  msgid "A plugin has been detected that suggests to maintain this option on the [Home Page](%s)."
1352
  msgstr ""
1353
 
1354
- #: inc/views/metaboxes/homepage-metabox.php:286
1355
  #: inc/views/metaboxes/title-metabox.php:135
1356
  msgid "Title Additions Location"
1357
  msgstr ""
1358
 
1359
- #: inc/views/metaboxes/homepage-metabox.php:287
1360
  #: inc/views/metaboxes/title-metabox.php:136
1361
  msgid "This setting determines which side the added title text will go on."
1362
  msgstr ""
1363
 
1364
- #: inc/views/metaboxes/homepage-metabox.php:294
1365
  #: inc/views/metaboxes/title-metabox.php:142
1366
  msgid "Left:"
1367
  msgstr ""
1368
 
1369
- #: inc/views/metaboxes/homepage-metabox.php:304
1370
  #: inc/views/metaboxes/title-metabox.php:149
1371
  msgid "Right:"
1372
  msgstr ""
1373
 
1374
- #: inc/views/metaboxes/homepage-metabox.php:315
1375
  msgid "%s Tagline"
1376
  msgstr ""
1377
 
1378
- #: inc/views/metaboxes/homepage-metabox.php:319
1379
  msgid "Add site description (tagline) to the Title on the %s?"
1380
  msgstr ""
1381
 
1382
- #: inc/views/metaboxes/homepage-metabox.php:345
1383
  msgid "View Home Page Settings"
1384
  msgstr ""
1385
 
1386
- #: inc/views/metaboxes/homepage-metabox.php:345
1387
  msgid "Checked in Page"
1388
  msgstr ""
1389
 
1390
- #: inc/views/metaboxes/homepage-metabox.php:349
1391
  msgid "Home Page Robots Meta Settings"
1392
  msgstr ""
1393
 
1394
  #. translators: 1: Option, 2: Location
1395
 
1396
- #: inc/views/metaboxes/homepage-metabox.php:358
1397
- #: inc/views/metaboxes/homepage-metabox.php:368
1398
- #: inc/views/metaboxes/homepage-metabox.php:378
1399
  msgid "Apply %1$s to the %2$s?"
1400
  msgstr ""
1401
 
1402
- #: inc/views/metaboxes/homepage-metabox.php:381
1403
  msgid "This tells search engines not to save a cached copy of this page."
1404
  msgstr ""
1405
 
1406
- #: inc/views/metaboxes/homepage-metabox.php:413
1407
  msgid "Note: If any of these options are unchecked, but are checked on the Home Page, they will be outputted regardless."
1408
  msgstr ""
1409
 
1410
- #: inc/views/metaboxes/homepage-metabox.php:419
1411
  msgid "Home Page Pagination Robots Settings"
1412
  msgstr ""
1413
 
1414
- #: inc/views/metaboxes/homepage-metabox.php:420
1415
  msgid "If your Home Page is paginated and outputs content that's also found elsewhere on the website, enabling this option might prevent duplicate content."
1416
  msgstr ""
1417
 
1418
  #. translators: 1: Option, 2: Location
1419
 
1420
- #: inc/views/metaboxes/homepage-metabox.php:428
1421
  msgid "Apply %1$s to every second or later page on the %2$s?"
1422
  msgstr ""
1423
 
1424
- #: inc/views/metaboxes/homepage-metabox.php:438
1425
  #: inc/views/metaboxes/social-metabox.php:115
1426
  msgid "Social Image Settings"
1427
  msgstr ""
1428
 
1429
- #: inc/views/metaboxes/homepage-metabox.php:440
1430
  msgid "A social image can be displayed when your homepage is shared. It is a great way to grab attention."
1431
  msgstr ""
1432
 
1433
- #: inc/views/metaboxes/homepage-metabox.php:469
1434
  msgid "Custom Homepage Image URL"
1435
  msgstr ""
1436
 
1437
- #: inc/views/metaboxes/homepage-metabox.php:470
1438
  msgid "Set preferred homepage Social Image URL location."
1439
  msgstr ""
1440
 
1441
  #: inc/views/metaboxes/robots-metabox.php:13
1442
- #: inc/views/metaboxes/title-metabox.php:194
1443
  msgid "Category"
1444
  msgstr ""
1445
 
@@ -1690,21 +1704,25 @@ msgstr ""
1690
  msgid "Add the link that leads directly to the social page of this website."
1691
  msgstr ""
1692
 
1693
- #: inc/views/metaboxes/schema-metabox.php:187
 
 
 
 
1694
  msgctxt "No spaces. E.g. https://facebook.com/RelatedProfile"
1695
  msgid "RelatedProfile"
1696
  msgstr ""
1697
 
1698
- #: inc/views/metaboxes/schema-metabox.php:188
1699
  msgctxt "Social Profile"
1700
  msgid "Profile"
1701
  msgstr ""
1702
 
1703
- #: inc/views/metaboxes/schema-metabox.php:253
1704
  msgid "Blog"
1705
  msgstr ""
1706
 
1707
- #: inc/views/metaboxes/schema-metabox.php:267
1708
  msgid "View your profile."
1709
  msgstr ""
1710
 
@@ -2109,47 +2127,47 @@ msgstr ""
2109
  msgid "The Home Page has a specific option."
2110
  msgstr ""
2111
 
2112
- #: inc/views/metaboxes/title-metabox.php:163
2113
  msgid "Remove Blogname from Title"
2114
  msgstr ""
2115
 
2116
- #: inc/views/metaboxes/title-metabox.php:167
2117
  msgid "This might decouple your posts and pages from the rest of the website."
2118
  msgstr ""
2119
 
2120
- #: inc/views/metaboxes/title-metabox.php:175
2121
  msgid "Remove Blogname from title?"
2122
  msgstr ""
2123
 
2124
- #: inc/views/metaboxes/title-metabox.php:184
2125
  msgid "Only use this option if you are aware of its SEO effects."
2126
  msgstr ""
2127
 
2128
- #: inc/views/metaboxes/title-metabox.php:210
2129
  msgid "Example Category"
2130
  msgstr ""
2131
 
2132
- #: inc/views/metaboxes/title-metabox.php:228
2133
  msgid "Title prefix options"
2134
  msgstr ""
2135
 
2136
- #: inc/views/metaboxes/title-metabox.php:229
2137
  msgid "On archives a descriptive prefix may be added to the title."
2138
  msgstr ""
2139
 
2140
- #: inc/views/metaboxes/title-metabox.php:232
2141
  msgid "Example Automated Archive Title Output"
2142
  msgstr ""
2143
 
2144
- #: inc/views/metaboxes/title-metabox.php:240
2145
  msgid "Remove Archive Title Prefixes"
2146
  msgstr ""
2147
 
2148
- #: inc/views/metaboxes/title-metabox.php:244
2149
  msgid "Remove prefixes from title?"
2150
  msgstr ""
2151
 
2152
- #: inc/views/metaboxes/title-metabox.php:248
2153
  msgid "The prefix helps visitors and search engines determine what kind of page they're visiting."
2154
  msgstr ""
2155
 
1
+ # Copyright (C) 2018 The SEO Framework
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 3.0.4\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/autodescription\n"
7
+ "POT-Creation-Date: 2018-02-26 01:19:08+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
11
+ "PO-Revision-Date: 2018-MO-DA HO:MI+ZONE\n"
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
14
 
15
  #. translators: %s = term name
16
 
17
+ #: inc/classes/admin-init.class.php:253
18
  msgid "Make primary %s"
19
  msgstr ""
20
 
21
  #. translators: %s = term name
22
 
23
+ #: inc/classes/admin-init.class.php:255
24
  msgid "Primary %s"
25
  msgstr ""
26
 
27
+ #: inc/classes/admin-init.class.php:352
28
  msgid "The changes you made will be lost if you navigate away from this page."
29
  msgstr ""
30
 
31
+ #: inc/classes/admin-init.class.php:353
32
  msgid "Are you sure you want to reset all SEO settings to their defaults?"
33
  msgstr ""
34
 
35
+ #: inc/classes/admin-init.class.php:354
36
  msgid "Good"
37
  msgstr ""
38
 
39
+ #: inc/classes/admin-init.class.php:355
40
  msgid "Okay"
41
  msgstr ""
42
 
43
+ #: inc/classes/admin-init.class.php:356
44
  msgid "Bad"
45
  msgstr ""
46
 
47
+ #: inc/classes/admin-init.class.php:357
48
  msgid "Unknown"
49
  msgstr ""
50
 
51
+ #: inc/classes/admin-init.class.php:358
52
  msgid "Private:"
53
  msgstr ""
54
 
55
+ #: inc/classes/admin-init.class.php:359
56
  msgid "Protected:"
57
  msgstr ""
58
 
59
  #. translators: Pixel counter. 1: width, 2: guideline
60
 
61
+ #: inc/classes/admin-init.class.php:361
62
  msgid "%1$d out of %2$d pixels are used."
63
  msgstr ""
64
 
65
  #. translators: %s = Redirect URL markdown
66
 
67
+ #: inc/classes/admin-init.class.php:703
68
  msgid "There has been an error redirecting. Refresh the page or follow [this link](%s)."
69
  msgstr ""
70
 
71
+ #: inc/classes/admin-init.class.php:789 inc/classes/admin-init.class.php:850
72
  msgid "Image could not be processed."
73
  msgstr ""
74
 
96
  msgid "New SEO Settings have been updated."
97
  msgstr ""
98
 
99
+ #: inc/classes/admin-pages.class.php:109 inc/classes/site-options.class.php:440
100
  msgid "SEO Settings"
101
  msgstr ""
102
 
129
  msgstr ""
130
 
131
  #: inc/classes/admin-pages.class.php:295
132
+ #: inc/views/inpost/seo-settings-singular.php:187
133
+ #: inc/views/inpost/seo-settings-tt.php:164
134
  msgid "Robots Meta Settings"
135
  msgstr ""
136
 
146
  msgid "Feed Settings"
147
  msgstr ""
148
 
149
+ #: inc/classes/admin-pages.class.php:802 inc/classes/admin-pages.class.php:813
150
  msgctxt "Button hover"
151
  msgid "Select social image"
152
  msgstr ""
153
 
154
+ #: inc/classes/admin-pages.class.php:807 inc/classes/admin-pages.class.php:812
155
  msgid "Select Image"
156
  msgstr ""
157
 
158
+ #: inc/classes/admin-pages.class.php:814
159
  msgid "Change Image"
160
  msgstr ""
161
 
162
+ #: inc/classes/admin-pages.class.php:815
163
  msgid "Remove Image"
164
  msgstr ""
165
 
166
+ #: inc/classes/admin-pages.class.php:816
167
  msgid "Remove selected social image"
168
  msgstr ""
169
 
170
+ #: inc/classes/admin-pages.class.php:817
171
  msgctxt "Frame title"
172
  msgid "Select Social Image"
173
  msgstr ""
174
 
175
+ #: inc/classes/admin-pages.class.php:818 inc/classes/admin-pages.class.php:864
176
  msgid "Use this image"
177
  msgstr ""
178
 
179
+ #: inc/classes/admin-pages.class.php:853 inc/classes/admin-pages.class.php:858
180
  msgid "Select Logo"
181
  msgstr ""
182
 
183
+ #: inc/classes/admin-pages.class.php:860
184
  msgid "Change Logo"
185
  msgstr ""
186
 
187
+ #: inc/classes/admin-pages.class.php:861
188
  msgid "Remove Logo"
189
  msgstr ""
190
 
191
+ #: inc/classes/admin-pages.class.php:862
192
  msgid "Unset selected logo"
193
  msgstr ""
194
 
195
+ #: inc/classes/admin-pages.class.php:863
196
  msgctxt "Frame title"
197
  msgid "Select Logo"
198
  msgstr ""
199
 
200
  #. translators: %s = number
201
 
202
+ #: inc/classes/admin-pages.class.php:913
203
  msgid "Characters Used: %s"
204
  msgstr ""
205
 
277
  msgid "No Archive"
278
  msgstr ""
279
 
280
+ #: inc/classes/doing-it-right.class.php:427
281
  msgid "Refresh to see the SEO Bar status."
282
  msgstr ""
283
 
284
+ #: inc/classes/doing-it-right.class.php:513
285
  msgid "Post"
286
  msgstr ""
287
 
288
  #. translators: %s = Post type name
289
 
290
+ #: inc/classes/doing-it-right.class.php:517 inc/classes/inpost.class.php:310
291
+ #: inc/classes/term-data.class.php:366
292
+ #: inc/views/metaboxes/schema-metabox.php:198
293
  msgid "Page"
294
  msgstr ""
295
 
296
+ #: inc/classes/doing-it-right.class.php:561
297
  msgid "Failed to fetch post ID."
298
  msgstr ""
299
 
300
  #. translators: %s = But or And
301
 
302
+ #: inc/classes/doing-it-right.class.php:956
303
  msgid "%s the Title contains the Blogname multiple times."
304
  msgstr ""
305
 
306
  #. translators: 1: Word, 2: Occurrences
307
 
308
+ #: inc/classes/doing-it-right.class.php:1129
309
  msgid "%1$s is used %2$d times."
310
  msgstr ""
311
 
312
  #. Translators: %s = Post / Page / Category, etc.
313
 
314
+ #: inc/classes/doing-it-right.class.php:1174
315
  msgid "%s is being indexed."
316
  msgstr ""
317
 
318
+ #: inc/classes/doing-it-right.class.php:1183
319
  msgid "But you've discouraged indexing for the whole site."
320
  msgstr ""
321
 
322
  #. translators: 1: But or And, 2: Current taxonomy term plural label
323
 
324
+ #: inc/classes/doing-it-right.class.php:1207
325
  msgid "%1$s indexing for %2$s have been discouraged."
326
  msgstr ""
327
 
328
  #. translators: 1 = But or And, 1 = Post/Page
329
 
330
+ #: inc/classes/doing-it-right.class.php:1220
331
  msgid "%1$s the %2$s is protected from public visibility. This means indexing is discouraged."
332
  msgstr ""
333
 
334
  #. translators: %s = But or And
335
 
336
+ #: inc/classes/doing-it-right.class.php:1229
337
  msgid "%s the blog isn't set to public. This means WordPress discourages indexing."
338
  msgstr ""
339
 
340
  #. translators: %s = But or And
341
 
342
+ #: inc/classes/doing-it-right.class.php:1243
343
  msgid "%s there are no posts in this term; therefore, indexing has been discouraged."
344
  msgstr ""
345
 
346
+ #: inc/classes/doing-it-right.class.php:1327
347
  msgid "%s links aren't being followed."
348
  msgstr ""
349
 
350
+ #: inc/classes/doing-it-right.class.php:1333
351
  msgid "%s links are being followed."
352
  msgstr ""
353
 
354
  #. translators: %s = But or And
355
 
356
+ #: inc/classes/doing-it-right.class.php:1345
357
  msgid "%s you've discouraged the following of links for the whole site."
358
  msgstr ""
359
 
360
  #. translators: 1: But or And, 2: Current taxonomy term plural label
361
 
362
+ #: inc/classes/doing-it-right.class.php:1371
363
  msgid "%1$s following for %2$s have been discouraged."
364
  msgstr ""
365
 
366
  #. translators: %s = But or And
367
 
368
+ #: inc/classes/doing-it-right.class.php:1383
369
  msgid "%s the blog isn't set to public. This means WordPress allows the links to be followed regardless."
370
  msgstr ""
371
 
372
+ #: inc/classes/doing-it-right.class.php:1435
373
  msgid "Search Engines aren't allowed to archive this %s."
374
  msgstr ""
375
 
376
+ #: inc/classes/doing-it-right.class.php:1440
377
  msgid "Search Engines are allowed to archive this %s."
378
  msgstr ""
379
 
380
+ #: inc/classes/doing-it-right.class.php:1452
381
  msgid "But you've discouraged archiving for the whole site."
382
  msgstr ""
383
 
384
  #. translators: 1: But or And, 2: Current taxonomy term plural label
385
 
386
+ #: inc/classes/doing-it-right.class.php:1478
387
  msgid "%1$s archiving for %2$s have been discouraged."
388
  msgstr ""
389
 
390
  #. translators: %s = But or And
391
 
392
+ #: inc/classes/doing-it-right.class.php:1491
393
  msgid "%s the blog isn't set to public. This means WordPress allows the blog to be archived regardless."
394
  msgstr ""
395
 
396
+ #: inc/classes/doing-it-right.class.php:1537
397
  msgid "%s isn't being redirected."
398
  msgstr ""
399
 
400
+ #: inc/classes/doing-it-right.class.php:1579
401
+ #: inc/classes/doing-it-right.class.php:1608
402
  msgid "%s is being redirected. This means no SEO values have to be set."
403
  msgstr ""
404
 
405
+ #: inc/classes/doing-it-right.class.php:1582
406
+ #: inc/classes/doing-it-right.class.php:1624
407
  msgid "%s is not being indexed. This means no SEO values have to be set."
408
  msgstr ""
409
 
410
+ #: inc/classes/doing-it-right.class.php:1738
411
  msgid "Title:"
412
  msgstr ""
413
 
414
+ #: inc/classes/doing-it-right.class.php:1739
415
  msgid "Description:"
416
  msgstr ""
417
 
418
+ #: inc/classes/doing-it-right.class.php:1740
419
  msgid "Index:"
420
  msgstr ""
421
 
422
+ #: inc/classes/doing-it-right.class.php:1741
423
  msgid "Follow:"
424
  msgstr ""
425
 
426
+ #: inc/classes/doing-it-right.class.php:1742
427
  msgid "Archive:"
428
  msgstr ""
429
 
430
+ #: inc/classes/doing-it-right.class.php:1743
431
  msgid "Redirect:"
432
  msgstr ""
433
 
434
+ #: inc/classes/doing-it-right.class.php:1745
435
  msgid "Generated: Automatically generated."
436
  msgstr ""
437
 
438
+ #: inc/classes/doing-it-right.class.php:1747
439
  msgctxt "Generated"
440
  msgid "G"
441
  msgstr ""
442
 
443
+ #: inc/classes/doing-it-right.class.php:1748
444
  msgctxt "Title"
445
  msgid "T"
446
  msgstr ""
447
 
448
+ #: inc/classes/doing-it-right.class.php:1749
449
  msgctxt "Description"
450
  msgid "D"
451
  msgstr ""
452
 
453
+ #: inc/classes/doing-it-right.class.php:1750
454
  msgctxt "no-Index"
455
  msgid "I"
456
  msgstr ""
457
 
458
+ #: inc/classes/doing-it-right.class.php:1751
459
  msgctxt "no-Follow"
460
  msgid "F"
461
  msgstr ""
462
 
463
+ #: inc/classes/doing-it-right.class.php:1752
464
  msgctxt "no-Archive"
465
  msgid "A"
466
  msgstr ""
467
 
468
+ #: inc/classes/doing-it-right.class.php:1753
469
  msgctxt "Redirect"
470
  msgid "R"
471
  msgstr ""
472
 
473
+ #: inc/classes/doing-it-right.class.php:1755
474
  msgctxt "But there are..."
475
  msgid "But"
476
  msgstr ""
477
 
478
+ #: inc/classes/doing-it-right.class.php:1756
479
  msgctxt "And there are..."
480
  msgid "And"
481
  msgstr ""
482
 
483
+ #: inc/classes/doing-it-right.class.php:1758
484
  msgid "Length is far too short."
485
  msgstr ""
486
 
487
+ #: inc/classes/doing-it-right.class.php:1759
488
  msgid "Length is too short."
489
  msgstr ""
490
 
491
+ #: inc/classes/doing-it-right.class.php:1760
492
  msgid "Length is too long."
493
  msgstr ""
494
 
495
+ #: inc/classes/doing-it-right.class.php:1761
496
  msgid "Length is far too long."
497
  msgstr ""
498
 
499
+ #: inc/classes/doing-it-right.class.php:1762
500
  msgid "Length is good."
501
  msgstr ""
502
 
507
 
508
  #. translators: 1: Title, 2: Separator, 3: Excerpt
509
 
510
+ #: inc/classes/generate-description.class.php:539
511
  msgctxt "1: Title, 2: Separator, 3: Excerpt"
512
  msgid "%1$s %2$s %3$s"
513
  msgstr ""
514
 
515
  #. translators: 1: Title, 2: on, 3: Blogname
516
 
517
+ #: inc/classes/generate-description.class.php:748
518
  msgctxt "1: Title, 2: on, 3: Blogname"
519
  msgid "%1$s %2$s %3$s"
520
  msgstr ""
521
 
522
  #. translators: Front-end output.
523
 
524
+ #: inc/classes/generate-description.class.php:785
525
  #: inc/views/metaboxes/description-metabox.php:18
526
  msgctxt "Placement. e.g. Post Title \"on\" Blog Name"
527
  msgid "on"
529
 
530
  #. translators: Front-end output.
531
 
532
+ #: inc/classes/generate-description.class.php:873
533
  msgid "Latest posts:"
534
  msgstr ""
535
 
541
  #. translators: Front-end output. 1: Taxonomy singular name, 2: Current
542
  #. taxonomy term
543
 
544
+ #: inc/classes/generate-title.class.php:907
545
+ #: inc/classes/generate-title.class.php:967
546
  msgid "%1$s: %2$s"
547
  msgstr ""
548
 
549
  #. translators: Front-end output.
550
 
551
+ #: inc/classes/generate-title.class.php:911
552
  msgid "Author: %s"
553
  msgstr ""
554
 
555
  #. translators: Front-end output.
556
 
557
+ #: inc/classes/generate-title.class.php:915
558
  msgctxt "yearly archives date format"
559
  msgid "Y"
560
  msgstr ""
561
 
562
  #. translators: Front-end output.
563
 
564
+ #: inc/classes/generate-title.class.php:917
565
  msgid "Year: %s"
566
  msgstr ""
567
 
568
  #. translators: Front-end output.
569
 
570
+ #: inc/classes/generate-title.class.php:920
571
  msgctxt "monthly archives date format"
572
  msgid "F Y"
573
  msgstr ""
574
 
575
  #. translators: Front-end output.
576
 
577
+ #: inc/classes/generate-title.class.php:922
578
  msgid "Month: %s"
579
  msgstr ""
580
 
581
  #. translators: Front-end output.
582
 
583
+ #: inc/classes/generate-title.class.php:925
584
  msgctxt "daily archives date format"
585
  msgid "F j, Y"
586
  msgstr ""
587
 
588
  #. translators: Front-end output.
589
 
590
+ #: inc/classes/generate-title.class.php:927
591
  msgid "Day: %s"
592
  msgstr ""
593
 
594
  #. translators: Front-end output.
595
 
596
+ #: inc/classes/generate-title.class.php:932
597
  msgctxt "post format archive title"
598
  msgid "Asides"
599
  msgstr ""
600
 
601
  #. translators: Front-end output.
602
 
603
+ #: inc/classes/generate-title.class.php:935
604
  msgctxt "post format archive title"
605
  msgid "Galleries"
606
  msgstr ""
607
 
608
  #. translators: Front-end output.
609
 
610
+ #: inc/classes/generate-title.class.php:938
611
  msgctxt "post format archive title"
612
  msgid "Images"
613
  msgstr ""
614
 
615
  #. translators: Front-end output.
616
 
617
+ #: inc/classes/generate-title.class.php:941
618
  msgctxt "post format archive title"
619
  msgid "Videos"
620
  msgstr ""
621
 
622
  #. translators: Front-end output.
623
 
624
+ #: inc/classes/generate-title.class.php:944
625
  msgctxt "post format archive title"
626
  msgid "Quotes"
627
  msgstr ""
628
 
629
  #. translators: Front-end output.
630
 
631
+ #: inc/classes/generate-title.class.php:947
632
  msgctxt "post format archive title"
633
  msgid "Links"
634
  msgstr ""
635
 
636
  #. translators: Front-end output.
637
 
638
+ #: inc/classes/generate-title.class.php:950
639
  msgctxt "post format archive title"
640
  msgid "Statuses"
641
  msgstr ""
642
 
643
  #. translators: Front-end output.
644
 
645
+ #: inc/classes/generate-title.class.php:953
646
  msgctxt "post format archive title"
647
  msgid "Audio"
648
  msgstr ""
649
 
650
  #. translators: Front-end output.
651
 
652
+ #: inc/classes/generate-title.class.php:956
653
  msgctxt "post format archive title"
654
  msgid "Chats"
655
  msgstr ""
656
 
657
  #. translators: Front-end output.
658
 
659
+ #: inc/classes/generate-title.class.php:961
660
  msgid "Archives: %s"
661
  msgstr ""
662
 
663
  #. translators: Front-end output.
664
 
665
+ #: inc/classes/generate-title.class.php:971
666
  msgid "Archives"
667
  msgstr ""
668
 
669
  #. translators: Front-end output.
670
 
671
+ #: inc/classes/generate-title.class.php:1086
672
  msgid "Untitled"
673
  msgstr ""
674
 
675
  #. translators: Front-end output.
676
 
677
+ #: inc/classes/generate-title.class.php:1121
678
  msgid "Search results for:"
679
  msgstr ""
680
 
681
  #. translators: Front-end output.
682
 
683
+ #: inc/classes/generate-title.class.php:1297
684
  msgid "Protected: %s"
685
  msgstr ""
686
 
687
  #. translators: Front-end output.
688
 
689
+ #: inc/classes/generate-title.class.php:1301
690
  msgid "Private: %s"
691
  msgstr ""
692
 
693
  #. translators: %d = page number. Front-end output.
694
 
695
+ #: inc/classes/generate-title.class.php:1349
696
  msgid "Page %d"
697
  msgstr ""
698
 
707
  #. translators: %s = Post Type
708
  #. translators: %s = Term type
709
 
710
+ #: inc/classes/inpost.class.php:230 inc/views/inpost/seo-settings-tt.php:100
711
  msgid "%s SEO Settings"
712
  msgstr ""
713
 
731
 
732
  #. translators: %s = 'The SEO Framework'
733
 
734
+ #: inc/classes/render.class.php:1103
735
  msgid "Start %s"
736
  msgstr ""
737
 
738
  #. translators: %s = 'The SEO Framework'
739
 
740
+ #: inc/classes/render.class.php:1105
741
  msgid "End %s"
742
  msgstr ""
743
 
744
+ #: inc/classes/render.class.php:1106
745
  msgid "by Sybre Waaijer"
746
  msgstr ""
747
 
748
+ #: inc/classes/site-options.class.php:440
749
  msgid "here"
750
  msgstr ""
751
 
752
+ #: inc/classes/site-options.class.php:441
753
  msgctxt "%s = here"
754
  msgid "View the new options %s."
755
  msgstr ""
762
  msgid "Sitemap is served from cache"
763
  msgstr ""
764
 
765
+ #: inc/classes/sitemaps.class.php:594
766
  msgid "Sitemap is generated on"
767
  msgstr ""
768
 
769
+ #: inc/classes/term-data.class.php:368
770
  msgid "Pages"
771
  msgstr ""
772
 
789
  msgstr ""
790
 
791
  #: inc/views/inpost/seo-settings-singular.php:44
792
+ #: inc/views/metaboxes/homepage-metabox.php:45
793
+ msgid "Social"
794
  msgstr ""
795
 
796
  #: inc/views/inpost/seo-settings-singular.php:50
797
+ msgid "Visibility"
 
798
  msgstr ""
799
 
800
  #: inc/views/inpost/seo-settings-singular.php:87
801
+ #: inc/views/inpost/seo-settings-tt.php:108
802
+ #: inc/views/inpost/seo-settings-tt.php:206
803
  msgid "Doing it Right"
804
  msgstr ""
805
 
818
  msgid "Custom %s Description"
819
  msgstr ""
820
 
821
+ #: inc/views/inpost/seo-settings-singular.php:166
822
  msgid "Custom Canonical URL"
823
  msgstr ""
824
 
825
+ #: inc/views/inpost/seo-settings-singular.php:170
826
  msgid "This urges search engines to go to the outputted URL."
827
  msgstr ""
828
 
829
  #. translators: 1: Option, 2: Post or Page
830
 
831
+ #: inc/views/inpost/seo-settings-singular.php:197
832
+ #: inc/views/inpost/seo-settings-singular.php:213
833
+ #: inc/views/inpost/seo-settings-singular.php:227
834
  msgid "Apply %1$s to this %2$s"
835
  msgstr ""
836
 
837
+ #: inc/views/inpost/seo-settings-singular.php:201
838
  msgid "This tells search engines not to show this %s in their search results."
839
  msgstr ""
840
 
841
+ #: inc/views/inpost/seo-settings-singular.php:216
842
  msgid "This tells search engines not to follow links on this %s."
843
  msgstr ""
844
 
845
  #. translators: %s = Post type name
846
 
847
+ #: inc/views/inpost/seo-settings-singular.php:235
848
  msgid "This tells search engines not to save a cached copy of this %s."
849
  msgstr ""
850
 
851
+ #: inc/views/inpost/seo-settings-singular.php:256
852
  msgid "Archive Settings"
853
  msgstr ""
854
 
855
  #. translators: %s = Post type name
856
 
857
+ #: inc/views/inpost/seo-settings-singular.php:266
858
  msgid "Exclude this %s from local search"
859
  msgstr ""
860
 
861
  #. translators: %s = Post type name
862
 
863
+ #: inc/views/inpost/seo-settings-singular.php:269
864
  msgid "This excludes this %s from local on-site search results."
865
  msgstr ""
866
 
867
  #. translators: %s = Post type name
868
 
869
+ #: inc/views/inpost/seo-settings-singular.php:279
870
  msgid "Exclude this %s from all archive listings."
871
  msgstr ""
872
 
873
  #. translators: %s = Post type name
874
 
875
+ #: inc/views/inpost/seo-settings-singular.php:282
876
  msgid "This excludes this %s from on-site archive pages."
877
  msgstr ""
878
 
879
+ #: inc/views/inpost/seo-settings-singular.php:296
880
  msgid "Custom 301 Redirect URL"
881
  msgstr ""
882
 
883
+ #: inc/views/inpost/seo-settings-singular.php:301
884
  msgid "This will force visitors to go to another URL."
885
  msgstr ""
886
 
887
+ #: inc/views/inpost/seo-settings-singular.php:345
888
+ msgid "Open Graph Title"
889
+ msgstr ""
890
+
891
+ #: inc/views/inpost/seo-settings-singular.php:368
892
+ msgid "Open Graph Description"
893
+ msgstr ""
894
+
895
+ #: inc/views/inpost/seo-settings-singular.php:389
896
+ msgid "Twitter Title"
897
+ msgstr ""
898
+
899
+ #: inc/views/inpost/seo-settings-singular.php:412
900
+ msgid "Twitter Description"
901
+ msgstr ""
902
+
903
+ #: inc/views/inpost/seo-settings-singular.php:436
904
  msgid "Custom Social Image URL"
905
  msgstr ""
906
 
907
  #. translators: %s = Post type name
908
 
909
+ #: inc/views/inpost/seo-settings-singular.php:442
910
  msgid "Set preferred %s Social Image URL location."
911
  msgstr ""
912
 
913
+ #: inc/views/inpost/seo-settings-tt.php:73
914
+ #: inc/views/metaboxes/homepage-metabox.php:362
915
+ msgid "This tells search engines not to show this page in their search results."
916
+ msgstr ""
917
+
918
+ #: inc/views/inpost/seo-settings-tt.php:81
919
+ #: inc/views/inpost/seo-settings-tt.php:89
920
+ #: inc/views/metaboxes/homepage-metabox.php:372
921
+ msgid "This tells search engines not to follow links on this page."
922
+ msgstr ""
923
+
924
  #. translators: %s = Term type
925
 
926
+ #: inc/views/inpost/seo-settings-tt.php:121
927
  msgid "%s Title"
928
  msgstr ""
929
 
930
  #. translators: %s = Term type
931
 
932
+ #: inc/views/inpost/seo-settings-tt.php:146
933
  msgid "%s Meta Description"
934
  msgstr ""
935
 
936
  #. translators: %s = noindex/nofollow/noarchive
937
 
938
+ #: inc/views/inpost/seo-settings-tt.php:181
 
 
939
  msgid "Apply %s to this term?"
940
  msgstr ""
941
 
 
 
 
 
 
 
 
 
 
 
 
942
  #: inc/views/metaboxes/description-metabox.php:17
943
  msgid "Example Title"
944
  msgstr ""
952
  msgstr ""
953
 
954
  #: inc/views/metaboxes/description-metabox.php:42
955
+ #: inc/views/metaboxes/homepage-metabox.php:245
956
  msgid "The meta description can be used to determine the text used under the title on Search Engine results pages."
957
  msgstr ""
958
 
1336
  msgstr ""
1337
 
1338
  #: inc/views/metaboxes/homepage-metabox.php:71
1339
+ #: inc/views/metaboxes/homepage-metabox.php:282
1340
+ #: inc/views/metaboxes/homepage-metabox.php:329
1341
  #: inc/views/metaboxes/social-metabox.php:318
1342
  msgid "Home Page"
1343
  msgstr ""
1361
  #. translators: %s = Home page URL markdown
1362
 
1363
  #: inc/views/metaboxes/homepage-metabox.php:215
1364
+ #: inc/views/metaboxes/homepage-metabox.php:261
1365
  msgid "A plugin has been detected that suggests to maintain this option on the [Home Page](%s)."
1366
  msgstr ""
1367
 
1368
+ #: inc/views/metaboxes/homepage-metabox.php:287
1369
  #: inc/views/metaboxes/title-metabox.php:135
1370
  msgid "Title Additions Location"
1371
  msgstr ""
1372
 
1373
+ #: inc/views/metaboxes/homepage-metabox.php:288
1374
  #: inc/views/metaboxes/title-metabox.php:136
1375
  msgid "This setting determines which side the added title text will go on."
1376
  msgstr ""
1377
 
1378
+ #: inc/views/metaboxes/homepage-metabox.php:295
1379
  #: inc/views/metaboxes/title-metabox.php:142
1380
  msgid "Left:"
1381
  msgstr ""
1382
 
1383
+ #: inc/views/metaboxes/homepage-metabox.php:305
1384
  #: inc/views/metaboxes/title-metabox.php:149
1385
  msgid "Right:"
1386
  msgstr ""
1387
 
1388
+ #: inc/views/metaboxes/homepage-metabox.php:316
1389
  msgid "%s Tagline"
1390
  msgstr ""
1391
 
1392
+ #: inc/views/metaboxes/homepage-metabox.php:320
1393
  msgid "Add site description (tagline) to the Title on the %s?"
1394
  msgstr ""
1395
 
1396
+ #: inc/views/metaboxes/homepage-metabox.php:346
1397
  msgid "View Home Page Settings"
1398
  msgstr ""
1399
 
1400
+ #: inc/views/metaboxes/homepage-metabox.php:346
1401
  msgid "Checked in Page"
1402
  msgstr ""
1403
 
1404
+ #: inc/views/metaboxes/homepage-metabox.php:350
1405
  msgid "Home Page Robots Meta Settings"
1406
  msgstr ""
1407
 
1408
  #. translators: 1: Option, 2: Location
1409
 
1410
+ #: inc/views/metaboxes/homepage-metabox.php:359
1411
+ #: inc/views/metaboxes/homepage-metabox.php:369
1412
+ #: inc/views/metaboxes/homepage-metabox.php:379
1413
  msgid "Apply %1$s to the %2$s?"
1414
  msgstr ""
1415
 
1416
+ #: inc/views/metaboxes/homepage-metabox.php:382
1417
  msgid "This tells search engines not to save a cached copy of this page."
1418
  msgstr ""
1419
 
1420
+ #: inc/views/metaboxes/homepage-metabox.php:414
1421
  msgid "Note: If any of these options are unchecked, but are checked on the Home Page, they will be outputted regardless."
1422
  msgstr ""
1423
 
1424
+ #: inc/views/metaboxes/homepage-metabox.php:420
1425
  msgid "Home Page Pagination Robots Settings"
1426
  msgstr ""
1427
 
1428
+ #: inc/views/metaboxes/homepage-metabox.php:421
1429
  msgid "If your Home Page is paginated and outputs content that's also found elsewhere on the website, enabling this option might prevent duplicate content."
1430
  msgstr ""
1431
 
1432
  #. translators: 1: Option, 2: Location
1433
 
1434
+ #: inc/views/metaboxes/homepage-metabox.php:429
1435
  msgid "Apply %1$s to every second or later page on the %2$s?"
1436
  msgstr ""
1437
 
1438
+ #: inc/views/metaboxes/homepage-metabox.php:439
1439
  #: inc/views/metaboxes/social-metabox.php:115
1440
  msgid "Social Image Settings"
1441
  msgstr ""
1442
 
1443
+ #: inc/views/metaboxes/homepage-metabox.php:441
1444
  msgid "A social image can be displayed when your homepage is shared. It is a great way to grab attention."
1445
  msgstr ""
1446
 
1447
+ #: inc/views/metaboxes/homepage-metabox.php:470
1448
  msgid "Custom Homepage Image URL"
1449
  msgstr ""
1450
 
1451
+ #: inc/views/metaboxes/homepage-metabox.php:471
1452
  msgid "Set preferred homepage Social Image URL location."
1453
  msgstr ""
1454
 
1455
  #: inc/views/metaboxes/robots-metabox.php:13
1456
+ #: inc/views/metaboxes/title-metabox.php:189
1457
  msgid "Category"
1458
  msgstr ""
1459
 
1704
  msgid "Add the link that leads directly to the social page of this website."
1705
  msgstr ""
1706
 
1707
+ #: inc/views/metaboxes/schema-metabox.php:186
1708
+ msgid "These settings do not affect sharing behavior with the social networks."
1709
+ msgstr ""
1710
+
1711
+ #: inc/views/metaboxes/schema-metabox.php:188
1712
  msgctxt "No spaces. E.g. https://facebook.com/RelatedProfile"
1713
  msgid "RelatedProfile"
1714
  msgstr ""
1715
 
1716
+ #: inc/views/metaboxes/schema-metabox.php:189
1717
  msgctxt "Social Profile"
1718
  msgid "Profile"
1719
  msgstr ""
1720
 
1721
+ #: inc/views/metaboxes/schema-metabox.php:254
1722
  msgid "Blog"
1723
  msgstr ""
1724
 
1725
+ #: inc/views/metaboxes/schema-metabox.php:268
1726
  msgid "View your profile."
1727
  msgstr ""
1728
 
2127
  msgid "The Home Page has a specific option."
2128
  msgstr ""
2129
 
2130
+ #: inc/views/metaboxes/title-metabox.php:159
2131
  msgid "Remove Blogname from Title"
2132
  msgstr ""
2133
 
2134
+ #: inc/views/metaboxes/title-metabox.php:163
2135
  msgid "This might decouple your posts and pages from the rest of the website."
2136
  msgstr ""
2137
 
2138
+ #: inc/views/metaboxes/title-metabox.php:171
2139
  msgid "Remove Blogname from title?"
2140
  msgstr ""
2141
 
2142
+ #: inc/views/metaboxes/title-metabox.php:181
2143
  msgid "Only use this option if you are aware of its SEO effects."
2144
  msgstr ""
2145
 
2146
+ #: inc/views/metaboxes/title-metabox.php:205
2147
  msgid "Example Category"
2148
  msgstr ""
2149
 
2150
+ #: inc/views/metaboxes/title-metabox.php:223
2151
  msgid "Title prefix options"
2152
  msgstr ""
2153
 
2154
+ #: inc/views/metaboxes/title-metabox.php:224
2155
  msgid "On archives a descriptive prefix may be added to the title."
2156
  msgstr ""
2157
 
2158
+ #: inc/views/metaboxes/title-metabox.php:227
2159
  msgid "Example Automated Archive Title Output"
2160
  msgstr ""
2161
 
2162
+ #: inc/views/metaboxes/title-metabox.php:235
2163
  msgid "Remove Archive Title Prefixes"
2164
  msgstr ""
2165
 
2166
+ #: inc/views/metaboxes/title-metabox.php:239
2167
  msgid "Remove prefixes from title?"
2168
  msgstr ""
2169
 
2170
+ #: inc/views/metaboxes/title-metabox.php:243
2171
  msgid "The prefix helps visitors and search engines determine what kind of page they're visiting."
2172
  msgstr ""
2173
 
lib/css/tsf-rtl.css CHANGED
@@ -256,13 +256,13 @@ th.column-tsf-seo-bar-wrap ~ th {
256
  -o-transition: none;
257
  -ms-transition: none;
258
  transition: none;
 
259
  font-size: 18px;
260
- font-weight: 600;
261
  }
262
 
263
  .tsf-description-pixel-counter-shadow {
264
  font-size: 13px;
265
- font-weight: 400;
266
  }
267
 
268
  /* END Pixel Counters */
@@ -412,7 +412,7 @@ body.no-js .tsf-seo-bar-item {
412
  }
413
 
414
  a.tsf-tooltip-item {
415
- cursor: auto;
416
  }
417
 
418
  .tsf-tooltip {
@@ -864,11 +864,12 @@ input[type="radio"].tsf-flex-nav-tab-radio {
864
  /* IE11 fix */
865
  -webkit-flex: 1 1 100%;
866
  flex: 1 1 100%;
867
- /* Firefox fix, don't use overflow:hidden because that could cause more issues. */
868
  -webkit-flex-wrap: nowrap;
869
  -ms-flex-wrap: nowrap;
870
  flex-wrap: nowrap;
871
  max-width: 100%;
 
872
  }
873
 
874
  .tsf-flex-nav-tab-inner {
@@ -908,8 +909,8 @@ input[type="radio"].tsf-flex-nav-tab-radio {
908
  transition: box-shadow 0.15s ease-out;
909
  -webkit-align-items: center;
910
  align-items: center;
911
- -webkit-align-content: space-between;
912
- align-content: space-between;
913
  }
914
 
915
  .tsf-flex-nav-dashicon,
256
  -o-transition: none;
257
  -ms-transition: none;
258
  transition: none;
259
+ font-family: arial,helvetica,sans-serif;
260
  font-size: 18px;
261
+ font-weight: 400;
262
  }
263
 
264
  .tsf-description-pixel-counter-shadow {
265
  font-size: 13px;
 
266
  }
267
 
268
  /* END Pixel Counters */
412
  }
413
 
414
  a.tsf-tooltip-item {
415
+ cursor: pointer;
416
  }
417
 
418
  .tsf-tooltip {
864
  /* IE11 fix */
865
  -webkit-flex: 1 1 100%;
866
  flex: 1 1 100%;
867
+ /* Firefox fix */
868
  -webkit-flex-wrap: nowrap;
869
  -ms-flex-wrap: nowrap;
870
  flex-wrap: nowrap;
871
  max-width: 100%;
872
+ overflow: hidden;
873
  }
874
 
875
  .tsf-flex-nav-tab-inner {
909
  transition: box-shadow 0.15s ease-out;
910
  -webkit-align-items: center;
911
  align-items: center;
912
+ -webkit-align-content: space-around;
913
+ align-content: space-around;
914
  }
915
 
916
  .tsf-flex-nav-dashicon,
lib/css/tsf-rtl.min.css CHANGED
@@ -1 +1 @@
1
- .tsf-top-buttons,.tsf-top-wrap>h1,.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-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;right:0;color:transparent;white-space:pre}#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;right:0;overflow:hidden;white-space:pre;text-overflow:ellipsis;will-change:left,right}.tsf-counter-wrap{margin-top:15px}.tsf-counter{font-weight:400;color:#666;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;will-change:contents}.tsf-count-bad{color:#dd3811}.tsf-count-okay{color:#ffa700}.tsf-count-good{color:#0cc34b}.tsf-counter-one{color:#fff;border-radius:4em;padding:0 .5em;min-width:2em;display:inline-block;text-align:center;vertical-align:baseline}.tsf-counter-one.tsf-count-bad{background-color:#dd3811}.tsf-counter-one.tsf-count-okay{background-color:#ffa700}.tsf-counter-one.tsf-count-good{background-color:#0cc34b}.tsf-tabs-content .tsf-pixel-counter-wrap{margin-right:1px;max-width:99%}.tsf-pixel-shadow-wrap{position:relative;overflow:hidden;width:0;height:0}.tsf-pixel-counter-wrap{border-bottom:1px solid #ccc;margin-top:12px;margin-bottom:3px}.tsf-pixel-counter-bar{padding-top:7px;display:block;height:3px;width:100%}.tsf-pixel-counter-fluid{display:block;pointer-events:none;height:3px;width:0;max-width:100%;background:#007bd2;box-shadow:0 1px 3px 0 #ccc;-webkit-transition:width .15s cubic-bezier(.4,0,.75,1);-o-transition:width .15s cubic-bezier(.4,0,.75,1);transition:width .15s cubic-bezier(.4,0,.75,1)}.tsf-pixel-counter-overflown .tsf-pixel-counter-fluid{background-color:#dd3811}.tsf-pixel-counter-fit .tsf-pixel-counter-fluid{background-color:#0cc34b}.tsf-description-pixel-counter-shadow,.tsf-title-pixel-counter-shadow{position:absolute;right:0;top:0;z-index:-100;overflow:visible;visibility:hidden;padding:0;margin:0;border:0;display:inline;text-decoration:none;white-space:nowrap;word-wrap:normal;zoom:1;text-overflow:clip;-webkit-transition:none;-moz-transition:none;-o-transition:none;-ms-transition:none;transition:none;font-size:18px;font-weight:600}.tsf-description-pixel-counter-shadow{font-size:13px;font-weight:400}#tsf-seo-bar-wrap{width:18%}th:last-of-type#tsf-seo-bar-wrap{width:160px}.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)}.tsf-seo-bar.tsf-100{width:100%}.tsf-seo-bar-inner-wrap{display:table;width:100%;border-radius:0;margin:0 auto;border-collapse:separate;border-spacing:0;vertical-align:middle}.tsf-seo-bar-section-wrap{display:table-cell;border-collapse:collapse}.tsf-seo-bar-item{display:table;width:100%;color:#fff;text-align:center;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}body.no-js .tsf-seo-bar-item{cursor:default}.tsf-seo-bar.pill,.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap{border-radius:30px}.tsf-seo-bar.pill .tsf-seo-bar-item{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 .tsf-seo-bar-section-wrap:last-of-type,.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap .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}.tsf-tooltip-wrap{position:relative}.tsf-tooltip-item{cursor:help}a.tsf-tooltip-item{cursor:auto}.tsf-tooltip{position:absolute;padding:0;margin:0;bottom:0;left:0;z-index:900142;text-align:right;pointer-events:none;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:row;flex-direction:row;-webkit-justify-content:flex-start;justify-content:flex-start}.tsf-tooltip-down{bottom:auto;top:0}.tsf-tooltip-text-wrap{padding:10px 12px;font-size:1em;font-weight:500;line-height:1.625em;border-radius:3px;background:#007bd2;color:#fdfdfd;box-shadow:0 0 2px rgba(0,0,0,.6);text-shadow:none;word-wrap:break-word;overflow-wrap:break-word;word-break:break-word;white-space:pre-line;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1 0 150px;flex:1 0 150px;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:flex-start;justify-content:flex-start}.tsf-is-primary-term,.tsf-nav-tab{font-weight:600}.tsf-tooltip-text span{text-decoration:underline}.tsf-tooltip-text br{display:block;width:100%;content:"\A"}.tsf-ajax:before,.tsf-tooltip-arrow:after,.tsf-tooltip-arrow:before{content:""}.tsf-tooltip-arrow{position:absolute;bottom:-8px;z-index:9999999;left:0;width:0;height:0}.tsf-tooltip-down .tsf-tooltip-arrow{bottom:auto;top:-8px}.tsf-tooltip-arrow:before{border-left:9px solid transparent;border-right:9px solid transparent;border-top:9px solid rgba(0,0,0,.25);position:absolute;bottom:-1px;left:-1px}.tsf-tooltip-arrow:after{border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #007bd2;position:absolute;bottom:0;left:0}.tsf-tooltip-down .tsf-tooltip-arrow:before{bottom:auto;top:0;border-top:0;border-bottom:9px solid rgba(0,0,0,.25)}.tsf-tooltip-down .tsf-tooltip-arrow:after{bottom:auto;top:1px;border-top:0;border-bottom:8px solid #007bd2}.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-top-wrap{width:100%;display:inline-block;vertical-align:top}.tsf-metaboxes .metabox-holder{clear:both}.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 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 label.tsf-recommended,#tsf-title-separator label.tsf-recommended{border:1px solid #0cc34b;box-shadow:-1px -1px 1px #0cc34b inset}#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,#tsf-twitter-cards label span{display:inline-block;min-width:60px;vertical-align:baseline}#tsf-twitter-cards label span{min-width:150px}#tsf-home-title-location label .tsf-sep-js,#tsf-home-title-location label span.tsf-custom-blogname-js,#tsf-home-title-location label span.tsf-custom-tagline-js,#tsf-home-title-location label span.tsf-custom-title-js,#tsf-title-location label .tsf-sep-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:right;border:1px solid #ccc;margin-right:.5em;margin-bottom:-1px;padding:5px 14px;font-size:12px;line-height:16px;background:#f1f1f1;color:#555}.tsf-dashicons-tabs{font-size:initial;display:inline;vertical-align:text-bottom}input.tsf-tabs-radio{display:none;width:0;height:0;position:absolute;left:-9001px}.tsf-active-tab,.tsf-tabs-radio:checked+label{background-color:inherit;border-bottom-color:#fff;color:#000}.tsf-tabs-content{margin:1.33em auto 0}.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}#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-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-inpost-box .hndle .tsf-tooltip-wrap a{font-size:14px;line-height:1em}.tsf-primary-term-selector{margin:0;padding:0;float:left;line-height:inherit;display:inline-block}.tsf-primary-term-selector input{vertical-align:middle;height:14px;width:14px;min-width:14px;line-height:inherit;margin:0;padding:0;pointer-events:none}.tsf-primary-term-selector input:checked:before{width:6px;height:6px;margin:3px;line-height:inherit}.tsf-primary-term-selector-help-wrap{position:absolute;top:0;left:25px}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-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-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}.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-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}.tsf-primary-term-selector input{height:18px;width:18px;min-width:18px}.tsf-primary-term-selector input:checked:before{width:8px;height:8px;margin:4px}}@media screen and (max-width:642px){.tsf-nav-desktop{display:none}}@media screen and (max-width:510px){.tsf-seo-bar.tsf-100{width:inherit}}@-moz-document url-prefix(){#tsf-description-separator label,#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-default-selected{box-shadow:0 0 2px 0 #1c9d38}.tsf-warning-selected{box-shadow:0 0 2px 0 #dd3811}}.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-top-buttons,.tsf-top-wrap>h1,.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-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;right:0;color:transparent;white-space:pre}#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;right:0;overflow:hidden;white-space:pre;text-overflow:ellipsis;will-change:left,right}.tsf-counter-wrap{margin-top:15px}.tsf-counter{font-weight:400;color:#666;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;will-change:contents}.tsf-count-bad{color:#dd3811}.tsf-count-okay{color:#ffa700}.tsf-count-good{color:#0cc34b}.tsf-counter-one{color:#fff;border-radius:4em;padding:0 .5em;min-width:2em;display:inline-block;text-align:center;vertical-align:baseline}.tsf-counter-one.tsf-count-bad{background-color:#dd3811}.tsf-counter-one.tsf-count-okay{background-color:#ffa700}.tsf-counter-one.tsf-count-good{background-color:#0cc34b}.tsf-tabs-content .tsf-pixel-counter-wrap{margin-right:1px;max-width:99%}.tsf-pixel-shadow-wrap{position:relative;overflow:hidden;width:0;height:0}.tsf-pixel-counter-wrap{border-bottom:1px solid #ccc;margin-top:12px;margin-bottom:3px}.tsf-pixel-counter-bar{padding-top:7px;display:block;height:3px;width:100%}.tsf-pixel-counter-fluid{display:block;pointer-events:none;height:3px;width:0;max-width:100%;background:#007bd2;box-shadow:0 1px 3px 0 #ccc;-webkit-transition:width .15s cubic-bezier(.4,0,.75,1);-o-transition:width .15s cubic-bezier(.4,0,.75,1);transition:width .15s cubic-bezier(.4,0,.75,1)}.tsf-pixel-counter-overflown .tsf-pixel-counter-fluid{background-color:#dd3811}.tsf-pixel-counter-fit .tsf-pixel-counter-fluid{background-color:#0cc34b}.tsf-description-pixel-counter-shadow,.tsf-title-pixel-counter-shadow{position:absolute;right:0;top:0;z-index:-100;overflow:visible;visibility:hidden;padding:0;margin:0;border:0;display:inline;text-decoration:none;white-space:nowrap;word-wrap:normal;zoom:1;text-overflow:clip;-webkit-transition:none;-moz-transition:none;-o-transition:none;-ms-transition:none;transition:none;font-family:arial,helvetica,sans-serif;font-size:18px;font-weight:400}.tsf-description-pixel-counter-shadow{font-size:13px}#tsf-seo-bar-wrap{width:18%}th:last-of-type#tsf-seo-bar-wrap{width:160px}.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)}.tsf-seo-bar.tsf-100{width:100%}.tsf-seo-bar-inner-wrap{display:table;width:100%;border-radius:0;margin:0 auto;border-collapse:separate;border-spacing:0;vertical-align:middle}.tsf-seo-bar-section-wrap{display:table-cell;border-collapse:collapse}.tsf-seo-bar-item{display:table;width:100%;color:#fff;text-align:center;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}body.no-js .tsf-seo-bar-item{cursor:default}.tsf-seo-bar.pill,.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap{border-radius:30px}.tsf-seo-bar.pill .tsf-seo-bar-item{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 .tsf-seo-bar-section-wrap:last-of-type,.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap .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}.tsf-tooltip-wrap{position:relative}.tsf-tooltip-item{cursor:help}a.tsf-tooltip-item{cursor:pointer}.tsf-tooltip{position:absolute;padding:0;margin:0;bottom:0;left:0;z-index:900142;text-align:right;pointer-events:none;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:row;flex-direction:row;-webkit-justify-content:flex-start;justify-content:flex-start}.tsf-tooltip-down{bottom:auto;top:0}.tsf-tooltip-text-wrap{padding:10px 12px;font-size:1em;font-weight:500;line-height:1.625em;border-radius:3px;background:#007bd2;color:#fdfdfd;box-shadow:0 0 2px rgba(0,0,0,.6);text-shadow:none;word-wrap:break-word;overflow-wrap:break-word;word-break:break-word;white-space:pre-line;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1 0 150px;flex:1 0 150px;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:flex-start;justify-content:flex-start}.tsf-is-primary-term,.tsf-nav-tab{font-weight:600}.tsf-tooltip-text span{text-decoration:underline}.tsf-tooltip-text br{display:block;width:100%;content:"\A"}.tsf-ajax:before,.tsf-tooltip-arrow:after,.tsf-tooltip-arrow:before{content:""}.tsf-tooltip-arrow{position:absolute;bottom:-8px;z-index:9999999;left:0;width:0;height:0}.tsf-tooltip-down .tsf-tooltip-arrow{bottom:auto;top:-8px}.tsf-tooltip-arrow:before{border-left:9px solid transparent;border-right:9px solid transparent;border-top:9px solid rgba(0,0,0,.25);position:absolute;bottom:-1px;left:-1px}.tsf-tooltip-arrow:after{border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #007bd2;position:absolute;bottom:0;left:0}.tsf-tooltip-down .tsf-tooltip-arrow:before{bottom:auto;top:0;border-top:0;border-bottom:9px solid rgba(0,0,0,.25)}.tsf-tooltip-down .tsf-tooltip-arrow:after{bottom:auto;top:1px;border-top:0;border-bottom:8px solid #007bd2}.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-top-wrap{width:100%;display:inline-block;vertical-align:top}.tsf-metaboxes .metabox-holder{clear:both}.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 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 label.tsf-recommended,#tsf-title-separator label.tsf-recommended{border:1px solid #0cc34b;box-shadow:-1px -1px 1px #0cc34b inset}#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,#tsf-twitter-cards label span{display:inline-block;min-width:60px;vertical-align:baseline}#tsf-twitter-cards label span{min-width:150px}#tsf-home-title-location label .tsf-sep-js,#tsf-home-title-location label span.tsf-custom-blogname-js,#tsf-home-title-location label span.tsf-custom-tagline-js,#tsf-home-title-location label span.tsf-custom-title-js,#tsf-title-location label .tsf-sep-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:right;border:1px solid #ccc;margin-right:.5em;margin-bottom:-1px;padding:5px 14px;font-size:12px;line-height:16px;background:#f1f1f1;color:#555}.tsf-dashicons-tabs{font-size:initial;display:inline;vertical-align:text-bottom}input.tsf-tabs-radio{display:none;width:0;height:0;position:absolute;left:-9001px}.tsf-active-tab,.tsf-tabs-radio:checked+label{background-color:inherit;border-bottom-color:#fff;color:#000}.tsf-tabs-content{margin:1.33em auto 0}.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}#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-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%;overflow:hidden}.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-around;align-content:space-around}.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-inpost-box .hndle .tsf-tooltip-wrap a{font-size:14px;line-height:1em}.tsf-primary-term-selector{margin:0;padding:0;float:left;line-height:inherit;display:inline-block}.tsf-primary-term-selector input{vertical-align:middle;height:14px;width:14px;min-width:14px;line-height:inherit;margin:0;padding:0;pointer-events:none}.tsf-primary-term-selector input:checked:before{width:6px;height:6px;margin:3px;line-height:inherit}.tsf-primary-term-selector-help-wrap{position:absolute;top:0;left:25px}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-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-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}.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-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}.tsf-primary-term-selector input{height:18px;width:18px;min-width:18px}.tsf-primary-term-selector input:checked:before{width:8px;height:8px;margin:4px}}@media screen and (max-width:642px){.tsf-nav-desktop{display:none}}@media screen and (max-width:510px){.tsf-seo-bar.tsf-100{width:inherit}}@-moz-document url-prefix(){#tsf-description-separator label,#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-default-selected{box-shadow:0 0 2px 0 #1c9d38}.tsf-warning-selected{box-shadow:0 0 2px 0 #dd3811}}.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
@@ -256,13 +256,13 @@ th.column-tsf-seo-bar-wrap ~ th {
256
  -o-transition: none;
257
  -ms-transition: none;
258
  transition: none;
 
259
  font-size: 18px;
260
- font-weight: 600;
261
  }
262
 
263
  .tsf-description-pixel-counter-shadow {
264
  font-size: 13px;
265
- font-weight: 400;
266
  }
267
 
268
  /* END Pixel Counters */
@@ -412,7 +412,7 @@ body.no-js .tsf-seo-bar-item {
412
  }
413
 
414
  a.tsf-tooltip-item {
415
- cursor: auto;
416
  }
417
 
418
  .tsf-tooltip {
@@ -864,11 +864,12 @@ input[type="radio"].tsf-flex-nav-tab-radio {
864
  /* IE11 fix */
865
  -webkit-flex: 1 1 100%;
866
  flex: 1 1 100%;
867
- /* Firefox fix, don't use overflow:hidden because that could cause more issues. */
868
  -webkit-flex-wrap: nowrap;
869
  -ms-flex-wrap: nowrap;
870
  flex-wrap: nowrap;
871
  max-width: 100%;
 
872
  }
873
 
874
  .tsf-flex-nav-tab-inner {
@@ -908,8 +909,8 @@ input[type="radio"].tsf-flex-nav-tab-radio {
908
  transition: box-shadow 0.15s ease-out;
909
  -webkit-align-items: center;
910
  align-items: center;
911
- -webkit-align-content: space-between;
912
- align-content: space-between;
913
  }
914
 
915
  .tsf-flex-nav-dashicon,
256
  -o-transition: none;
257
  -ms-transition: none;
258
  transition: none;
259
+ font-family: arial,helvetica,sans-serif;
260
  font-size: 18px;
261
+ font-weight: 400;
262
  }
263
 
264
  .tsf-description-pixel-counter-shadow {
265
  font-size: 13px;
 
266
  }
267
 
268
  /* END Pixel Counters */
412
  }
413
 
414
  a.tsf-tooltip-item {
415
+ cursor: pointer;
416
  }
417
 
418
  .tsf-tooltip {
864
  /* IE11 fix */
865
  -webkit-flex: 1 1 100%;
866
  flex: 1 1 100%;
867
+ /* Firefox fix */
868
  -webkit-flex-wrap: nowrap;
869
  -ms-flex-wrap: nowrap;
870
  flex-wrap: nowrap;
871
  max-width: 100%;
872
+ overflow: hidden;
873
  }
874
 
875
  .tsf-flex-nav-tab-inner {
909
  transition: box-shadow 0.15s ease-out;
910
  -webkit-align-items: center;
911
  align-items: center;
912
+ -webkit-align-content: space-around;
913
+ align-content: space-around;
914
  }
915
 
916
  .tsf-flex-nav-dashicon,
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-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}#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}.tsf-counter-wrap{margin-top:15px}.tsf-counter{font-weight:400;color:#666;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;will-change:contents}.tsf-count-bad{color:#dd3811}.tsf-count-okay{color:#ffa700}.tsf-count-good{color:#0cc34b}.tsf-counter-one{color:#fff;border-radius:4em;padding:0 .5em;min-width:2em;display:inline-block;text-align:center;vertical-align:baseline}.tsf-counter-one.tsf-count-bad{background-color:#dd3811}.tsf-counter-one.tsf-count-okay{background-color:#ffa700}.tsf-counter-one.tsf-count-good{background-color:#0cc34b}.tsf-tabs-content .tsf-pixel-counter-wrap{margin-left:1px;max-width:99%}.tsf-pixel-shadow-wrap{position:relative;overflow:hidden;width:0;height:0}.tsf-pixel-counter-wrap{border-bottom:1px solid #ccc;margin-top:12px;margin-bottom:3px}.tsf-pixel-counter-bar{padding-top:7px;display:block;height:3px;width:100%}.tsf-pixel-counter-fluid{display:block;pointer-events:none;height:3px;width:0;max-width:100%;background:#007bd2;box-shadow:0 1px 3px 0 #ccc;-webkit-transition:width .15s cubic-bezier(.4,0,.75,1);-o-transition:width .15s cubic-bezier(.4,0,.75,1);transition:width .15s cubic-bezier(.4,0,.75,1)}.tsf-pixel-counter-overflown .tsf-pixel-counter-fluid{background-color:#dd3811}.tsf-pixel-counter-fit .tsf-pixel-counter-fluid{background-color:#0cc34b}.tsf-description-pixel-counter-shadow,.tsf-title-pixel-counter-shadow{position:absolute;left:0;top:0;z-index:-100;overflow:visible;visibility:hidden;padding:0;margin:0;border:0;display:inline;text-decoration:none;white-space:nowrap;word-wrap:normal;zoom:1;text-overflow:clip;-webkit-transition:none;-moz-transition:none;-o-transition:none;-ms-transition:none;transition:none;font-size:18px;font-weight:600}.tsf-description-pixel-counter-shadow{font-size:13px;font-weight:400}#tsf-seo-bar-wrap{width:18%}th:last-of-type#tsf-seo-bar-wrap{width:160px}.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)}.tsf-seo-bar.tsf-100{width:100%}.tsf-seo-bar-inner-wrap{display:table;width:100%;border-radius:0;margin:0 auto;border-collapse:separate;border-spacing:0;vertical-align:middle}.tsf-seo-bar-section-wrap{display:table-cell;border-collapse:collapse}.tsf-seo-bar-item{display:table;width:100%;color:#fff;text-align:center;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}body.no-js .tsf-seo-bar-item{cursor:default}.tsf-seo-bar.pill,.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap{border-radius:30px}.tsf-seo-bar.pill .tsf-seo-bar-item{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 .tsf-seo-bar-section-wrap:first-of-type,.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap .tsf-seo-bar-section-wrap:first-of-type .tsf-seo-bar-item{border-top-left-radius:30px;border-bottom-left-radius:30px}.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap .tsf-seo-bar-section-wrap:last-of-type,.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap .tsf-seo-bar-section-wrap:last-of-type .tsf-seo-bar-item{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}.tsf-tooltip-wrap{position:relative}.tsf-tooltip-item{cursor:help}a.tsf-tooltip-item{cursor:auto}.tsf-tooltip{position:absolute;padding:0;margin:0;bottom:0;left:0;z-index:900142;text-align:left;pointer-events:none;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:row;flex-direction:row;-webkit-justify-content:flex-start;justify-content:flex-start}.tsf-tooltip-down{bottom:auto;top:0}.tsf-tooltip-text-wrap{padding:10px 12px;font-size:1em;font-weight:500;line-height:1.625em;border-radius:3px;background:#007bd2;color:#fdfdfd;box-shadow:0 0 2px rgba(0,0,0,.6);text-shadow:none;word-wrap:break-word;overflow-wrap:break-word;word-break:break-word;white-space:pre-line;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1 0 150px;flex:1 0 150px;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:flex-start;justify-content:flex-start}.tsf-is-primary-term,.tsf-nav-tab{font-weight:600}.tsf-tooltip-text span{text-decoration:underline}.tsf-tooltip-text br{display:block;width:100%;content:"\A"}.tsf-ajax:before,.tsf-tooltip-arrow:after,.tsf-tooltip-arrow:before{content:""}.tsf-tooltip-arrow{position:absolute;bottom:-8px;z-index:9999999;left:0;width:0;height:0}.tsf-tooltip-down .tsf-tooltip-arrow{bottom:auto;top:-8px}.tsf-tooltip-arrow:before{border-left:9px solid transparent;border-right:9px solid transparent;border-top:9px solid rgba(0,0,0,.25);position:absolute;bottom:-1px;left:-1px}.tsf-tooltip-arrow:after{border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #007bd2;position:absolute;bottom:0;left:0}.tsf-tooltip-down .tsf-tooltip-arrow:before{bottom:auto;top:0;border-top:0;border-bottom:9px solid rgba(0,0,0,.25)}.tsf-tooltip-down .tsf-tooltip-arrow:after{bottom:auto;top:1px;border-top:0;border-bottom:8px solid #007bd2}.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-top-wrap{width:100%;display:inline-block;vertical-align:top}.tsf-top-wrap>h1,.tsf-top-wrap>h2{float:left}.tsf-metaboxes .metabox-holder{clear:both}.tsf-top-buttons{float:right}.tsf-bottom-buttons{text-align:right}.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 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 label.tsf-recommended,#tsf-title-separator label.tsf-recommended{border:1px solid #0cc34b;box-shadow:-1px -1px 1px #0cc34b inset}#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,#tsf-twitter-cards label span{display:inline-block;min-width:60px;vertical-align:baseline}#tsf-twitter-cards label span{min-width:150px}#tsf-home-title-location label .tsf-sep-js,#tsf-home-title-location label span.tsf-custom-blogname-js,#tsf-home-title-location label span.tsf-custom-tagline-js,#tsf-home-title-location label span.tsf-custom-title-js,#tsf-title-location label .tsf-sep-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}.tsf-dashicons-tabs{font-size:initial;display:inline;vertical-align:text-bottom}input.tsf-tabs-radio{display:none;width:0;height:0;position:absolute;left:-9001px}.tsf-active-tab,.tsf-tabs-radio:checked+label{background-color:inherit;border-bottom-color:#fff;color:#000}.tsf-tabs-content{margin:1.33em auto 0}.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}#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-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-inpost-box .hndle .tsf-tooltip-wrap a{font-size:14px;line-height:1em}.tsf-primary-term-selector{margin:0;padding:0;float:right;line-height:inherit;display:inline-block}.tsf-primary-term-selector input{vertical-align:middle;height:14px;width:14px;min-width:14px;line-height:inherit;margin:0;padding:0;pointer-events:none}.tsf-primary-term-selector input:checked:before{width:6px;height:6px;margin:3px;line-height:inherit}.tsf-primary-term-selector-help-wrap{position:absolute;top:0;right:25px}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-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}.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}.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-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}.tsf-primary-term-selector input{height:18px;width:18px;min-width:18px}.tsf-primary-term-selector input:checked:before{width:8px;height:8px;margin:4px}}@media screen and (max-width:642px){.tsf-nav-desktop{display:none}}@media screen and (max-width:510px){.tsf-seo-bar.tsf-100{width:inherit}}@-moz-document url-prefix(){#tsf-description-separator label,#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-default-selected{box-shadow:0 0 2px 0 #1c9d38}.tsf-warning-selected{box-shadow:0 0 2px 0 #dd3811}}.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-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}#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}.tsf-counter-wrap{margin-top:15px}.tsf-counter{font-weight:400;color:#666;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;will-change:contents}.tsf-count-bad{color:#dd3811}.tsf-count-okay{color:#ffa700}.tsf-count-good{color:#0cc34b}.tsf-counter-one{color:#fff;border-radius:4em;padding:0 .5em;min-width:2em;display:inline-block;text-align:center;vertical-align:baseline}.tsf-counter-one.tsf-count-bad{background-color:#dd3811}.tsf-counter-one.tsf-count-okay{background-color:#ffa700}.tsf-counter-one.tsf-count-good{background-color:#0cc34b}.tsf-tabs-content .tsf-pixel-counter-wrap{margin-left:1px;max-width:99%}.tsf-pixel-shadow-wrap{position:relative;overflow:hidden;width:0;height:0}.tsf-pixel-counter-wrap{border-bottom:1px solid #ccc;margin-top:12px;margin-bottom:3px}.tsf-pixel-counter-bar{padding-top:7px;display:block;height:3px;width:100%}.tsf-pixel-counter-fluid{display:block;pointer-events:none;height:3px;width:0;max-width:100%;background:#007bd2;box-shadow:0 1px 3px 0 #ccc;-webkit-transition:width .15s cubic-bezier(.4,0,.75,1);-o-transition:width .15s cubic-bezier(.4,0,.75,1);transition:width .15s cubic-bezier(.4,0,.75,1)}.tsf-pixel-counter-overflown .tsf-pixel-counter-fluid{background-color:#dd3811}.tsf-pixel-counter-fit .tsf-pixel-counter-fluid{background-color:#0cc34b}.tsf-description-pixel-counter-shadow,.tsf-title-pixel-counter-shadow{position:absolute;left:0;top:0;z-index:-100;overflow:visible;visibility:hidden;padding:0;margin:0;border:0;display:inline;text-decoration:none;white-space:nowrap;word-wrap:normal;zoom:1;text-overflow:clip;-webkit-transition:none;-moz-transition:none;-o-transition:none;-ms-transition:none;transition:none;font-family:arial,helvetica,sans-serif;font-size:18px;font-weight:400}.tsf-description-pixel-counter-shadow{font-size:13px}#tsf-seo-bar-wrap{width:18%}th:last-of-type#tsf-seo-bar-wrap{width:160px}.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)}.tsf-seo-bar.tsf-100{width:100%}.tsf-seo-bar-inner-wrap{display:table;width:100%;border-radius:0;margin:0 auto;border-collapse:separate;border-spacing:0;vertical-align:middle}.tsf-seo-bar-section-wrap{display:table-cell;border-collapse:collapse}.tsf-seo-bar-item{display:table;width:100%;color:#fff;text-align:center;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}body.no-js .tsf-seo-bar-item{cursor:default}.tsf-seo-bar.pill,.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap{border-radius:30px}.tsf-seo-bar.pill .tsf-seo-bar-item{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 .tsf-seo-bar-section-wrap:first-of-type,.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap .tsf-seo-bar-section-wrap:first-of-type .tsf-seo-bar-item{border-top-left-radius:30px;border-bottom-left-radius:30px}.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap .tsf-seo-bar-section-wrap:last-of-type,.tsf-seo-bar.pill .tsf-seo-bar-inner-wrap .tsf-seo-bar-section-wrap:last-of-type .tsf-seo-bar-item{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}.tsf-tooltip-wrap{position:relative}.tsf-tooltip-item{cursor:help}a.tsf-tooltip-item{cursor:pointer}.tsf-tooltip{position:absolute;padding:0;margin:0;bottom:0;left:0;z-index:900142;text-align:left;pointer-events:none;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:row;flex-direction:row;-webkit-justify-content:flex-start;justify-content:flex-start}.tsf-tooltip-down{bottom:auto;top:0}.tsf-tooltip-text-wrap{padding:10px 12px;font-size:1em;font-weight:500;line-height:1.625em;border-radius:3px;background:#007bd2;color:#fdfdfd;box-shadow:0 0 2px rgba(0,0,0,.6);text-shadow:none;word-wrap:break-word;overflow-wrap:break-word;word-break:break-word;white-space:pre-line;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1 0 150px;flex:1 0 150px;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:flex-start;justify-content:flex-start}.tsf-is-primary-term,.tsf-nav-tab{font-weight:600}.tsf-tooltip-text span{text-decoration:underline}.tsf-tooltip-text br{display:block;width:100%;content:"\A"}.tsf-ajax:before,.tsf-tooltip-arrow:after,.tsf-tooltip-arrow:before{content:""}.tsf-tooltip-arrow{position:absolute;bottom:-8px;z-index:9999999;left:0;width:0;height:0}.tsf-tooltip-down .tsf-tooltip-arrow{bottom:auto;top:-8px}.tsf-tooltip-arrow:before{border-left:9px solid transparent;border-right:9px solid transparent;border-top:9px solid rgba(0,0,0,.25);position:absolute;bottom:-1px;left:-1px}.tsf-tooltip-arrow:after{border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #007bd2;position:absolute;bottom:0;left:0}.tsf-tooltip-down .tsf-tooltip-arrow:before{bottom:auto;top:0;border-top:0;border-bottom:9px solid rgba(0,0,0,.25)}.tsf-tooltip-down .tsf-tooltip-arrow:after{bottom:auto;top:1px;border-top:0;border-bottom:8px solid #007bd2}.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-top-wrap{width:100%;display:inline-block;vertical-align:top}.tsf-top-wrap>h1,.tsf-top-wrap>h2{float:left}.tsf-metaboxes .metabox-holder{clear:both}.tsf-top-buttons{float:right}.tsf-bottom-buttons{text-align:right}.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 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 label.tsf-recommended,#tsf-title-separator label.tsf-recommended{border:1px solid #0cc34b;box-shadow:-1px -1px 1px #0cc34b inset}#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,#tsf-twitter-cards label span{display:inline-block;min-width:60px;vertical-align:baseline}#tsf-twitter-cards label span{min-width:150px}#tsf-home-title-location label .tsf-sep-js,#tsf-home-title-location label span.tsf-custom-blogname-js,#tsf-home-title-location label span.tsf-custom-tagline-js,#tsf-home-title-location label span.tsf-custom-title-js,#tsf-title-location label .tsf-sep-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}.tsf-dashicons-tabs{font-size:initial;display:inline;vertical-align:text-bottom}input.tsf-tabs-radio{display:none;width:0;height:0;position:absolute;left:-9001px}.tsf-active-tab,.tsf-tabs-radio:checked+label{background-color:inherit;border-bottom-color:#fff;color:#000}.tsf-tabs-content{margin:1.33em auto 0}.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}#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-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%;overflow:hidden}.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-around;align-content:space-around}.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-inpost-box .hndle .tsf-tooltip-wrap a{font-size:14px;line-height:1em}.tsf-primary-term-selector{margin:0;padding:0;float:right;line-height:inherit;display:inline-block}.tsf-primary-term-selector input{vertical-align:middle;height:14px;width:14px;min-width:14px;line-height:inherit;margin:0;padding:0;pointer-events:none}.tsf-primary-term-selector input:checked:before{width:6px;height:6px;margin:3px;line-height:inherit}.tsf-primary-term-selector-help-wrap{position:absolute;top:0;right:25px}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-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}.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}.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-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}.tsf-primary-term-selector input{height:18px;width:18px;min-width:18px}.tsf-primary-term-selector input:checked:before{width:8px;height:8px;margin:4px}}@media screen and (max-width:642px){.tsf-nav-desktop{display:none}}@media screen and (max-width:510px){.tsf-seo-bar.tsf-100{width:inherit}}@-moz-document url-prefix(){#tsf-description-separator label,#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-default-selected{box-shadow:0 0 2px 0 #1c9d38}.tsf-warning-selected{box-shadow:0 0 2px 0 #dd3811}}.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/externs/tsf.externs.js CHANGED
@@ -2,13 +2,13 @@
2
  * This file holds The SEO Framework plugin's JS code externs
3
  * for Google's Closure Compiler.
4
  *
5
- * @author Sybre Waaijer https://cyberwire.nl/
6
  * @link https://wordpress.org/plugins/the-seo-framework/
7
  */
8
 
9
  /**
10
  * The SEO Framework 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
2
  * This file holds The SEO Framework plugin's JS code externs
3
  * for Google's Closure Compiler.
4
  *
5
+ * @author Sybre Waaijer <https://cyberwire.nl/>
6
  * @link https://wordpress.org/plugins/the-seo-framework/
7
  */
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2017 - 2018 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/externs/tsf.externs.protected.js CHANGED
@@ -2,13 +2,13 @@
2
  * This file holds The SEO Framework plugin's JS code externs
3
  * for Google's Closure Compiler.
4
  *
5
- * @author Sybre Waaijer https://cyberwire.nl/
6
  * @link https://wordpress.org/plugins/the-seo-framework/
7
  */
8
 
9
  /**
10
  * The SEO Framework 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
2
  * This file holds The SEO Framework plugin's JS code externs
3
  * for Google's Closure Compiler.
4
  *
5
+ * @author Sybre Waaijer <https://cyberwire.nl/>
6
  * @link https://wordpress.org/plugins/the-seo-framework/
7
  */
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2017 - 2018 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 - 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
@@ -165,7 +165,7 @@ window.tsf = {
165
  if ( ! str.length )
166
  return '';
167
 
168
- var map = {
169
  '&': '&amp;',
170
  '<': '&lt;',
171
  '>': '&gt;',
@@ -173,14 +173,55 @@ window.tsf = {
173
  "'": '&#039;'
174
  };
175
 
176
- return str.replace( /[&<>"']/g, function( m ) {
177
- return map[m];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
178
  } );
179
  },
180
 
181
  /**
182
  * Gets string length.
183
- * We do not trim in JavaScript; that should be self-taught by the user.
 
 
184
  *
185
  * @function
186
  * @param {string} str
@@ -201,17 +242,20 @@ window.tsf = {
201
  /**
202
  * Updates pixel counter.
203
  *
 
 
 
204
  * @function
205
  * @param {Object} test
206
  * @return {undefined}
207
  */
208
  updatePixelCounter: function( test ) {
209
 
210
- let e = test.e,
211
  text = test.text,
212
  guideline = test.guideline;
213
 
214
- let wrap = e.parentElement;
215
 
216
  if ( ! wrap )
217
  return;
@@ -247,7 +291,7 @@ window.tsf = {
247
  label = tsf.i18n.pixelsUsed.replace( /%1\$d/g, testWidth );
248
  label = label.replace( /%2\$d/g, guideline );
249
 
250
- bar.classList.remove( fitClass, overflownClass )
251
  bar.classList.add( newClass );
252
  bar.dataset.desc = label;
253
  bar.setAttribute( 'aria-label', label );
@@ -602,27 +646,59 @@ window.tsf = {
602
  ie11killswitch = false;
603
  }, 0 );
604
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
605
  const updateCounter = function( event ) {
606
- let counter = document.getElementById( event.target.id + '_chars' );
 
607
 
608
- if ( ! counter )
609
- return;
610
 
611
- let titLen = 0,
612
  target = event.target,
613
  counterClass = '',
614
  counterType = tsf.counterType,
615
  counterName = '',
616
  output = '';
617
 
618
- if ( target.value.length < 1 ) {
619
- titLen = tsf.getStringLength( target.placeholder );
620
- } else {
621
- titLen = ( hoverPrefixValue ? tsf.getStringLength( hoverPrefixValue ) : 0 )
622
- + tsf.getStringLength( target.value )
623
- + ( hoverAdditionsValue ? tsf.getStringLength( hoverAdditionsValue ) : 0 );
624
- }
625
-
626
  if ( titLen < 25 || titLen >= 75 ) {
627
  counterClass += 'tsf-count-bad';
628
  counterName = tsf.i18n.bad;
@@ -651,46 +727,15 @@ window.tsf = {
651
  counter.className = counterClass;
652
  }
653
  const updatePixels = function( event ) {
654
- let pixels = document.getElementById( event.target.id + '_pixels' );
 
655
 
656
- if ( ! pixels )
657
  return;
658
 
659
- let text = '';
660
-
661
- if ( event.target.value.length < 1 ) {
662
- text = event.target.placeholder;
663
- } else {
664
- //= We must determine the position as trailing whitespace is rendered 0.
665
- text = event.target.value;
666
-
667
- if ( hoverPrefixValue.length ) {
668
- switch ( hoverPrefixPlacement ) {
669
- case 'before' :
670
- text = hoverPrefixValue + text;
671
- break;
672
-
673
- case 'after' :
674
- text = text + hoverPrefixValue;
675
- break;
676
- }
677
- }
678
- if ( hoverAdditionsValue.length ) {
679
- switch ( hoverAdditionsPlacement ) {
680
- case 'before' :
681
- text = hoverAdditionsValue + text;
682
- break;
683
-
684
- case 'after' :
685
- text = text + hoverAdditionsValue;
686
- break;
687
- }
688
- }
689
- }
690
-
691
  let test = {
692
  'e': pixels,
693
- 'text' : text,
694
  'guideline' : tsf.params.titlePixelGuideline,
695
  };
696
 
@@ -708,6 +753,7 @@ window.tsf = {
708
  if ( ie11killswitch ) return false;
709
  updateHoverPlacement( event );
710
  updatePlaceholder();
 
711
  updateCounter( event );
712
  updatePixels( event );
713
  }
@@ -721,6 +767,7 @@ window.tsf = {
721
  * @return {undefined}
722
  */
723
  const updateCounterTrigger = function( event ) {
 
724
  updateCounter( event );
725
  updatePixels( event );
726
  }
@@ -888,9 +935,7 @@ window.tsf = {
888
  */
889
  const enqueueUnregisteredInputTrigger = function() {
890
  clearTimeout( unregisteredTriggerBuffer );
891
- unregisteredTriggerBuffer = setTimeout( function() {
892
- triggerUnregisteredInput();
893
- }, 50 );
894
  }
895
  //= Defer to prevent early trigger.
896
  jQuery( window ).one( 'tsf-ready', function() {
@@ -939,7 +984,7 @@ window.tsf = {
939
  val = val.trim();
940
 
941
  if ( val.length ) {
942
- defaultTitle = val;
943
  } else {
944
  defaultTitle = tsf.params.untitledTitle;
945
  }
@@ -1185,6 +1230,9 @@ window.tsf = {
1185
  /**
1186
  * Updates used separator and all examples thereof.
1187
  *
 
 
 
1188
  * @function
1189
  * @param {!jQuery.Event} event
1190
  * @return {undefined}
@@ -1209,10 +1257,10 @@ window.tsf = {
1209
  descLen = tsf.getStringLength( target.value );
1210
  }
1211
 
1212
- if ( descLen < 100 || descLen >= 175 ) {
1213
  counterClass += 'tsf-count-bad';
1214
  counterName = tsf.i18n.bad;
1215
- } else if ( descLen < 137 || descLen > 155 ) {
1216
  counterClass += 'tsf-count-okay';
1217
  counterName = tsf.i18n.okay;
1218
  } else {
@@ -1236,13 +1284,11 @@ window.tsf = {
1236
  if ( counter.className !== counterClass )
1237
  counter.className = counterClass;
1238
  }
1239
- const updatePixels = function( event ) {
1240
- let element = document.getElementById( event.target.id + '_pixels' );
 
1241
 
1242
- if ( ! element )
1243
- return;
1244
-
1245
- let text = '';
1246
 
1247
  if ( event.target.value.length < 1 ) {
1248
  text = event.target.placeholder;
@@ -1250,9 +1296,20 @@ window.tsf = {
1250
  text = event.target.value;
1251
  }
1252
 
 
 
 
 
 
 
 
 
 
 
 
1253
  let test = {
1254
- 'e': element,
1255
- 'text' : text,
1256
  'guideline' : tsf.params.descPixelGuideline
1257
  }
1258
 
@@ -1267,6 +1324,7 @@ window.tsf = {
1267
  * @return {undefined}
1268
  */
1269
  const updateDescriptionsTrigger = function( event ) {
 
1270
  updateCounter( event );
1271
  updatePixels( event );
1272
  }
@@ -1329,6 +1387,218 @@ window.tsf = {
1329
  jQuery( document ).on( 'postbox-toggled', triggerPostboxSynchronousUnregisteredInput );
1330
  },
1331
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1332
  /**
1333
  * Initializes counters.
1334
  *
@@ -1478,6 +1748,8 @@ window.tsf = {
1478
  * Initializes primary term selection.
1479
  *
1480
  * @since 3.0.0
 
 
1481
  *
1482
  * @function
1483
  * @return {undefined}
@@ -1522,10 +1794,15 @@ window.tsf = {
1522
  let wrap = document.getElementById( 'taxonomy-' + taxonomy ),
1523
  tabs = wrap.querySelectorAll( '.tabs-panel' );
1524
 
1525
- let tab = Array.prototype.slice.call( tabs ).filter( function( Element ) {
1526
- return Element.offsetWidth > 0 || Element.offsetHeight > 0 || Element.getClientRects().length > 0;
 
 
 
1527
  } )[0];
1528
 
 
 
1529
  let offset = tab.scrollHeight > tab.clientHeight
1530
  ? tab.offsetWidth - tab.clientWidth + 25 - 2 // 2px is padding or something?
1531
  : 25;
@@ -1655,6 +1932,9 @@ window.tsf = {
1655
  checked$[ taxonomy ] = checked$[ taxonomy ].not( '[value="' + element.value + '"]' );
1656
  uniqueChecked$[ taxonomy ] = uniqueChecked$[ taxonomy ].not( '[value="' + element.value + '"]' );
1657
  }
 
 
 
1658
 
1659
  const initVars = function( taxonomy ) {
1660
  let $box = getBox( taxonomy, 1 );
@@ -1686,7 +1966,8 @@ window.tsf = {
1686
  data = { 'taxonomy': taxonomy },
1687
  $box = getBox( taxonomy ),
1688
  $div = jQuery( '#' + taxonomy + 'div' ),
1689
- $tabs = jQuery( '#' + taxonomy + '-tabs' );
 
1690
 
1691
  $box.off( 'click.' + ns );
1692
  $box.on( 'click.' + ns, 'input[type="checkbox"]', data, toggleShowSwitch );
@@ -1697,6 +1978,9 @@ window.tsf = {
1697
 
1698
  $tabs.off( 'click.' + ns );
1699
  $tabs.on( 'click.' + ns, 'a', data, fixHelpPosOnTabToggle );
 
 
 
1700
  }
1701
  const load = function( taxonomy ) {
1702
  getBox( taxonomy ).find( 'input[type="checkbox"]:checked' )
@@ -2035,7 +2319,7 @@ window.tsf = {
2035
  }
2036
 
2037
  /**
2038
- * Initializes SEO Bar tooltips.
2039
  * @function
2040
  */
2041
  const initTooltips = function() {
@@ -2156,6 +2440,7 @@ window.tsf = {
2156
  * Sets the navigation tabs content equal to the buttons.
2157
  *
2158
  * @since 2.9.0
 
2159
  * @see tsf.tabToggle
2160
  *
2161
  * @function
@@ -2166,6 +2451,11 @@ window.tsf = {
2166
  if ( ! tsf.hasInput )
2167
  return;
2168
 
 
 
 
 
 
2169
  if ( tsf.states['isSettingsPage'] ) {
2170
  let $buttons = jQuery( '.tsf-nav-tab-wrapper .tsf-tab:nth-of-type(n+2) input:checked' );
2171
 
@@ -3169,9 +3459,11 @@ window.tsf = {
3169
  // Add title prop listeners. Must load before setTabsOnload to work.
3170
  tsf._initTitleInputs();
3171
  tsf._initUnboundTitleSettings();
 
3172
 
3173
  // Add description prop listeners. Must load before setTabsOnload to work.
3174
  tsf._initDescInputs();
 
3175
 
3176
  // Set primary term listeners.
3177
  tsf._initPrimaryTerm();
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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
165
  if ( ! str.length )
166
  return '';
167
 
168
+ let map = {
169
  '&': '&amp;',
170
  '<': '&lt;',
171
  '>': '&gt;',
173
  "'": '&#039;'
174
  };
175
 
176
+ return str.replace( /[&<>"']/g, m => {
177
+ return map[ m ];
178
+ } );
179
+ },
180
+
181
+ /**
182
+ * Undoes what tsf.escapeString has done.
183
+ *
184
+ * @since 3.0.4
185
+ *
186
+ * @function
187
+ * @param {string} str The escaped str via tsf.escapeString
188
+ * @return {string}
189
+ */
190
+ unescapeString: function( str ) {
191
+
192
+ if ( ! str.length )
193
+ return '';
194
+
195
+ let map = {
196
+ '&': '&amp;',
197
+ '<': '&lt;',
198
+ '>': '&gt;',
199
+ '"': '&quot;',
200
+ "'": '&#039;'
201
+ };
202
+
203
+ //= IE11 replacement for Object.values. <https://stackoverflow.com/a/42830295>
204
+ let values = Object.keys( map ).map( e => map[ e ] );
205
+
206
+ let regex = new RegExp(
207
+ values.map( v => {
208
+ return v.replace( /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&' );
209
+ } ).join('|'),
210
+ 'g'
211
+ );
212
+
213
+ return str.replace( regex, m => {
214
+ return Object.keys( map ).find( k => {
215
+ return map[ k ] === m;
216
+ } );
217
  } );
218
  },
219
 
220
  /**
221
  * Gets string length.
222
+ * We do not trim whitespace in JavaScript; that should be self-taught by the user.
223
+ *
224
+ * @since 3.0.0
225
  *
226
  * @function
227
  * @param {string} str
242
  /**
243
  * Updates pixel counter.
244
  *
245
+ * @since 3.0.0
246
+ * @access private
247
+ *
248
  * @function
249
  * @param {Object} test
250
  * @return {undefined}
251
  */
252
  updatePixelCounter: function( test ) {
253
 
254
+ let el = test.e,
255
  text = test.text,
256
  guideline = test.guideline;
257
 
258
+ let wrap = el.parentElement;
259
 
260
  if ( ! wrap )
261
  return;
291
  label = tsf.i18n.pixelsUsed.replace( /%1\$d/g, testWidth );
292
  label = label.replace( /%2\$d/g, guideline );
293
 
294
+ bar.classList.remove( fitClass, overflownClass );
295
  bar.classList.add( newClass );
296
  bar.dataset.desc = label;
297
  bar.setAttribute( 'aria-label', label );
646
  ie11killswitch = false;
647
  }, 0 );
648
  }
649
+ const setReferenceTitle = function( event ) {
650
+ let reference = document.getElementById( 'tsf-title-reference' ),
651
+ text = '';
652
+
653
+ if ( ! reference ) return;
654
+
655
+ if ( event.target.value.length < 1 ) {
656
+ text = event.target.placeholder;
657
+ } else {
658
+ //= We must determine the position as trailing whitespace is rendered 0.
659
+ text = event.target.value;
660
+
661
+ if ( hoverPrefixValue.length ) {
662
+ switch ( hoverPrefixPlacement ) {
663
+ case 'before' :
664
+ text = hoverPrefixValue + text;
665
+ break;
666
+
667
+ case 'after' :
668
+ text = text + hoverPrefixValue;
669
+ break;
670
+ }
671
+ }
672
+ if ( hoverAdditionsValue.length ) {
673
+ switch ( hoverAdditionsPlacement ) {
674
+ case 'before' :
675
+ text = hoverAdditionsValue + text;
676
+ break;
677
+
678
+ case 'after' :
679
+ text = text + hoverAdditionsValue;
680
+ break;
681
+ }
682
+ }
683
+ }
684
+
685
+ reference.innerHTML = tsf.escapeString( text );
686
+ // Fires change event. Defered.
687
+ setTimeout( () => { jQuery( reference ).change() }, 0 );
688
+ }
689
  const updateCounter = function( event ) {
690
+ let counter = document.getElementById( event.target.id + '_chars' ),
691
+ reference = document.getElementById( 'tsf-title-reference' );
692
 
693
+ if ( ! counter || ! reference ) return;
 
694
 
695
+ let titLen = tsf.getStringLength( tsf.unescapeString( reference.innerHTML ) ),
696
  target = event.target,
697
  counterClass = '',
698
  counterType = tsf.counterType,
699
  counterName = '',
700
  output = '';
701
 
 
 
 
 
 
 
 
 
702
  if ( titLen < 25 || titLen >= 75 ) {
703
  counterClass += 'tsf-count-bad';
704
  counterName = tsf.i18n.bad;
727
  counter.className = counterClass;
728
  }
729
  const updatePixels = function( event ) {
730
+ let pixels = document.getElementById( event.target.id + '_pixels' ),
731
+ reference = document.getElementById( 'tsf-title-reference' );
732
 
733
+ if ( ! pixels || ! reference )
734
  return;
735
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
736
  let test = {
737
  'e': pixels,
738
+ 'text' : tsf.unescapeString( reference.innerHTML ),
739
  'guideline' : tsf.params.titlePixelGuideline,
740
  };
741
 
753
  if ( ie11killswitch ) return false;
754
  updateHoverPlacement( event );
755
  updatePlaceholder();
756
+ setReferenceTitle( event );
757
  updateCounter( event );
758
  updatePixels( event );
759
  }
767
  * @return {undefined}
768
  */
769
  const updateCounterTrigger = function( event ) {
770
+ setReferenceTitle( event );
771
  updateCounter( event );
772
  updatePixels( event );
773
  }
935
  */
936
  const enqueueUnregisteredInputTrigger = function() {
937
  clearTimeout( unregisteredTriggerBuffer );
938
+ unregisteredTriggerBuffer = setTimeout( triggerUnregisteredInput, 50 );
 
 
939
  }
940
  //= Defer to prevent early trigger.
941
  jQuery( window ).one( 'tsf-ready', function() {
984
  val = val.trim();
985
 
986
  if ( val.length ) {
987
+ defaultTitle = tsf.escapeString( val );
988
  } else {
989
  defaultTitle = tsf.params.untitledTitle;
990
  }
1230
  /**
1231
  * Updates used separator and all examples thereof.
1232
  *
1233
+ * @since 3.0.4 : 1. Threshold "too long" has been increased from 155 to 300.
1234
+ * 2. Threshold "far too long" has been increased to 330 from 175.
1235
+ *
1236
  * @function
1237
  * @param {!jQuery.Event} event
1238
  * @return {undefined}
1257
  descLen = tsf.getStringLength( target.value );
1258
  }
1259
 
1260
+ if ( descLen < 100 || descLen >= 330 ) {
1261
  counterClass += 'tsf-count-bad';
1262
  counterName = tsf.i18n.bad;
1263
+ } else if ( descLen < 137 || descLen > 300 ) {
1264
  counterClass += 'tsf-count-okay';
1265
  counterName = tsf.i18n.okay;
1266
  } else {
1284
  if ( counter.className !== counterClass )
1285
  counter.className = counterClass;
1286
  }
1287
+ const setReferenceDescription = function( event ) {
1288
+ let reference = document.getElementById( 'tsf-description-reference' ),
1289
+ text = '';
1290
 
1291
+ if ( ! reference ) return;
 
 
 
1292
 
1293
  if ( event.target.value.length < 1 ) {
1294
  text = event.target.placeholder;
1296
  text = event.target.value;
1297
  }
1298
 
1299
+ reference.innerHTML = tsf.escapeString( text );
1300
+ // Fires change event. Defered.
1301
+ setTimeout( () => { jQuery( reference ).change() }, 0 );
1302
+ }
1303
+ const updatePixels = function( event ) {
1304
+ let pixels = document.getElementById( event.target.id + '_pixels' ),
1305
+ reference = document.getElementById( 'tsf-description-reference' );
1306
+
1307
+ if ( ! pixels || ! reference )
1308
+ return;
1309
+
1310
  let test = {
1311
+ 'e': pixels,
1312
+ 'text' : tsf.unescapeString( reference.innerHTML ),
1313
  'guideline' : tsf.params.descPixelGuideline
1314
  }
1315
 
1324
  * @return {undefined}
1325
  */
1326
  const updateDescriptionsTrigger = function( event ) {
1327
+ setReferenceDescription( event );
1328
  updateCounter( event );
1329
  updatePixels( event );
1330
  }
1387
  jQuery( document ).on( 'postbox-toggled', triggerPostboxSynchronousUnregisteredInput );
1388
  },
1389
 
1390
+ /**
1391
+ * Initializes social titles.
1392
+ *
1393
+ * @since 3.0.4
1394
+ *
1395
+ * @function
1396
+ * @return {undefined}
1397
+ */
1398
+ _initSocialTitleInputs: function() {
1399
+
1400
+ if ( ! tsf.hasInput )
1401
+ return;
1402
+
1403
+ let $ogTitle = jQuery( "#autodescription_og_title" ),
1404
+ $twTitle = jQuery( "#autodescription_twitter_title" ),
1405
+ $reference = jQuery( "#tsf-title-reference" );
1406
+
1407
+ if ( ! $ogTitle.length || ! $twTitle.length || ! $reference.length )
1408
+ return;
1409
+
1410
+ //= y u no fix dis, Microsoft. Crappy vars don't deserve CamelCase.
1411
+ let ie11killswitch = false,
1412
+ ie11 = !! navigator.userAgent.match(/Trident\/7\./);
1413
+
1414
+ let ogTitleValue = tsf.escapeString( $ogTitle.val() ),
1415
+ twTitleValue = tsf.escapeString( $twTitle.val() ),
1416
+ referenceValue = $reference.text(); // already escaped.
1417
+
1418
+ const getActiveValue = ( what ) => {
1419
+ let val = '';
1420
+ switch ( what ) {
1421
+ case 'twitter' :
1422
+ val = twTitleValue;
1423
+ // get next if not set.
1424
+ case 'og' :
1425
+ val = val.length ? val : ogTitleValue;
1426
+ // get next if not set.
1427
+ case 'reference' :
1428
+ val = val.length ? val : referenceValue;
1429
+ }
1430
+ return val;
1431
+ };
1432
+ const setPlaceholders = () => {
1433
+ if ( ie11 ) ie11killswitch = true;
1434
+
1435
+ $ogTitle.attr( 'placeholder', getActiveValue( 'reference' ) );
1436
+ $twTitle.attr( 'placeholder', getActiveValue( 'og' ) );
1437
+
1438
+ ie11 && setTimeout( function() {
1439
+ ie11killswitch = false;
1440
+ }, 0 );
1441
+ };
1442
+ const updateCounter = ( target, value, threshold ) => {
1443
+ if ( ! target || ! value || ! threshold ) {
1444
+ $ogTitle.each( ( i, el ) => updateCounter( el, getActiveValue( 'og' ), 88 ) );
1445
+ $twTitle.each( ( i, el ) => updateCounter( el, getActiveValue( 'twitter' ), 70 ) );
1446
+ } else {
1447
+ tsf.updateSocialCounter( target, value, threshold );
1448
+ }
1449
+ };
1450
+ $reference.on( 'change', () => {
1451
+ referenceValue = $reference.text();
1452
+ setPlaceholders();
1453
+ updateCounter();
1454
+ } );
1455
+
1456
+ const updateOgTitle = ( event ) => {
1457
+ if ( ie11killswitch ) return;
1458
+ ogTitleValue = event.target.value.length ? tsf.escapeString( event.target.value ) : '';
1459
+ setPlaceholders();
1460
+ updateCounter();
1461
+ };
1462
+ const updateTwTitle = ( event ) => {
1463
+ if ( ie11killswitch ) return;
1464
+ twTitleValue = event.target.value.length ? tsf.escapeString( event.target.value ) : '';
1465
+ setPlaceholders();
1466
+ updateCounter();
1467
+ };
1468
+ $ogTitle.on( 'input.tsfUpdateOgTitle', updateOgTitle );
1469
+ $twTitle.on( 'input.tsfUpdateOgTitle', updateTwTitle );
1470
+ },
1471
+
1472
+ /**
1473
+ * Initializes social descriptions.
1474
+ *
1475
+ * @since 3.0.0
1476
+ *
1477
+ * @function
1478
+ * @return {undefined}
1479
+ */
1480
+ _initSocialDescInputs: function() {
1481
+
1482
+ if ( ! tsf.hasInput )
1483
+ return;
1484
+
1485
+ let $ogDesc = jQuery( "#autodescription_og_description" ),
1486
+ $twDesc = jQuery( "#autodescription_twitter_description" ),
1487
+ $reference = jQuery( "#tsf-description-reference" );
1488
+
1489
+ if ( ! $ogDesc.length || ! $twDesc.length || ! $reference.length )
1490
+ return;
1491
+
1492
+ //= y u no fix dis, Microsoft. Crappy vars don't deserve CamelCase.
1493
+ let ie11killswitch = false,
1494
+ ie11 = !! navigator.userAgent.match(/Trident\/7\./);
1495
+
1496
+ let ogDescValue = tsf.escapeString( $ogDesc.val() ),
1497
+ twDescValue = tsf.escapeString( $twDesc.val() ),
1498
+ referenceValue = $reference.text(); // already escaped.
1499
+
1500
+ const getActiveValue = ( what ) => {
1501
+ let val = '';
1502
+ switch ( what ) {
1503
+ case 'twitter' :
1504
+ val = twDescValue;
1505
+ // get next if not set.
1506
+ case 'og' :
1507
+ val = val.length ? val : ogDescValue;
1508
+ // get next if not set.
1509
+ case 'reference' :
1510
+ val = val.length ? val : referenceValue;
1511
+ }
1512
+ return val;
1513
+ };
1514
+ const setPlaceholders = () => {
1515
+ if ( ie11 ) ie11killswitch = true;
1516
+
1517
+ $ogDesc.attr( 'placeholder', getActiveValue( 'reference' ) );
1518
+ $twDesc.attr( 'placeholder', getActiveValue( 'og' ) );
1519
+
1520
+ ie11 && setTimeout( function() {
1521
+ ie11killswitch = false;
1522
+ }, 0 );
1523
+ };
1524
+ const updateCounter = ( target, value, threshold ) => {
1525
+ if ( ! target || ! value || ! threshold ) {
1526
+ $ogDesc.each( ( i, el ) => updateCounter( el, getActiveValue( 'og' ), 300 ) );
1527
+ $twDesc.each( ( i, el ) => updateCounter( el, getActiveValue( 'twitter' ), 200 ) );
1528
+ } else {
1529
+ tsf.updateSocialCounter( target, value, threshold );
1530
+ }
1531
+ };
1532
+ $reference.on( 'change', () => {
1533
+ referenceValue = $reference.text();
1534
+ setPlaceholders();
1535
+ updateCounter();
1536
+ } );
1537
+
1538
+ const updateOgDesc = ( event ) => {
1539
+ if ( ie11killswitch ) return;
1540
+ ogDescValue = event.target.value.length ? tsf.escapeString( event.target.value ) : '';
1541
+ setPlaceholders();
1542
+ updateCounter();
1543
+ };
1544
+ const updateTwDesc = ( event ) => {
1545
+ if ( ie11killswitch ) return;
1546
+ twDescValue = event.target.value.length ? tsf.escapeString( event.target.value ) : '';
1547
+ setPlaceholders();
1548
+ updateCounter();
1549
+ };
1550
+ $ogDesc.on( 'input.tsfUpdateOgDesc', updateOgDesc );
1551
+ $twDesc.on( 'input.tsfUpdateOgDesc', updateTwDesc );
1552
+ },
1553
+
1554
+ /**
1555
+ * Updates normalized counters for social input.
1556
+ *
1557
+ * @since 3.0.4
1558
+ *
1559
+ * @function
1560
+ * @param {!Element} target The HMTL eleent.
1561
+ * @param {string} value Must be escaped.
1562
+ * @param {integer} threshold The "bad" threshold.
1563
+ */
1564
+ updateSocialCounter: function( target, value, threshold ) {
1565
+
1566
+ let counter = document.getElementById( target.id + '_chars' );
1567
+
1568
+ if ( ! counter )
1569
+ return;
1570
+
1571
+ let strLen = tsf.getStringLength( tsf.unescapeString( value ) ),
1572
+ counterClass = '',
1573
+ counterType = tsf.counterType,
1574
+ counterName = '',
1575
+ output = '';
1576
+
1577
+ if ( strLen > threshold ) {
1578
+ counterClass += 'tsf-count-bad';
1579
+ counterName = tsf.i18n.bad;
1580
+ } else {
1581
+ counterClass += 'tsf-count-good';
1582
+ counterName = tsf.i18n.good;
1583
+ }
1584
+
1585
+ if ( ! counterType || 1 == counterType ) {
1586
+ output = strLen.toString();
1587
+ } else if ( 2 == counterType ) {
1588
+ output = counterName;
1589
+ } else if ( 3 == counterType ) {
1590
+ output = strLen.toString() + ' - ' + counterName;
1591
+ }
1592
+
1593
+ counter.innerHTML = output;
1594
+
1595
+ if ( tsf.additionsClass )
1596
+ counterClass += ' ' + tsf.additionsClass;
1597
+
1598
+ if ( counter.className !== counterClass )
1599
+ counter.className = counterClass;
1600
+ },
1601
+
1602
  /**
1603
  * Initializes counters.
1604
  *
1748
  * Initializes primary term selection.
1749
  *
1750
  * @since 3.0.0
1751
+ * @since 3.0.4 1 : Added postbox toggle event listeners for help display correction.
1752
+ * 2 : Added tab visibility checkers.
1753
  *
1754
  * @function
1755
  * @return {undefined}
1794
  let wrap = document.getElementById( 'taxonomy-' + taxonomy ),
1795
  tabs = wrap.querySelectorAll( '.tabs-panel' );
1796
 
1797
+ let $postbox = jQuery( wrap ).closest( '.postbox' );
1798
+ if ( $postbox.length && $postbox.hasClass( 'closed' ) ) return;
1799
+
1800
+ let tab = Array.prototype.slice.call( tabs ).filter( function( el ) {
1801
+ return el.offsetWidth > 0 || el.offsetHeight > 0 || el.getClientRects().length > 0;
1802
  } )[0];
1803
 
1804
+ if ( ! tab ) return;
1805
+
1806
  let offset = tab.scrollHeight > tab.clientHeight
1807
  ? tab.offsetWidth - tab.clientWidth + 25 - 2 // 2px is padding or something?
1808
  : 25;
1932
  checked$[ taxonomy ] = checked$[ taxonomy ].not( '[value="' + element.value + '"]' );
1933
  uniqueChecked$[ taxonomy ] = uniqueChecked$[ taxonomy ].not( '[value="' + element.value + '"]' );
1934
  }
1935
+ const togglePostbox = function( event, postbox ) {
1936
+ fixHelpPos( event.data.taxonomy );
1937
+ }
1938
 
1939
  const initVars = function( taxonomy ) {
1940
  let $box = getBox( taxonomy, 1 );
1966
  data = { 'taxonomy': taxonomy },
1967
  $box = getBox( taxonomy ),
1968
  $div = jQuery( '#' + taxonomy + 'div' ),
1969
+ $tabs = jQuery( '#' + taxonomy + '-tabs' ),
1970
+ $postbox = $box.closest( '.postbox' );
1971
 
1972
  $box.off( 'click.' + ns );
1973
  $box.on( 'click.' + ns, 'input[type="checkbox"]', data, toggleShowSwitch );
1978
 
1979
  $tabs.off( 'click.' + ns );
1980
  $tabs.on( 'click.' + ns, 'a', data, fixHelpPosOnTabToggle );
1981
+
1982
+ $postbox.off( 'click.postboxes.' + ns );
1983
+ $postbox.on( 'click.postboxes.' + ns, data, togglePostbox );
1984
  }
1985
  const load = function( taxonomy ) {
1986
  getBox( taxonomy ).find( 'input[type="checkbox"]:checked' )
2319
  }
2320
 
2321
  /**
2322
+ * Initializes tooltips.
2323
  * @function
2324
  */
2325
  const initTooltips = function() {
2440
  * Sets the navigation tabs content equal to the buttons.
2441
  *
2442
  * @since 2.9.0
2443
+ * @since 3.0.4 Added inpost flex nav trigger.
2444
  * @see tsf.tabToggle
2445
  *
2446
  * @function
2451
  if ( ! tsf.hasInput )
2452
  return;
2453
 
2454
+ if ( tsf.states['isPostEdit'] ) {
2455
+ //= Triggers inpost change event for tabs
2456
+ jQuery( '.tsf-flex-nav-tab-radio' ).trigger( 'change' );
2457
+ }
2458
+
2459
  if ( tsf.states['isSettingsPage'] ) {
2460
  let $buttons = jQuery( '.tsf-nav-tab-wrapper .tsf-tab:nth-of-type(n+2) input:checked' );
2461
 
3459
  // Add title prop listeners. Must load before setTabsOnload to work.
3460
  tsf._initTitleInputs();
3461
  tsf._initUnboundTitleSettings();
3462
+ tsf._initSocialTitleInputs();
3463
 
3464
  // Add description prop listeners. Must load before setTabsOnload to work.
3465
  tsf._initDescInputs();
3466
+ tsf._initSocialDescInputs();
3467
 
3468
  // Set primary term listeners.
3469
  tsf._initPrimaryTerm();
lib/js/tsf.min.js CHANGED
@@ -1 +1 @@
1
- 'use strict';window.tsf={nonces:tsfL10n.nonces,i18n:tsfL10n.i18n,states:tsfL10n.states,params:tsfL10n.params,other:tsfL10n.other,settingsChanged:!1,counterType:0,hasInput:!1,additionsClass:'',cropper:{},confirm:function(t){return confirm(t)},escapeString:function(t){if(!t.length)return'';var s={'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;','\'':'&#039;'};return t.replace(/[&<>"']/g,function(a){return s[a]})},getStringLength:function(t){let s,a=0;return t.length&&(s=document.createElement('span'),s.innerHTML=tsf.escapeString(t),a=s.childNodes[0].nodeValue.length),+a},updatePixelCounter:function(t){let s=t.e,a=t.text,o=t.guideline,n=s.parentElement;if(n){let r=n.querySelector('.tsf-pixel-counter-bar'),l=n.querySelector('.tsf-pixel-counter-shadow');if(r&&l){l.innerHTML=tsf.escapeString(a);let d=l.offsetWidth,c='',g='',f='tsf-pixel-counter-fit',u='tsf-pixel-counter-overflown';d>o?(g=100*(o/(d+2*(d-o)/3))+'%',c=u):(g=100*(d/o)+'%',c=f);let x,y=r.querySelector('.tsf-pixel-counter-fluid');x=tsf.i18n.pixelsUsed.replace(/%1\$d/g,d),x=x.replace(/%2\$d/g,o),r.classList.remove(f,u),r.classList.add(c),r.dataset.desc=x,r.setAttribute('aria-label',x),y.style.width=g,tsf._triggerTooltipUpdate(r)}}},_initTitleInputs:function(){if(tsf.hasInput){let t=jQuery('#autodescription_title, #autodescription-meta\\[doctitle\\], #autodescription-site-settings\\[homepage_title\\]');if(t.length){let o,n,r,d,s=!1,a=!!navigator.userAgent.match(/Trident\/7\./),l='',c='',g=tsf.params.titleSeparator,f=tsf.params.objectTitle,u=tsf.states.useTagline,y=tsf.states.isRTL,x=tsf.states.isPrivate,v=tsf.states.isPasswordProtected;o=y?'after':'before';const b=function(){let G='before';tsf.states.isSettingsPage?y?'right'===jQuery('#tsf-home-title-location input:checked').val()&&(G='after'):'left'===jQuery('#tsf-home-title-location input:checked').val()&&(G='after'):tsf.states.isHome?y?'right'===tsf.params.titleLocation&&(G='after'):'left'===tsf.params.titleLocation&&(G='after'):y?'left'===tsf.params.titleLocation&&(G='after'):'right'===tsf.params.titleLocation&&(G='after'),n=G};b();const k=function(){let G='';if(!tsf.states.isSettingsPage)tsf.states.isHome?u&&(G=tsf.params.titleAdditions):u&&(G=tsf.params.titleAdditions);else if(u){let J=document.getElementById('autodescription-site-settings[homepage_title_tagline]'),K=J?J.value:'';G=K.length?K:tsf.params.blogDescription}G.length&&(G=tsf.escapeString(G),'before'===n?G=G+' '+g+' ':'after'===n?G=' '+g+' '+G:void 0),c=G.length?G:'',d=document.getElementById('tsf-title-placeholder'),c.length&&d&&(d.innerHTML=c)};k();const C=function(){let G='';x?G=tsf.i18n.privateTitle:v&&(G=tsf.i18n.protectedTitle),G.length&&(G=tsf.escapeString(G),'before'===o?G+=' ':'after'===o?G=' '+G:void 0),l=G.length?G:'',l.length&&r&&(r.innerHTML=l),r=document.getElementById('tsf-title-placeholder-prefix'),l.length&&r&&(r.innerHTML=l)};C();const T=function(G){if(d||r){let J=jQuery(G.target),K=J.val(),Y=!!c.length,Z=!!l.length;if(!Y&&d&&(d.style.display='none'),!Z&&r&&(r.style.display='none'),!Y&&!Z)return void J.css('text-indent','initial');if(!K.length)return J.css('text-indent','initial'),d&&(d.style.display='none'),void(r&&(r.style.display='none'));let Q=J.outerWidth(!0),tt=(J.outerHeight(!0)-J.height())/2,et=(Q-J.innerWidth())/2,it=y?'right':'left',st=(J.outerWidth(!0)-J.width())/2,at={display:J.css('display'),lineHeight:J.css('lineHeight'),fontFamily:J.css('fontFamily'),fontWeight:J.css('fontWeight'),fontSize:J.css('fontSize'),letterSpacing:J.css('letterSpacing'),paddingTop:tt+'px',paddingBottom:tt+'px'},ot=jQuery(r),nt=jQuery(d),rt=0,lt=0,pt=0,dt=0,ct=0,gt=0;if(Z&&(ot.css(at),ot.css({maxWidth:'initial'}),ct=ot[0].getBoundingClientRect().width,ct<gt&&(ct=0)),Y){let ut=0;switch(function(){let ht=jQuery('#tsf-title-offset');ht.text(K),ht.css({fontFamily:at.fontFamily,fontWeight:at.fontWeight,letterSpacing:at.letterSpacing,fontSize:at.fontSize}),ut=ht[0].getBoundingClientRect().width}(),rt=J[0].getBoundingClientRect().width-et-st-ut-ct,rt<gt&&(ct+=rt,rt=0),nt.css(at),nt.css({maxWidth:'initial'}),n){case'before':let ht=nt[0].getBoundingClientRect().width;ht=rt<ht?rt:ht,ht<gt&&(ht=0),rt=ht,dt+=rt,pt+=rt,lt+=st;break;case'after':lt+=st+ut+ct;}}pt+=st,ct=0>ct?0:ct,dt+=ct;let ft;Z&&(ft={},ft[it]=pt+'px',ft.maxWidth=ct+'px',ot.css(ft)),Y&&(ft={},ft[it]=lt+'px',ft.maxWidth=rt+'px',nt.css(ft)),ft={},ft['text-indent']=dt+'px',J.css(ft)}},I=function(){let J='',K=!!c.length,Y=!!l.length,Z=c,Q=l;tsf.states.isTermEdit&&tsf.params.termName&&(Q=y?' :'+tsf.params.termName:tsf.params.termName+': ',Y=tsf.states.useTermPrefix),J=f,Y&&('before'===o?J=Q+J:'after'===o?J+=Q:void 0),K&&('before'===n?J=Z+J:'after'===n?J+=Z:void 0),a&&(s=!0);let tt=document.createElement('span');tt.innerHTML=J,t.prop('placeholder',tt.textContent),a&&setTimeout(function(){s=!1},0)},S=function(G){let J=document.getElementById(G.target.id+'_chars');if(J){let K=0,Y=G.target,Z='',Q=tsf.counterType,tt='',et='';K=1>Y.value.length?tsf.getStringLength(Y.placeholder):(l?tsf.getStringLength(l):0)+tsf.getStringLength(Y.value)+(c?tsf.getStringLength(c):0),25>K||75<=K?(Z+='tsf-count-bad',tt=tsf.i18n.bad):42>K||55<K?(Z+='tsf-count-okay',tt=tsf.i18n.okay):(Z+='tsf-count-good',tt=tsf.i18n.good),Q&&1!=Q?2==Q?et=tt:3==Q&&(et=K.toString()+' - '+tt):et=K.toString(),J.innerHTML=et,tsf.additionsClass&&(Z+=' '+tsf.additionsClass),J.className!==Z&&(J.className=Z)}},L=function(G){let J=document.getElementById(G.target.id+'_pixels');if(J){let K='';1>G.target.value.length?K=G.target.placeholder:(K=G.target.value,l.length&&('before'===o?K=l+K:'after'===o?K+=l:void 0),c.length&&('before'===n?K=c+K:'after'===n?K+=c:void 0));let Y={e:J,text:K,guideline:tsf.params.titlePixelGuideline};tsf.updatePixelCounter(Y)}};t.on('input.tsfUpdateTitles',function(G){return!s&&void(T(G),I(),S(G),L(G))});t.on('tsf-update-title-counter',function(G){S(G),L(G)});const j=function(){t.trigger('tsf-update-title-counter')},R=function(){t.trigger('input.tsfUpdateTitles')};R();const P=function(){k(),R()};jQuery('#autodescription-site-settings\\[homepage_title_tagline\\]').on('input',P),jQuery('#autodescription-site-settings\\[homepage_tagline\\]').on('change',P);let H=0;const A=function(){clearTimeout(H),H=setTimeout(function(){R()},50)};jQuery(window).on('tsf-counter-updated',A);jQuery('#tsf-title-tagline-toggle :input').on('click',function(G){let J=u;jQuery(G.target).is(':checked')?(jQuery('.tsf-custom-blogname-js').css('display','inline'),u=!0):(jQuery('.tsf-custom-blogname-js').css('display','none'),u=!1),J^u&&(k(),A())});jQuery('#visibility .save-post-visibility').on('click',function(){let J=jQuery('#visibility').find('input:radio:checked').val();switch(x=!1,v=!1,J){case'password':let K=jQuery('#visibility').find('#post_password').val();v=!!K&&!!K.length;break;case'private':x=!0;break;default:case'public':}C(),A()});jQuery('#tsf-title-separator :input').on('click',function(G){let J=jQuery(G.target).val(),K='';K='pipe'===J?'|':'dash'===J?'-':jQuery('<div/>').html('&'+J+';').text(),g=K,jQuery('.tsf-sep-js').text(' '+g+' '),k(),A()});const z=function(){let G=tsf.settingsChanged;R(!0),tsf.settingsChanged=G};jQuery('#homepage-tab-general').on('tsf-tab-toggled',z),jQuery('#tsf-flex-inpost-tab-general').on('tsf-flex-tab-toggled',z);let U=0;const q=function(){clearTimeout(U),U=setTimeout(function(){z()},50)};jQuery(window).one('tsf-ready',function(){jQuery(window).on('tsf-flex-resize',q)});let F=['autodescription-homepage-settings','tsf-inpost-box'];jQuery(document).on('postbox-toggled',function(G,J){if(0<=F.indexOf(J.id)){let K=J.querySelector('.inside');0<K.offsetHeight&&0<K.offsetWidth&&z()}});jQuery('#tsf-home-title-location :input').on('click',function(){b(),k(),A()});tsf.states.isHome||jQuery('#edittag #name, #titlewrap #title').on('input',function(G){let J=G.target.value;J=J.trim(),f=J.length?J:tsf.params.untitledTitle,I(),j()});(function(){let G=0,J=window.innerWidth;window.addEventListener('resize',function(){clearTimeout(G),G=setTimeout(function(){let K=window.innerWidth;J<K?782>=J&&782<=K&&z():782<=J&&782>=K&&z(),J=K},50)})})()}}},_initUnboundTitleSettings:function(){if(tsf.hasInput){let t=jQuery('#autodescription_title, #autodescription-meta\\[doctitle\\], #autodescription-site-settings\\[homepage_title\\]');jQuery('#tsf-title-placeholder, #tsf-title-placeholder-prefix').on('click',function(d){let c=jQuery(d.target).siblings(t)[0];if('function'==typeof c.setSelectionRange){c.focus();let g=2*c.value.length;c.setSelectionRange(g,g)}else{let g=c.value;c.value='',c.focus(),c.value=g}});jQuery('#autodescription-site-settings\\[title_rem_additions\\]').on('click',function(d){jQuery(d.target).is(':checked')?jQuery('.tsf-title-additions-js').css('display','none'):jQuery('.tsf-title-additions-js').css('display','inline')});jQuery('#tsf-title-location input').on('click',function(d){let c=jQuery('.tsf-title-additions-example-left'),g=jQuery('.tsf-title-additions-example-right');'right'===jQuery(d.target).val()?(c.css('display','none'),g.css('display','inline')):(c.css('display','inline'),g.css('display','none'))});jQuery('#autodescription-site-settings\\[homepage_title\\]').on('input',function(d){let c=d.target.value||'',g=jQuery('.tsf-custom-title-js');0===c.length?g.text(tsf.params.objectTitle):g.text(c)});jQuery('#autodescription-site-settings\\[homepage_title_tagline\\]').on('input.tsfInputTagline',function(d){let c=d.target.value||'',g=jQuery('.tsf-custom-tagline-js');0===c.length?(g.text(tsf.params.blogDescription),0===tsf.params.blogDescription.length?jQuery('#tsf-home-title-location .tsf-sep-js').hide():jQuery('#tsf-home-title-location .tsf-sep-js').show()):(g.text(c),jQuery('#tsf-home-title-location .tsf-sep-js').show())}),jQuery('#autodescription-site-settings\\[homepage_title_tagline\\]').trigger('input.tsfInputTagline');jQuery('#title-prefixes-toggle :input').on('click',function(d){let c=jQuery(d.target),g=jQuery('.tsf-title-prefix-example');c.is(':checked')?g.css('display','none'):g.css('display','inline')})}},_initDescInputs:function(){if(tsf.hasInput){let t=jQuery('#autodescription_description, #autodescription-meta\\[description\\], #autodescription-site-settings\\[homepage_description\\]');if(t.length){let s=tsf.params.descriptionSeparator;jQuery('#tsf-description-separator input').on('click',function(y){let x=jQuery(y.target).val(),v='';v='pipe'===x?'|':'dash'===x?'-':jQuery('<div/>').html('&'+x+';').text(),s=v,jQuery('#autodescription-descsep-js').text(' '+s+' '),c()});const o=function(y){let x=document.getElementById(y.target.id+'_chars');if(x){let v=0,b=y.target,k='',C=tsf.counterType,T='',I='';v=1>b.value.length?tsf.getStringLength(b.placeholder):tsf.getStringLength(b.value),100>v||175<=v?(k+='tsf-count-bad',T=tsf.i18n.bad):137>v||155<v?(k+='tsf-count-okay',T=tsf.i18n.okay):(k+='tsf-count-good',T=tsf.i18n.good),C&&1!=C?2==C?I=T:3==C&&(I=v.toString()+' - '+T):I=v.toString(),x.innerHTML=I,tsf.additionsClass&&(k+=' '+tsf.additionsClass),x.className!==k&&(x.className=k)}},n=function(y){let x=document.getElementById(y.target.id+'_pixels');if(x){let v='';v=1>y.target.value.length?y.target.placeholder:y.target.value;let b={e:x,text:v,guideline:tsf.params.descPixelGuideline};tsf.updatePixelCounter(b)}};t.on('input.tsfUpdateDescriptions',function(y){o(y),n(y)});const l=function(){t.trigger('input.tsfUpdateDescriptions')};l();let d=0;const c=function(){clearTimeout(d),d=setTimeout(function(){l()},50)};jQuery(window).on('tsf-counter-updated',c);let f=['autodescription-homepage-settings','tsf-inpost-box'];jQuery(document).on('postbox-toggled',function(y,x){if(0<=f.indexOf(x.id)){let v=x.querySelector('.inside');0<v.offsetHeight&&0<v.offsetWidth&&c()}})}}},_initCounters:function(){if(tsf.hasInput){jQuery('.tsf-counter').on('click',function(){++tsf.counterType,3<tsf.counterType&&(tsf.counterType=0),s();let r='.tsf-counter-wrap .tsf-ajax',l=0;tsf.resetAjaxLoader(r),tsf.setAjaxLoader(r);let d={method:'POST',url:ajaxurl,datatype:'json',data:{action:'the_seo_framework_update_counter',nonce:tsf.nonces.edit_posts,val:tsf.counterType},async:!0,success:function(c){switch(c=jQuery.parseJSON(c),'success'===c.type&&(l=1),l){case 0:tsf.unsetAjaxLoader(r,!1);break;case 1:tsf.unsetAjaxLoader(r,!0);break;default:tsf.resetAjaxLoader(r);}}};jQuery.ajax(d)});const s=function(){let n=tsf.counterType;1==n?(tsf.additionsClass='tsf-counter-one',tsf.counterType=1):2==n?(tsf.additionsClass='tsf-counter-two',tsf.counterType=2):3==n?(tsf.additionsClass='tsf-counter-three',tsf.counterType=3):(tsf.additionsClass='tsf-counter-zero',tsf.counterType=0),tsf._triggerCounterUpdate()};s();jQuery('#autodescription-site-settings\\[display_character_counter\\]').on('click',function(n){jQuery(n.target).is(':checked')?jQuery('.tsf-counter-wrap').show():jQuery('.tsf-counter-wrap').hide()});jQuery('#autodescription-site-settings\\[display_pixel_counter\\]').on('click',function(n){jQuery(n.target).is(':checked')?(jQuery('.tsf-pixel-counter-wrap').show(),tsf._triggerCounterUpdate()):jQuery('.tsf-pixel-counter-wrap').hide()})}},_initPrimaryTerm:function(){if(tsf.hasInput&&Object.keys(tsf.states.taxonomies).length){let t=tsf.states.taxonomies,s=wp.template('tsf-primary-term-selector'),a=wp.template('tsf-primary-term-selector-help'),o=document.createElement('span');o.classList.add('tsf-primary-term-selector'),o.classList.add('tsf-set-primary-term'),function(){let B=document.createElement('input');B.setAttribute('type','radio'),o.appendChild(B)}();let n={},r={},l={},d={},c={};const g=function(B){let z=jQuery('#'+B+'div'),U=s({taxonomy:t[B]});z.append(U)},f=function(B){let z=jQuery('#taxonomy-'+B),U=a({taxonomy:t[B]});z.append(U),u(B)},u=function(B){let z=document.getElementById('taxonomy-'+B),U=z.querySelectorAll('.tabs-panel'),q=Array.prototype.slice.call(U).filter(function(N){return 0<N.offsetWidth||0<N.offsetHeight||0<N.getClientRects().length})[0],F=q.scrollHeight>q.clientHeight?q.offsetWidth-q.clientWidth+25-2:25;tsf.states.isRTL?z.querySelector('.tsf-primary-term-selector-help-wrap').style.left=F+'px':z.querySelector('.tsf-primary-term-selector-help-wrap').style.right=F+'px'},y=function(B){u(B.data.taxonomy)},x=function(B){let z=o.cloneNode(!0);return z.setAttribute('title',t[B].i18n.makePrimary),z.setAttribute('aria-label',t[B].i18n.makePrimary),z},v=function(B,z){let U=document.getElementById('autodescription[_primary_term_'+B+']');U&&U instanceof Element&&(U.value=z)},b=function(B,z){return!z&&d[B]?d[B]:(d[B]=jQuery('#'+B+'checklist, #'+B+'checklist-pop'),d[B])},k=function(B,z){return n[B].filter('[value="'+z+'"]')},C=function(B,z){let U=k(B,z).closest('label');U.length?(U.addClass('tsf-is-primary-term'),U.find('.tsf-set-primary-term').each(function(q,F){F.setAttribute('title',t[B].i18n.primary),F.setAttribute('aria-label',t[B].i18n.primary),F.querySelector('input').checked=!0}),v(B,z),c[B]=z):I(B)},T=function(B){let z=b(B).find('label');z.removeClass('tsf-is-primary-term'),z.find('.tsf-set-primary-term').each(function(U,q){q.setAttribute('title',t[B].i18n.makePrimary),q.setAttribute('aria-label',t[B].i18n.makePrimary),q.querySelector('input').checked=!1}),v(B,'')},I=function(B){let U,z=l[B].first();z.length&&(U=z.val()||'',C(B,U),c[B]=U)},S=function(B){let z=B.data.taxonomy,U=jQuery(B.target).closest('label').find('input[type=checkbox]').val();return T(z),C(z,U),!1},L=function(B){let z=B.data.taxonomy;switch(B.target.checked?(j(z,B.target),W(z,B.target)):(R(z,B.target),E(z,B.target)),l[z].length){case 0:v(z,'');break;case 1:I(z);}},W=function(B,z){let U;k(B,z.value).each(function(q,F){U=jQuery(F).closest('label'),U.find('.tsf-primary-term-selector').length||U.append(x(B))})},E=function(B,z){let U,q;k(B,z.value).each(function(F,N){U=jQuery(N).closest('label'),q=U.hasClass('tsf-is-primary-term'),U.removeClass('tsf-is-primary-term'),U.find('.tsf-primary-term-selector').remove(),q&&I(B)})},j=function(B,z){r[B]=r[B].add('[value="'+z.value+'"]'),l[B]=l[B].add(z)},R=function(B,z){r[B]=r[B].not('[value="'+z.value+'"]'),l[B]=l[B].not('[value="'+z.value+'"]')},P=function(B){let z=b(B,1);n[B]=z.find('input[type=checkbox]'),r[B]=z.find('input[type=checkbox]:checked');let q,U={};l[B]=r[B],l[B].each(function(F,N){q=jQuery(N).val(),U[q]?l[B].splice(F,1):U[q]=!0})},H=function(B,z,U){U.hasOwnProperty('settings')&&U.settings.hasOwnProperty('what')&&(P(U.settings.what),A(U.settings.what),D(U.settings.what),u(U.settings.what))},A=function(B){let z='tsfShowPrimary'+B,U={taxonomy:B},q=b(B),F=jQuery('#'+B+'div'),N=jQuery('#'+B+'-tabs');q.off('click.'+z),q.on('click.'+z,'input[type="checkbox"]',U,L),q.on('click.'+z,'.tsf-primary-term-selector',U,S),F.off('wpListAddEnd.'+z),F.on('wpListAddEnd.'+z,'#'+B+'checklist',H),N.off('click.'+z),N.on('click.'+z,'a',U,y)},D=function(B){b(B).find('input[type="checkbox"]:checked').each(function(z,U){W(B,U)}),t[B].primary?C(B,t[B].primary):I(B)};(function(){for(let B in t)b(B).length&&(g(B),f(B),P(B),A(B),D(B))})()}},_initToolTips:function(){let t=0,s=!1;const a=function(){s=!0,clearTimeout(t),t=setTimeout(function(){s=!1},250)},o=function(y,x){x=x||!1;let v='pointerdown.tsfTT touchstart.tsfTT click.tsfTT',b=jQuery(y);x?(b.off('mousemove mouseleave mouseout tsf-tooltip-update'),jQuery(document.body).off(v)):(b.on({mousemove:d,mouseleave:c,mouseout:c}),jQuery(document.body).off(v).on(v,g)),b.on('tsf-tooltip-update',r)},n=function(y){o(y,!0)},r=function(y){if(y.target.classList.contains('tsf-tooltip-item')){let x=y.target.querySelector('.tsf-tooltip-text');x instanceof Element&&(x.innerHTML=y.target.dataset.desc)}},l=function(y){let x=jQuery(y.target),v=y.target.dataset.desc;if(v&&0===x.find('div').length){y.target.title='';let b=jQuery('<div class="tsf-tooltip"><span class="tsf-tooltip-text-wrap"><span class="tsf-tooltip-text">'+v+'</span></span><div class="tsf-tooltip-arrow"></div></div>');x.append(b);let k=x.closest('.tsf-tooltip-boundary');k=k.length&&k||jQuery(document.body);let C=x.outerHeight()+9,T=b.offset().top-C,I=k.offset().top-(k.prop('scrolltop')||0);I>T?(b.addClass('tsf-tooltip-down'),b.css('top',C+'px')):b.css('bottom',C+'px');let S=x.closest('.tsf-tooltip-wrap'),L=b.find('.tsf-tooltip-text-wrap'),W=L.find('.tsf-tooltip-text'),E=S.width(),j=L.outerWidth(!0),R=W.outerWidth(!0),P=L.offset().left,H=P+R,A=k.offset().left-(k.prop('scrollLeft')||0),D=A+k.outerWidth(),O='left';if(P<A){let B=A-P+12,z=parseInt(L.css('flex-basis'),10);B<-z&&(B=-z),b.css(O,B+'px'),b.data('overflow',B),b.data('overflowDir',O)}else if(H>D){let B=D-H-E-12,z=parseInt(L.css('flex-basis'),10);B<-z&&(B=-z),b.css(O,B+'px'),b.data('overflow',B),b.data('overflowDir',O)}else if(42>E){let B=-15;b.css(O,B+'px'),b.data('overflow',B),b.data('overflowDir',O)}else if(E>j){let B=y.originalEvent&&y.originalEvent.pageX||y.pageX,z=S.offset().left,q=B-z-j/2,F=q+j;0>q?q=0:F>E&&(q=E-R),b.css(O,q+'px'),b.data('adjust',q),b.data('adjustDir',O)}}},d=function(y){let x=jQuery(y.target),v=x.find('.tsf-tooltip'),b=v.find('.tsf-tooltip-arrow'),k=v.data('overflow'),C=v.data('overflowDir');if(k=parseInt(k,10),k=isNaN(k)?0:-Math.round(k),k)b.css(C,k+'px');else{let T=y.originalEvent&&y.originalEvent.pageX||y.pageX,I=7,S=16,L=x.closest('.tsf-tooltip-wrap'),W=T-L.offset().left-S/2,j=v.find('.tsf-tooltip-text-wrap'),R=j.outerWidth(!0),P=v.data('adjust'),H=v.data('adjustDir'),A=R-S-I;if(P=parseInt(P,10),P=isNaN(P)?0:Math.round(P),P&&(P='left'===H?-P:P,W+=P,A-P>L.outerWidth(!0))){let D=j.find('.tsf-tooltip-text'),O=D.outerWidth(!0);A=O-S-I}W<=I?b.css('left',I+'px'):W>=A?b.css('left',A+'px'):b.css('left',W+'px')}},c=function(y){s||(jQuery(y.target).find('.tsf-tooltip').remove(),n(y.target))},g=function(y){a();let k,v='.tsf-tooltip',b=jQuery(y.target);if(b.hasClass('tsf-tooltip-item')&&(k=b.find(v)),!k){let C=b.children('.tsf-tooltip-item');C.length&&(k=C.find(v))}k&&k.length?jQuery(v).not(k).remove():jQuery(v).remove()},f=function(y){if(!s){let x=!1;switch(y.type){case'mouseenter':break;case'pointerdown':case'touchstart':x=!0;break;default:}if(y.target.classList.contains('tsf-tooltip-item'))x&&g(y),l(y),d(y),o(y.target);else{let v=y.target.querySelector('.tsf-tooltip-item:hover'),b=new jQuery.Event(y.type);b.pageX=y.originalEvent&&y.originalEvent.pageX||y.pageX,v?(tsfL10n.states.debug&&console.log('Tooltip event warning: delegation'),jQuery(v).trigger(b)):(tsfL10n.states.debug&&console.log('Tooltip event warning: bubbling'),jQuery(y.target).closest('.tsf-tooltip-wrap').find('.tsf-tooltip-item:hover').trigger(b))}y.stopPropagation()}},u=function(){let y=jQuery('.tsf-tooltip-wrap');y.off('mouseenter pointerdown touchstart'),y.on('mouseenter pointerdown touchstart','.tsf-tooltip-item',f)};u(),jQuery(window).on('tsf-reset-tooltips',u),function(){let y=jQuery('#wpcontent');tsf.addTooltipBoundary(y)}()},addTooltipBoundary:function(t){jQuery(t).addClass('tsf-tooltip-boundary')},tabToggle:function(t){let s=jQuery(t.target);if(s.is(':checked')){let a=s.prop('id'),o=s.prop('name');if('undefined'!=typeof o){let n='tsf-active-tab-content',r=jQuery('#'+a+'-content'),l=jQuery('.'+n);if(!r.is(l)&&'undefined'!=typeof r){let d=jQuery('.'+o+'-content');d.fadeOut(150,function(){jQuery(this).removeClass(n)}),setTimeout(function(){r.addClass(n).fadeIn(250)},150),setTimeout(function(){jQuery('#'+a).trigger('tsf-tab-toggled')},175)}}}},flexTabToggle:function(t){let s=jQuery(t.target);if(s.is(':checked')){let a=s.prop('id'),o=s.prop('name');if('undefined'!=typeof o){let n='tsf-flex-tab-content-active',r=jQuery('#'+a+'-content'),l=jQuery('.'+n);if(!r.is(l)&&'undefined'!=typeof r){let d=jQuery('.'+o+'-content');d.fadeOut(150,function(){jQuery(this).removeClass(n)}),setTimeout(function(){r.addClass(n).fadeIn(250)},150),setTimeout(function(){jQuery('#'+a).trigger('tsf-flex-tab-toggled')},175)}}}},setTabsOnload:function(){if(tsf.hasInput)if(tsf.states.isSettingsPage){let t=jQuery('.tsf-nav-tab-wrapper .tsf-tab:nth-of-type(n+2) input:checked');t.length&&t.each(function(){let a=jQuery(this),o=a.prop('id'),n=a.prop('name');if('undefined'!=typeof n){let r='tsf-active-tab-content',l=jQuery('#'+o+'-content');if('undefined'!=typeof l){let d=jQuery('.'+n+'-content');d.removeClass(r),l.addClass(r),setTimeout(function(){jQuery('#'+o).trigger('tsf-tab-toggled')},20)}}})}else;},taglineToggleDesc:function(t){let s=jQuery(t.target),a=jQuery('#tsf-on-blogname-js');s.is(':checked')?a.css('display','inline'):a.css('display','none')},additionsToggleDesc:function(t){let s=jQuery(t.target),a=jQuery('#tsf-description-additions-js');s.is(':checked')?a.css('display','inline'):a.css('display','none')},taglineToggleOnload:function(){if(tsf.hasInput){let t=jQuery('#tsf-title-tagline-toggle :input'),s=jQuery('.tsf-custom-blogname-js'),a=jQuery('#tsf-description-additions-toggle :input'),o=jQuery('#tsf-description-additions-js'),n=jQuery('#tsf-description-onblogname-toggle :input'),r=jQuery('#tsf-on-blogname-js'),l=jQuery('#tsf-title-additions-toggle :input'),d=jQuery('.tsf-title-additions-js');t.is(':checked')?s.css('display','inline'):s.css('display','none'),a.is(':checked')?o.css('display','inline'):o.css('display','none'),n.is(':checked')?r.css('display','inline'):r.css('display','none'),l.is(':checked')?d.css('display','none'):d.css('display','inline')}},attachUnsavedChangesListener:function(){if(tsf.hasInput){let t=function(o){tsf.settingsChanged||tsf.registerChange(),jQuery(s).not(a).off(o.type,t)},s='.tsf-metaboxes :input, #tsf-inpost-box .inside :input',a='.tsf-tab :input, .tsf-flex-nav-tab :input';jQuery(s).not(a).on('change',t),s='.tsf-metaboxes input[type=text], .tsf-metaboxes textarea, #tsf-inpost-box .inside input[type=text], #tsf-inpost-box .inside textarea',a='.tsf-nav-tab-wrapper input, .tsf-flex-nav-tab-wrapper input',jQuery(s).not(a).on('input',t),window.onbeforeunload=function(){if(tsf.settingsChanged)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})}},registerChange:function(){tsf.settingsChanged=!0},confirmedReset:function(){return confirm(tsf.i18n.confirmReset)},onLoadUnregisterChange:function(){tsf.settingsChanged=!1},dismissNotice:function(t){jQuery(t.target).parents('.tsf-notice').slideUp(200,function(){this.remove()})},setAjaxLoader:function(t){jQuery(t).toggleClass('tsf-loading')},unsetAjaxLoader:function(t,s){let a='tsf-success',o=2500;s||(a='tsf-error',o=5e3),jQuery(t).removeClass('tsf-loading').addClass(a).fadeOut(o)},resetAjaxLoader:function(t){jQuery(t).stop().empty().prop('class','tsf-ajax').css('opacity','1').removeProp('style')},openImageEditor:function(t){if(jQuery(t.target).prop('disabled')||'undefined'==typeof wp.media)return t.preventDefault(),void t.stopPropagation();let o,s=jQuery(t.target),a=s.data('inputid');if(o)return void o.open();t.preventDefault(),t.stopPropagation(),tsf.extendCropper();let n={suggestedWidth:s.data('width')||1200,suggestedHeight:s.data('height')||630,isFlex:'undefined'==typeof s.data('flex')?1:s.data('flex')};tsf.cropper.control={params:{flex_width:n.isFlex?4096:0,flex_height:n.isFlex?4096:0,width:n.suggestedWidth,height:n.suggestedHeight,isFlex:n.isFlex}},o=wp.media({button:{text:tsf.other[a].frame_button,close:!1},states:[new wp.media.controller.Library({title:tsf.other[a].frame_title,library:wp.media.query({type:'image'}),multiple:!1,date:!1,priority:20,suggestedWidth:n.suggestedWidth,suggestedHeight:n.suggestedHeight}),new tsf.cropper({imgSelectOptions:tsf.calculateImageSelectOptions})]});const r=function(){o.setState('cropper')};o.off('select',r),o.on('select',r);const l=function(g){let f=g.url,u=g.id,y=g.width,x=g.height;jQuery('#'+a+'-url').val(f),jQuery('#'+a+'-id').val(u)};o.off('cropped',l),o.on('cropped',l);const d=function(g){let f=g.get('url'),u=g.get('id'),y=g.get('width'),x=g.get('height');jQuery('#'+a+'-url').val(f),jQuery('#'+a+'-id').val(u)};o.off('skippedcrop',d),o.on('skippedcrop',d);const c=function(){jQuery('#'+a+'-select').text(tsf.other[a].change),jQuery('#'+a+'-url').prop('readonly',!0).css('opacity',0).animate({opacity:1},{queue:!0,duration:1000},'swing'),tsf.appendRemoveButton(s,a,!0),tsf.registerChange()};o.off('skippedcrop cropped',c),o.on('skippedcrop cropped',c),o.open()},appendRemoveButton:function(t,s,a){t&&s&&!jQuery('#'+s+'-remove').length&&(t.after('<a href="javascript:void(0)" id="'+s+'-remove" class="tsf-remove-social-image button button-small" data-inputid="'+s+'" title="'+tsf.other[s].remove_title+'">'+tsf.other[s].remove+'</a>'),a&&jQuery('#'+s+'-remove').css('opacity',0).animate({opacity:1},{queue:!0,duration:1000},'swing')),tsf.resetImageEditorActions()},removeEditorImage:function(t){let s=jQuery(t.target).data('inputid');if(!jQuery('#'+s+'-select').prop('disabled')){jQuery('#'+s+'-select').addClass('disabled').prop('disabled',!0),jQuery('#'+s+'-remove').addClass('disabled').prop('disabled',!0).fadeOut(500,function(){jQuery(this).remove(),jQuery('#'+s+'-select').text(tsf.other[s].select).removeClass('disabled').removeProp('disabled')});let a=jQuery('#'+s+'-url');a.val(''),a.data('readonly')||a.removeProp('readonly'),a.css('opacity',0).animate({opacity:1},{queue:!0,duration:500},'swing'),jQuery('#'+s+'-id').val(''),tsf.registerChange()}},extendCropper:function(){if('undefined'==typeof tsf.cropper.control){let t,a,s=wp.media.controller,o=wp.media.view;return a=o.Cropper.extend({className:'crop-content tsf-image',ready:function(){o.Cropper.prototype.ready.apply(this,arguments)},onImageLoad:function(){let r,n=this.controller.get('imgSelectOptions');'function'==typeof n&&(n=n(this.options.attachment,this.controller)),'undefined'==typeof n.aspectRatio&&(n=_.extend(n,{parent:this.$el,onInit:function(){this.parent.children().on('mousedown touchstart',function(l){l.shiftKey?r.setOptions({aspectRatio:'1:1'}):r.setOptions({aspectRatio:!1})})}})),this.trigger('image-loaded'),r=this.controller.imgSelect=this.$image.imgAreaSelect(n)}}),t=s.Cropper.extend({createCropContent:function(){this.cropperView=new a({controller:this,attachment:this.get('selection').first()}),this.cropperView.on('image-loaded',this.createCropToolbar,this),this.frame.content.set(this.cropperView)},doCrop:function(n){let r=n.get('cropDetails'),l=tsf.cropper.control;if(l.params.flex_width&&l.params.flex_height)if(r.width===r.height)r.width>l.params.flex_width&&(r.dst_width=r.dst_height=l.params.flex_width);else if(r.width>l.params.flex_width||r.height>l.params.flex_height)if(r.width>r.height){let d=r.width/l.params.flex_width;r.dst_width=l.params.flex_width,r.dst_height=Math.round(r.height/d)}else{let d=r.height/l.params.flex_height;r.dst_height=l.params.flex_height,r.dst_width=Math.round(r.width/d)}return'undefined'==typeof r.dst_width&&(r.dst_width=0,r.dst_height=0),wp.ajax.post('tsf-crop-image',{nonce:tsf.nonces.upload_files,id:n.get('id'),context:'tsf-image',cropDetails:r})}}),t.prototype.control={},void(tsf.cropper=t)}},calculateImageSelectOptions:function(t,s){let y,x,v,b,a=tsf.cropper.control,o=!!parseInt(a.params.flex_width,10),n=!!parseInt(a.params.flex_height,10),r=parseInt(a.params.width,10),l=parseInt(a.params.height,10),d=t.get('width'),c=t.get('height'),g=r/l,f=r,u=l;return b=a.params.isFlex?!tsf.mustBeCropped(a.params.flex_width,a.params.flex_height,d,c):g==d/c,s.set('control',a.params),s.set('canSkipCrop',b),d/c>g?(l=c,r=l*g):(r=d,l=r/g),y=(d-r)/2,x=(c-l)/2,v={handles:!0,keys:!0,instance:!0,persistent:!0,imageWidth:d,imageHeight:c,minWidth:f>r?r:f,minHeight:u>l?l:u,x1:y,y1:x,x2:r+y,y2:l+x},a.params.isFlex?n||o?(n&&(v.minHeight=200,v.maxWidth=d),o&&(v.minWidth=200,v.maxHeight=c)):v.aspectRatio=r+':'+l:(v.handles='corners',v.aspectRatio=r+':'+l),v},mustBeCropped:function(t,s,a,o){return a<=t&&o<=s?!1:!0},resetImageEditorActions:function(){jQuery('.tsf-remove-social-image').off('click',tsf.removeEditorImage),jQuery('.tsf-remove-social-image').on('click',tsf.removeEditorImage)},setupImageEditorActions:function(){jQuery('.tsf-set-social-image').off('click',tsf.openImageEditor),jQuery('.tsf-remove-social-image').off('click',tsf.removeEditorImage),jQuery('.tsf-set-social-image').on('click',tsf.openImageEditor),jQuery('.tsf-remove-social-image').on('click',tsf.removeEditorImage)},checkImageEditorInput:function(){let t=jQuery('.tsf-set-social-image');if(t.length){let s='',a='';jQuery.each(t,function(o,n){s=jQuery(n).data('inputid'),a=jQuery('#'+s+'-id'),a.length&&0<a.val()&&(jQuery('#'+s+'-url').prop('readonly',!0),tsf.appendRemoveButton(jQuery(n),s,!1)),jQuery('#'+s+'-url').val()&&jQuery('#'+s+'-select').text(tsf.other[s].change)})}},setColorOnload:function(){let t=jQuery('.tsf-color-picker');t.length&&jQuery.each(t,function(s,a){let o=jQuery(a),n='',r=o.data('tsf-default-color');o.wpColorPicker({defaultColor:r,width:238,change:function(){n=o.wpColorPicker('color'),''==n&&(n=r),o.val(n),tsf.registerChange()},clear:function(){o.parent().siblings('.wp-color-result').css('backgroundColor',r),tsf.registerChange()},palettes:!1})})},_doFlexResizeListener:function(){if(jQuery('.tsf-flex').length){tsf._setResizeListeners();let t=0,s={},a=0,o=jQuery('.tsf-flex-nav-tab-wrapper'),n=jQuery(window);n.on('tsf-flex-resize',function(){clearTimeout(t);let r=0;t=setTimeout(function(){if(o.length){let l=jQuery('.tsf-flex-nav-tab-inner'),d=o.width(),c=l.width(),g=jQuery('.tsf-flex-nav-name');s.tabWrapper||(s.tabWrapper={},s.tabWrapper.outer=0,s.tabWrapper.inner=0,s.tabWrapper.shown=1),!s.tabWrapper.shown&&s.tabWrapper.outer<d&&(g.fadeIn(250),setTimeout(function(){c=l.width()},r)),setTimeout(function(){c>d?(g.hide(),s.tabWrapper.shown=0):s.tabWrapper.outer<d&&(g.fadeIn(250),s.tabWrapper.shown=1)},2*r),setTimeout(function(){s.tabWrapper.outer=d,s.tabWrapper.inner=c},3*r)}},a),r=10,a=75}),n.trigger('tsf-flex-resize')}},_setResizeListeners:function(){jQuery(window).on('resize orientationchange',tsf._triggerResize),jQuery('#collapse-menu').click(tsf._triggerResize),jQuery('.columns-prefs :input[type=radio]').change(tsf._triggerResize),jQuery('.meta-box-sortables').on('sortupdate',tsf._triggerResize)},_triggerTooltipReset:function(){jQuery(window).trigger('tsf-reset-tooltips')},_triggerTooltipUpdate:function(t){jQuery(t).trigger('tsf-tooltip-update')},_triggerResize:function(){jQuery(window).trigger('tsf-flex-resize')},_triggerCounterUpdate:function(){jQuery(window).trigger('tsf-counter-updated')},_triggerReady:function(){jQuery(document.body).trigger('tsf-ready')},_doReady:function(){tsf._initCounters(),tsf._initTitleInputs(),tsf._initUnboundTitleSettings(),tsf._initDescInputs(),tsf._initPrimaryTerm(),tsf.setTabsOnload(),tsf.taglineToggleOnload(),tsf._initToolTips(),tsf.setupImageEditorActions(),tsf.checkImageEditorInput(),tsf.setColorOnload(),tsf.attachUnsavedChangesListener(),tsf.onLoadUnregisterChange(),tsf._doFlexResizeListener(),tsf._triggerReady()},setupVars:function(){tsf.counterType=parseInt(tsf.states.counterType),tsf.hasInput=tsf.states.hasInput},ready:function(t){tsf.setupVars(),t('div.updated, div.error, div.notice-warning').insertAfter('div.tsf-top-wrap'),t(document.body).ready(tsf._doReady),t('.tsf-js-confirm-reset').on('click',tsf.confirmedReset),t('.tsf-tabs-radio').on('change',tsf.tabToggle),t('.tsf-flex-nav-tab-radio').on('change',tsf.flexTabToggle),t('#tsf-description-onblogname-toggle :input').on('click',tsf.taglineToggleDesc),t('#tsf-description-additions-toggle :input').on('click',tsf.additionsToggleDesc),t('.tsf-dismiss').on('click',tsf.dismissNotice)}},jQuery(tsf.ready);
1
+ 'use strict';window.tsf={nonces:tsfL10n.nonces,i18n:tsfL10n.i18n,states:tsfL10n.states,params:tsfL10n.params,other:tsfL10n.other,settingsChanged:!1,counterType:0,hasInput:!1,additionsClass:'',cropper:{},confirm:function(t){return confirm(t)},escapeString:function(t){if(!t.length)return'';let s={'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;','\'':'&#039;'};return t.replace(/[&<>"']/g,a=>{return s[a]})},unescapeString:function(t){if(!t.length)return'';let s={'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;','\'':'&#039;'},a=Object.keys(s).map(n=>s[n]),o=new RegExp(a.map(n=>{return n.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,'\\$&')}).join('|'),'g');return t.replace(o,n=>{return Object.keys(s).find(r=>{return s[r]===n})})},getStringLength:function(t){let s,a=0;return t.length&&(s=document.createElement('span'),s.innerHTML=tsf.escapeString(t),a=s.childNodes[0].nodeValue.length),+a},updatePixelCounter:function(t){let s=t.e,a=t.text,o=t.guideline,n=s.parentElement;if(n){let r=n.querySelector('.tsf-pixel-counter-bar'),l=n.querySelector('.tsf-pixel-counter-shadow');if(r&&l){l.innerHTML=tsf.escapeString(a);let d=l.offsetWidth,c='',g='',f='tsf-pixel-counter-fit',u='tsf-pixel-counter-overflown';d>o?(g=100*(o/(d+2*(d-o)/3))+'%',c=u):(g=100*(d/o)+'%',c=f);let x,y=r.querySelector('.tsf-pixel-counter-fluid');x=tsf.i18n.pixelsUsed.replace(/%1\$d/g,d),x=x.replace(/%2\$d/g,o),r.classList.remove(f,u),r.classList.add(c),r.dataset.desc=x,r.setAttribute('aria-label',x),y.style.width=g,tsf._triggerTooltipUpdate(r)}}},_initTitleInputs:function(){if(tsf.hasInput){let t=jQuery('#autodescription_title, #autodescription-meta\\[doctitle\\], #autodescription-site-settings\\[homepage_title\\]');if(t.length){let o,n,r,d,s=!1,a=!!navigator.userAgent.match(/Trident\/7\./),l='',c='',g=tsf.params.titleSeparator,f=tsf.params.objectTitle,u=tsf.states.useTagline,y=tsf.states.isRTL,x=tsf.states.isPrivate,b=tsf.states.isPasswordProtected;o=y?'after':'before';const T=function(){let Y='before';tsf.states.isSettingsPage?y?'right'===jQuery('#tsf-home-title-location input:checked').val()&&(Y='after'):'left'===jQuery('#tsf-home-title-location input:checked').val()&&(Y='after'):tsf.states.isHome?y?'right'===tsf.params.titleLocation&&(Y='after'):'left'===tsf.params.titleLocation&&(Y='after'):y?'left'===tsf.params.titleLocation&&(Y='after'):'right'===tsf.params.titleLocation&&(Y='after'),n=Y};T();const C=function(){let Y='';if(!tsf.states.isSettingsPage)tsf.states.isHome?u&&(Y=tsf.params.titleAdditions):u&&(Y=tsf.params.titleAdditions);else if(u){let Z=document.getElementById('autodescription-site-settings[homepage_title_tagline]'),Q=Z?Z.value:'';Y=Q.length?Q:tsf.params.blogDescription}Y.length&&(Y=tsf.escapeString(Y),'before'===n?Y=Y+' '+g+' ':'after'===n?Y=' '+g+' '+Y:void 0),c=Y.length?Y:'',d=document.getElementById('tsf-title-placeholder'),c.length&&d&&(d.innerHTML=c)};C();const S=function(){let Y='';x?Y=tsf.i18n.privateTitle:b&&(Y=tsf.i18n.protectedTitle),Y.length&&(Y=tsf.escapeString(Y),'before'===o?Y+=' ':'after'===o?Y=' '+Y:void 0),l=Y.length?Y:'',l.length&&r&&(r.innerHTML=l),r=document.getElementById('tsf-title-placeholder-prefix'),l.length&&r&&(r.innerHTML=l)};S();const I=function(Y){if(d||r){let Z=jQuery(Y.target),Q=Z.val(),tt=!!c.length,et=!!l.length;if(!tt&&d&&(d.style.display='none'),!et&&r&&(r.style.display='none'),!tt&&!et)return void Z.css('text-indent','initial');if(!Q.length)return Z.css('text-indent','initial'),d&&(d.style.display='none'),void(r&&(r.style.display='none'));let it=Z.outerWidth(!0),st=(Z.outerHeight(!0)-Z.height())/2,at=(it-Z.innerWidth())/2,ot=y?'right':'left',nt=(Z.outerWidth(!0)-Z.width())/2,rt={display:Z.css('display'),lineHeight:Z.css('lineHeight'),fontFamily:Z.css('fontFamily'),fontWeight:Z.css('fontWeight'),fontSize:Z.css('fontSize'),letterSpacing:Z.css('letterSpacing'),paddingTop:st+'px',paddingBottom:st+'px'},lt=jQuery(r),pt=jQuery(d),dt=0,ct=0,gt=0,ft=0,ut=0,ht=0;if(et&&(lt.css(rt),lt.css({maxWidth:'initial'}),ut=lt[0].getBoundingClientRect().width,ut<ht&&(ut=0)),tt){let yt=0;switch(function(){let xt=jQuery('#tsf-title-offset');xt.text(Q),xt.css({fontFamily:rt.fontFamily,fontWeight:rt.fontWeight,letterSpacing:rt.letterSpacing,fontSize:rt.fontSize}),yt=xt[0].getBoundingClientRect().width}(),dt=Z[0].getBoundingClientRect().width-at-nt-yt-ut,dt<ht&&(ut+=dt,dt=0),pt.css(rt),pt.css({maxWidth:'initial'}),n){case'before':let xt=pt[0].getBoundingClientRect().width;xt=dt<xt?dt:xt,xt<ht&&(xt=0),dt=xt,ft+=dt,gt+=dt,ct+=nt;break;case'after':ct+=nt+yt+ut;}}gt+=nt,ut=0>ut?0:ut,ft+=ut;let mt;et&&(mt={},mt[ot]=gt+'px',mt.maxWidth=ut+'px',lt.css(mt)),tt&&(mt={},mt[ot]=ct+'px',mt.maxWidth=dt+'px',pt.css(mt)),mt={},mt['text-indent']=ft+'px',Z.css(mt)}},L=function(){let Z='',Q=!!c.length,tt=!!l.length,et=c,it=l;tsf.states.isTermEdit&&tsf.params.termName&&(it=y?' :'+tsf.params.termName:tsf.params.termName+': ',tt=tsf.states.useTermPrefix),Z=f,tt&&('before'===o?Z=it+Z:'after'===o?Z+=it:void 0),Q&&('before'===n?Z=et+Z:'after'===n?Z+=et:void 0),a&&(s=!0);let st=document.createElement('span');st.innerHTML=Z,t.prop('placeholder',st.textContent),a&&setTimeout(function(){s=!1},0)},E=function(Y){let Z=document.getElementById('tsf-title-reference'),Q='';Z&&(1>Y.target.value.length?Q=Y.target.placeholder:(Q=Y.target.value,l.length&&('before'===o?Q=l+Q:'after'===o?Q+=l:void 0),c.length&&('before'===n?Q=c+Q:'after'===n?Q+=c:void 0)),Z.innerHTML=tsf.escapeString(Q),setTimeout(()=>{jQuery(Z).change()},0))},W=function(Y){let Z=document.getElementById(Y.target.id+'_chars'),Q=document.getElementById('tsf-title-reference');if(Z&&Q){let tt=tsf.getStringLength(tsf.unescapeString(Q.innerHTML)),et=Y.target,it='',st=tsf.counterType,at='',ot='';25>tt||75<=tt?(it+='tsf-count-bad',at=tsf.i18n.bad):42>tt||55<tt?(it+='tsf-count-okay',at=tsf.i18n.okay):(it+='tsf-count-good',at=tsf.i18n.good),st&&1!=st?2==st?ot=at:3==st&&(ot=tt.toString()+' - '+at):ot=tt.toString(),Z.innerHTML=ot,tsf.additionsClass&&(it+=' '+tsf.additionsClass),Z.className!==it&&(Z.className=it)}},j=function(Y){let Z=document.getElementById(Y.target.id+'_pixels'),Q=document.getElementById('tsf-title-reference');if(Z&&Q){let tt={e:Z,text:tsf.unescapeString(Q.innerHTML),guideline:tsf.params.titlePixelGuideline};tsf.updatePixelCounter(tt)}};t.on('input.tsfUpdateTitles',function(Y){return!s&&void(I(Y),L(),E(Y),W(Y),j(Y))});t.on('tsf-update-title-counter',function(Y){E(Y),W(Y),j(Y)});const P=function(){t.trigger('tsf-update-title-counter')},D=function(){t.trigger('input.tsfUpdateTitles')};D();const A=function(){C(),D()};jQuery('#autodescription-site-settings\\[homepage_title_tagline\\]').on('input',A),jQuery('#autodescription-site-settings\\[homepage_tagline\\]').on('change',A);let B=0;const O=function(){clearTimeout(B),B=setTimeout(function(){D()},50)};jQuery(window).on('tsf-counter-updated',O);jQuery('#tsf-title-tagline-toggle :input').on('click',function(Y){let Z=u;jQuery(Y.target).is(':checked')?(jQuery('.tsf-custom-blogname-js').css('display','inline'),u=!0):(jQuery('.tsf-custom-blogname-js').css('display','none'),u=!1),Z^u&&(C(),O())});jQuery('#visibility .save-post-visibility').on('click',function(){let Z=jQuery('#visibility').find('input:radio:checked').val();switch(x=!1,b=!1,Z){case'password':let Q=jQuery('#visibility').find('#post_password').val();b=!!Q&&!!Q.length;break;case'private':x=!0;break;default:case'public':}S(),O()});jQuery('#tsf-title-separator :input').on('click',function(Y){let Z=jQuery(Y.target).val(),Q='';Q='pipe'===Z?'|':'dash'===Z?'-':jQuery('<div/>').html('&'+Z+';').text(),g=Q,jQuery('.tsf-sep-js').text(' '+g+' '),C(),O()});const M=function(){let Y=tsf.settingsChanged;D(!0),tsf.settingsChanged=Y};jQuery('#homepage-tab-general').on('tsf-tab-toggled',M),jQuery('#tsf-flex-inpost-tab-general').on('tsf-flex-tab-toggled',M);let N=0;const F=function(){clearTimeout(N),N=setTimeout(M,50)};jQuery(window).one('tsf-ready',function(){jQuery(window).on('tsf-flex-resize',F)});let X=['autodescription-homepage-settings','tsf-inpost-box'];jQuery(document).on('postbox-toggled',function(Y,Z){if(0<=X.indexOf(Z.id)){let Q=Z.querySelector('.inside');0<Q.offsetHeight&&0<Q.offsetWidth&&M()}});jQuery('#tsf-home-title-location :input').on('click',function(){T(),C(),O()});tsf.states.isHome||jQuery('#edittag #name, #titlewrap #title').on('input',function(Y){let Z=Y.target.value;Z=Z.trim(),f=Z.length?tsf.escapeString(Z):tsf.params.untitledTitle,L(),P()});(function(){let Y=0,Z=window.innerWidth;window.addEventListener('resize',function(){clearTimeout(Y),Y=setTimeout(function(){let Q=window.innerWidth;Z<Q?782>=Z&&782<=Q&&M():782<=Z&&782>=Q&&M(),Z=Q},50)})})()}}},_initUnboundTitleSettings:function(){if(tsf.hasInput){let t=jQuery('#autodescription_title, #autodescription-meta\\[doctitle\\], #autodescription-site-settings\\[homepage_title\\]');jQuery('#tsf-title-placeholder, #tsf-title-placeholder-prefix').on('click',function(d){let c=jQuery(d.target).siblings(t)[0];if('function'==typeof c.setSelectionRange){c.focus();let g=2*c.value.length;c.setSelectionRange(g,g)}else{let g=c.value;c.value='',c.focus(),c.value=g}});jQuery('#autodescription-site-settings\\[title_rem_additions\\]').on('click',function(d){jQuery(d.target).is(':checked')?jQuery('.tsf-title-additions-js').css('display','none'):jQuery('.tsf-title-additions-js').css('display','inline')});jQuery('#tsf-title-location input').on('click',function(d){let c=jQuery('.tsf-title-additions-example-left'),g=jQuery('.tsf-title-additions-example-right');'right'===jQuery(d.target).val()?(c.css('display','none'),g.css('display','inline')):(c.css('display','inline'),g.css('display','none'))});jQuery('#autodescription-site-settings\\[homepage_title\\]').on('input',function(d){let c=d.target.value||'',g=jQuery('.tsf-custom-title-js');0===c.length?g.text(tsf.params.objectTitle):g.text(c)});jQuery('#autodescription-site-settings\\[homepage_title_tagline\\]').on('input.tsfInputTagline',function(d){let c=d.target.value||'',g=jQuery('.tsf-custom-tagline-js');0===c.length?(g.text(tsf.params.blogDescription),0===tsf.params.blogDescription.length?jQuery('#tsf-home-title-location .tsf-sep-js').hide():jQuery('#tsf-home-title-location .tsf-sep-js').show()):(g.text(c),jQuery('#tsf-home-title-location .tsf-sep-js').show())}),jQuery('#autodescription-site-settings\\[homepage_title_tagline\\]').trigger('input.tsfInputTagline');jQuery('#title-prefixes-toggle :input').on('click',function(d){let c=jQuery(d.target),g=jQuery('.tsf-title-prefix-example');c.is(':checked')?g.css('display','none'):g.css('display','inline')})}},_initDescInputs:function(){if(tsf.hasInput){let t=jQuery('#autodescription_description, #autodescription-meta\\[description\\], #autodescription-site-settings\\[homepage_description\\]');if(t.length){let s=tsf.params.descriptionSeparator;jQuery('#tsf-description-separator input').on('click',function(x){let b=jQuery(x.target).val(),T='';T='pipe'===b?'|':'dash'===b?'-':jQuery('<div/>').html('&'+b+';').text(),s=T,jQuery('#autodescription-descsep-js').text(' '+s+' '),g()});const o=function(x){let b=document.getElementById(x.target.id+'_chars');if(b){let T=0,C=x.target,S='',I=tsf.counterType,L='',E='';T=1>C.value.length?tsf.getStringLength(C.placeholder):tsf.getStringLength(C.value),100>T||330<=T?(S+='tsf-count-bad',L=tsf.i18n.bad):137>T||300<T?(S+='tsf-count-okay',L=tsf.i18n.okay):(S+='tsf-count-good',L=tsf.i18n.good),I&&1!=I?2==I?E=L:3==I&&(E=T.toString()+' - '+L):E=T.toString(),b.innerHTML=E,tsf.additionsClass&&(S+=' '+tsf.additionsClass),b.className!==S&&(b.className=S)}},n=function(x){let b=document.getElementById('tsf-description-reference'),T='';b&&(T=1>x.target.value.length?x.target.placeholder:x.target.value,b.innerHTML=tsf.escapeString(T),setTimeout(()=>{jQuery(b).change()},0))},r=function(x){let b=document.getElementById(x.target.id+'_pixels'),T=document.getElementById('tsf-description-reference');if(b&&T){let C={e:b,text:tsf.unescapeString(T.innerHTML),guideline:tsf.params.descPixelGuideline};tsf.updatePixelCounter(C)}};t.on('input.tsfUpdateDescriptions',function(x){n(x),o(x),r(x)});const d=function(){t.trigger('input.tsfUpdateDescriptions')};d();let c=0;const g=function(){clearTimeout(c),c=setTimeout(function(){d()},50)};jQuery(window).on('tsf-counter-updated',g);let u=['autodescription-homepage-settings','tsf-inpost-box'];jQuery(document).on('postbox-toggled',function(x,b){if(0<=u.indexOf(b.id)){let T=b.querySelector('.inside');0<T.offsetHeight&&0<T.offsetWidth&&g()}})}}},_initSocialTitleInputs:function(){if(tsf.hasInput){let t=jQuery('#autodescription_og_title'),s=jQuery('#autodescription_twitter_title'),a=jQuery('#tsf-title-reference');if(t.length&&s.length&&a.length){let o=!1,n=!!navigator.userAgent.match(/Trident\/7\./),r=tsf.escapeString(t.val()),l=tsf.escapeString(s.val()),d=a.text();const c=x=>{let b='';switch(x){case'twitter':b=l;case'og':b=b.length?b:r;case'reference':b=b.length?b:d;}return b},g=()=>{n&&(o=!0),t.attr('placeholder',c('reference')),s.attr('placeholder',c('og')),n&&setTimeout(function(){o=!1},0)},f=(x,b,T)=>{x&&b&&T?tsf.updateSocialCounter(x,b,T):(t.each((C,S)=>f(S,c('og'),88)),s.each((C,S)=>f(S,c('twitter'),70)))};a.on('change',()=>{d=a.text(),g(),f()});t.on('input.tsfUpdateOgTitle',x=>{o||(r=x.target.value.length?tsf.escapeString(x.target.value):'',g(),f())}),s.on('input.tsfUpdateOgTitle',x=>{o||(l=x.target.value.length?tsf.escapeString(x.target.value):'',g(),f())})}}},_initSocialDescInputs:function(){if(tsf.hasInput){let t=jQuery('#autodescription_og_description'),s=jQuery('#autodescription_twitter_description'),a=jQuery('#tsf-description-reference');if(t.length&&s.length&&a.length){let o=!1,n=!!navigator.userAgent.match(/Trident\/7\./),r=tsf.escapeString(t.val()),l=tsf.escapeString(s.val()),d=a.text();const c=x=>{let b='';switch(x){case'twitter':b=l;case'og':b=b.length?b:r;case'reference':b=b.length?b:d;}return b},g=()=>{n&&(o=!0),t.attr('placeholder',c('reference')),s.attr('placeholder',c('og')),n&&setTimeout(function(){o=!1},0)},f=(x,b,T)=>{x&&b&&T?tsf.updateSocialCounter(x,b,T):(t.each((C,S)=>f(S,c('og'),300)),s.each((C,S)=>f(S,c('twitter'),200)))};a.on('change',()=>{d=a.text(),g(),f()});t.on('input.tsfUpdateOgDesc',x=>{o||(r=x.target.value.length?tsf.escapeString(x.target.value):'',g(),f())}),s.on('input.tsfUpdateOgDesc',x=>{o||(l=x.target.value.length?tsf.escapeString(x.target.value):'',g(),f())})}}},updateSocialCounter:function(t,s,a){let o=document.getElementById(t.id+'_chars');if(o){let n=tsf.getStringLength(tsf.unescapeString(s)),r='',l=tsf.counterType,d='',c='';n>a?(r+='tsf-count-bad',d=tsf.i18n.bad):(r+='tsf-count-good',d=tsf.i18n.good),l&&1!=l?2==l?c=d:3==l&&(c=n.toString()+' - '+d):c=n.toString(),o.innerHTML=c,tsf.additionsClass&&(r+=' '+tsf.additionsClass),o.className!==r&&(o.className=r)}},_initCounters:function(){if(tsf.hasInput){jQuery('.tsf-counter').on('click',function(){++tsf.counterType,3<tsf.counterType&&(tsf.counterType=0),s();let r='.tsf-counter-wrap .tsf-ajax',l=0;tsf.resetAjaxLoader(r),tsf.setAjaxLoader(r);let d={method:'POST',url:ajaxurl,datatype:'json',data:{action:'the_seo_framework_update_counter',nonce:tsf.nonces.edit_posts,val:tsf.counterType},async:!0,success:function(c){switch(c=jQuery.parseJSON(c),'success'===c.type&&(l=1),l){case 0:tsf.unsetAjaxLoader(r,!1);break;case 1:tsf.unsetAjaxLoader(r,!0);break;default:tsf.resetAjaxLoader(r);}}};jQuery.ajax(d)});const s=function(){let n=tsf.counterType;1==n?(tsf.additionsClass='tsf-counter-one',tsf.counterType=1):2==n?(tsf.additionsClass='tsf-counter-two',tsf.counterType=2):3==n?(tsf.additionsClass='tsf-counter-three',tsf.counterType=3):(tsf.additionsClass='tsf-counter-zero',tsf.counterType=0),tsf._triggerCounterUpdate()};s();jQuery('#autodescription-site-settings\\[display_character_counter\\]').on('click',function(n){jQuery(n.target).is(':checked')?jQuery('.tsf-counter-wrap').show():jQuery('.tsf-counter-wrap').hide()});jQuery('#autodescription-site-settings\\[display_pixel_counter\\]').on('click',function(n){jQuery(n.target).is(':checked')?(jQuery('.tsf-pixel-counter-wrap').show(),tsf._triggerCounterUpdate()):jQuery('.tsf-pixel-counter-wrap').hide()})}},_initPrimaryTerm:function(){if(tsf.hasInput&&Object.keys(tsf.states.taxonomies).length){let t=tsf.states.taxonomies,s=wp.template('tsf-primary-term-selector'),a=wp.template('tsf-primary-term-selector-help'),o=document.createElement('span');o.classList.add('tsf-primary-term-selector'),o.classList.add('tsf-set-primary-term'),function(){let q=document.createElement('input');q.setAttribute('type','radio'),o.appendChild(q)}();let n={},r={},l={},d={},c={};const g=function(q){let M=jQuery('#'+q+'div'),N=s({taxonomy:t[q]});M.append(N)},f=function(q){let M=jQuery('#taxonomy-'+q),N=a({taxonomy:t[q]});M.append(N),u(q)},u=function(q){let M=document.getElementById('taxonomy-'+q),N=M.querySelectorAll('.tabs-panel'),F=jQuery(M).closest('.postbox');if(!(F.length&&F.hasClass('closed'))){let X=Array.prototype.slice.call(N).filter(function(G){return 0<G.offsetWidth||0<G.offsetHeight||0<G.getClientRects().length})[0];if(X){let V=X.scrollHeight>X.clientHeight?X.offsetWidth-X.clientWidth+25-2:25;tsf.states.isRTL?M.querySelector('.tsf-primary-term-selector-help-wrap').style.left=V+'px':M.querySelector('.tsf-primary-term-selector-help-wrap').style.right=V+'px'}}},y=function(q){u(q.data.taxonomy)},x=function(q){let M=o.cloneNode(!0);return M.setAttribute('title',t[q].i18n.makePrimary),M.setAttribute('aria-label',t[q].i18n.makePrimary),M},b=function(q,M){let N=document.getElementById('autodescription[_primary_term_'+q+']');N&&N instanceof Element&&(N.value=M)},T=function(q,M){return!M&&d[q]?d[q]:(d[q]=jQuery('#'+q+'checklist, #'+q+'checklist-pop'),d[q])},C=function(q,M){return n[q].filter('[value="'+M+'"]')},S=function(q,M){let N=C(q,M).closest('label');N.length?(N.addClass('tsf-is-primary-term'),N.find('.tsf-set-primary-term').each(function(F,X){X.setAttribute('title',t[q].i18n.primary),X.setAttribute('aria-label',t[q].i18n.primary),X.querySelector('input').checked=!0}),b(q,M),c[q]=M):L(q)},I=function(q){let M=T(q).find('label');M.removeClass('tsf-is-primary-term'),M.find('.tsf-set-primary-term').each(function(N,F){F.setAttribute('title',t[q].i18n.makePrimary),F.setAttribute('aria-label',t[q].i18n.makePrimary),F.querySelector('input').checked=!1}),b(q,'')},L=function(q){let N,M=l[q].first();M.length&&(N=M.val()||'',S(q,N),c[q]=N)},E=function(q){let M=q.data.taxonomy,N=jQuery(q.target).closest('label').find('input[type=checkbox]').val();return I(M),S(M,N),!1},W=function(q){let M=q.data.taxonomy;switch(q.target.checked?(R(M,q.target),j(M,q.target)):(P(M,q.target),H(M,q.target)),l[M].length){case 0:b(M,'');break;case 1:L(M);}},j=function(q,M){let N;C(q,M.value).each(function(F,X){N=jQuery(X).closest('label'),N.find('.tsf-primary-term-selector').length||N.append(x(q))})},H=function(q,M){let N,F;C(q,M.value).each(function(X,V){N=jQuery(V).closest('label'),F=N.hasClass('tsf-is-primary-term'),N.removeClass('tsf-is-primary-term'),N.find('.tsf-primary-term-selector').remove(),F&&L(q)})},R=function(q,M){r[q]=r[q].add('[value="'+M.value+'"]'),l[q]=l[q].add(M)},P=function(q,M){r[q]=r[q].not('[value="'+M.value+'"]'),l[q]=l[q].not('[value="'+M.value+'"]')},D=function(q){u(q.data.taxonomy)},A=function(q){let M=T(q,1);n[q]=M.find('input[type=checkbox]'),r[q]=M.find('input[type=checkbox]:checked');let F,N={};l[q]=r[q],l[q].each(function(X,V){F=jQuery(V).val(),N[F]?l[q].splice(X,1):N[F]=!0})},B=function(q,M,N){N.hasOwnProperty('settings')&&N.settings.hasOwnProperty('what')&&(A(N.settings.what),O(N.settings.what),U(N.settings.what),u(N.settings.what))},O=function(q){let M='tsfShowPrimary'+q,N={taxonomy:q},F=T(q),X=jQuery('#'+q+'div'),V=jQuery('#'+q+'-tabs'),G=F.closest('.postbox');F.off('click.'+M),F.on('click.'+M,'input[type="checkbox"]',N,W),F.on('click.'+M,'.tsf-primary-term-selector',N,E),X.off('wpListAddEnd.'+M),X.on('wpListAddEnd.'+M,'#'+q+'checklist',B),V.off('click.'+M),V.on('click.'+M,'a',N,y),G.off('click.postboxes.'+M),G.on('click.postboxes.'+M,N,D)},U=function(q){T(q).find('input[type="checkbox"]:checked').each(function(M,N){j(q,N)}),t[q].primary?S(q,t[q].primary):L(q)};(function(){for(let q in t)T(q).length&&(g(q),f(q),A(q),O(q),U(q))})()}},_initToolTips:function(){let t=0,s=!1;const a=function(){s=!0,clearTimeout(t),t=setTimeout(function(){s=!1},250)},o=function(y,x){x=x||!1;let b='pointerdown.tsfTT touchstart.tsfTT click.tsfTT',T=jQuery(y);x?(T.off('mousemove mouseleave mouseout tsf-tooltip-update'),jQuery(document.body).off(b)):(T.on({mousemove:d,mouseleave:c,mouseout:c}),jQuery(document.body).off(b).on(b,g)),T.on('tsf-tooltip-update',r)},n=function(y){o(y,!0)},r=function(y){if(y.target.classList.contains('tsf-tooltip-item')){let x=y.target.querySelector('.tsf-tooltip-text');x instanceof Element&&(x.innerHTML=y.target.dataset.desc)}},l=function(y){let x=jQuery(y.target),b=y.target.dataset.desc;if(b&&0===x.find('div').length){y.target.title='';let T=jQuery('<div class="tsf-tooltip"><span class="tsf-tooltip-text-wrap"><span class="tsf-tooltip-text">'+b+'</span></span><div class="tsf-tooltip-arrow"></div></div>');x.append(T);let C=x.closest('.tsf-tooltip-boundary');C=C.length&&C||jQuery(document.body);let S=x.outerHeight()+9,I=T.offset().top-S,L=C.offset().top-(C.prop('scrolltop')||0);L>I?(T.addClass('tsf-tooltip-down'),T.css('top',S+'px')):T.css('bottom',S+'px');let E=x.closest('.tsf-tooltip-wrap'),W=T.find('.tsf-tooltip-text-wrap'),j=W.find('.tsf-tooltip-text'),H=E.width(),R=W.outerWidth(!0),P=j.outerWidth(!0),D=W.offset().left,A=D+P,B=C.offset().left-(C.prop('scrollLeft')||0),O=B+C.outerWidth(),U='left';if(D<B){let z=B-D+12,q=parseInt(W.css('flex-basis'),10);z<-q&&(z=-q),T.css(U,z+'px'),T.data('overflow',z),T.data('overflowDir',U)}else if(A>O){let z=O-A-H-12,q=parseInt(W.css('flex-basis'),10);z<-q&&(z=-q),T.css(U,z+'px'),T.data('overflow',z),T.data('overflowDir',U)}else if(42>H){let z=-15;T.css(U,z+'px'),T.data('overflow',z),T.data('overflowDir',U)}else if(H>R){let z=y.originalEvent&&y.originalEvent.pageX||y.pageX,q=E.offset().left,N=z-q-R/2,F=N+R;0>N?N=0:F>H&&(N=H-P),T.css(U,N+'px'),T.data('adjust',N),T.data('adjustDir',U)}}},d=function(y){let x=jQuery(y.target),b=x.find('.tsf-tooltip'),T=b.find('.tsf-tooltip-arrow'),C=b.data('overflow'),S=b.data('overflowDir');if(C=parseInt(C,10),C=isNaN(C)?0:-Math.round(C),C)T.css(S,C+'px');else{let I=y.originalEvent&&y.originalEvent.pageX||y.pageX,L=7,E=16,W=x.closest('.tsf-tooltip-wrap'),j=I-W.offset().left-E/2,R=b.find('.tsf-tooltip-text-wrap'),P=R.outerWidth(!0),D=b.data('adjust'),A=b.data('adjustDir'),B=P-E-L;if(D=parseInt(D,10),D=isNaN(D)?0:Math.round(D),D&&(D='left'===A?-D:D,j+=D,B-D>W.outerWidth(!0))){let O=R.find('.tsf-tooltip-text'),U=O.outerWidth(!0);B=U-E-L}j<=L?T.css('left',L+'px'):j>=B?T.css('left',B+'px'):T.css('left',j+'px')}},c=function(y){s||(jQuery(y.target).find('.tsf-tooltip').remove(),n(y.target))},g=function(y){a();let C,b='.tsf-tooltip',T=jQuery(y.target);if(T.hasClass('tsf-tooltip-item')&&(C=T.find(b)),!C){let S=T.children('.tsf-tooltip-item');S.length&&(C=S.find(b))}C&&C.length?jQuery(b).not(C).remove():jQuery(b).remove()},f=function(y){if(!s){let x=!1;switch(y.type){case'mouseenter':break;case'pointerdown':case'touchstart':x=!0;break;default:}if(y.target.classList.contains('tsf-tooltip-item'))x&&g(y),l(y),d(y),o(y.target);else{let b=y.target.querySelector('.tsf-tooltip-item:hover'),T=new jQuery.Event(y.type);T.pageX=y.originalEvent&&y.originalEvent.pageX||y.pageX,b?(tsfL10n.states.debug&&console.log('Tooltip event warning: delegation'),jQuery(b).trigger(T)):(tsfL10n.states.debug&&console.log('Tooltip event warning: bubbling'),jQuery(y.target).closest('.tsf-tooltip-wrap').find('.tsf-tooltip-item:hover').trigger(T))}y.stopPropagation()}},u=function(){let y=jQuery('.tsf-tooltip-wrap');y.off('mouseenter pointerdown touchstart'),y.on('mouseenter pointerdown touchstart','.tsf-tooltip-item',f)};u(),jQuery(window).on('tsf-reset-tooltips',u),function(){let y=jQuery('#wpcontent');tsf.addTooltipBoundary(y)}()},addTooltipBoundary:function(t){jQuery(t).addClass('tsf-tooltip-boundary')},tabToggle:function(t){let s=jQuery(t.target);if(s.is(':checked')){let a=s.prop('id'),o=s.prop('name');if('undefined'!=typeof o){let n='tsf-active-tab-content',r=jQuery('#'+a+'-content'),l=jQuery('.'+n);if(!r.is(l)&&'undefined'!=typeof r){let d=jQuery('.'+o+'-content');d.fadeOut(150,function(){jQuery(this).removeClass(n)}),setTimeout(function(){r.addClass(n).fadeIn(250)},150),setTimeout(function(){jQuery('#'+a).trigger('tsf-tab-toggled')},175)}}}},flexTabToggle:function(t){let s=jQuery(t.target);if(s.is(':checked')){let a=s.prop('id'),o=s.prop('name');if('undefined'!=typeof o){let n='tsf-flex-tab-content-active',r=jQuery('#'+a+'-content'),l=jQuery('.'+n);if(!r.is(l)&&'undefined'!=typeof r){let d=jQuery('.'+o+'-content');d.fadeOut(150,function(){jQuery(this).removeClass(n)}),setTimeout(function(){r.addClass(n).fadeIn(250)},150),setTimeout(function(){jQuery('#'+a).trigger('tsf-flex-tab-toggled')},175)}}}},setTabsOnload:function(){if(tsf.hasInput)if(tsf.states.isPostEdit&&jQuery('.tsf-flex-nav-tab-radio').trigger('change'),tsf.states.isSettingsPage){let t=jQuery('.tsf-nav-tab-wrapper .tsf-tab:nth-of-type(n+2) input:checked');t.length&&t.each(function(){let a=jQuery(this),o=a.prop('id'),n=a.prop('name');if('undefined'!=typeof n){let r='tsf-active-tab-content',l=jQuery('#'+o+'-content');if('undefined'!=typeof l){let d=jQuery('.'+n+'-content');d.removeClass(r),l.addClass(r),setTimeout(function(){jQuery('#'+o).trigger('tsf-tab-toggled')},20)}}})}else;},taglineToggleDesc:function(t){let s=jQuery(t.target),a=jQuery('#tsf-on-blogname-js');s.is(':checked')?a.css('display','inline'):a.css('display','none')},additionsToggleDesc:function(t){let s=jQuery(t.target),a=jQuery('#tsf-description-additions-js');s.is(':checked')?a.css('display','inline'):a.css('display','none')},taglineToggleOnload:function(){if(tsf.hasInput){let t=jQuery('#tsf-title-tagline-toggle :input'),s=jQuery('.tsf-custom-blogname-js'),a=jQuery('#tsf-description-additions-toggle :input'),o=jQuery('#tsf-description-additions-js'),n=jQuery('#tsf-description-onblogname-toggle :input'),r=jQuery('#tsf-on-blogname-js'),l=jQuery('#tsf-title-additions-toggle :input'),d=jQuery('.tsf-title-additions-js');t.is(':checked')?s.css('display','inline'):s.css('display','none'),a.is(':checked')?o.css('display','inline'):o.css('display','none'),n.is(':checked')?r.css('display','inline'):r.css('display','none'),l.is(':checked')?d.css('display','none'):d.css('display','inline')}},attachUnsavedChangesListener:function(){if(tsf.hasInput){let t=function(o){tsf.settingsChanged||tsf.registerChange(),jQuery(s).not(a).off(o.type,t)},s='.tsf-metaboxes :input, #tsf-inpost-box .inside :input',a='.tsf-tab :input, .tsf-flex-nav-tab :input';jQuery(s).not(a).on('change',t),s='.tsf-metaboxes input[type=text], .tsf-metaboxes textarea, #tsf-inpost-box .inside input[type=text], #tsf-inpost-box .inside textarea',a='.tsf-nav-tab-wrapper input, .tsf-flex-nav-tab-wrapper input',jQuery(s).not(a).on('input',t),window.onbeforeunload=function(){if(tsf.settingsChanged)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})}},registerChange:function(){tsf.settingsChanged=!0},confirmedReset:function(){return confirm(tsf.i18n.confirmReset)},onLoadUnregisterChange:function(){tsf.settingsChanged=!1},dismissNotice:function(t){jQuery(t.target).parents('.tsf-notice').slideUp(200,function(){this.remove()})},setAjaxLoader:function(t){jQuery(t).toggleClass('tsf-loading')},unsetAjaxLoader:function(t,s){let a='tsf-success',o=2500;s||(a='tsf-error',o=5e3),jQuery(t).removeClass('tsf-loading').addClass(a).fadeOut(o)},resetAjaxLoader:function(t){jQuery(t).stop().empty().prop('class','tsf-ajax').css('opacity','1').removeProp('style')},openImageEditor:function(t){if(jQuery(t.target).prop('disabled')||'undefined'==typeof wp.media)return t.preventDefault(),void t.stopPropagation();let o,s=jQuery(t.target),a=s.data('inputid');if(o)return void o.open();t.preventDefault(),t.stopPropagation(),tsf.extendCropper();let n={suggestedWidth:s.data('width')||1200,suggestedHeight:s.data('height')||630,isFlex:'undefined'==typeof s.data('flex')?1:s.data('flex')};tsf.cropper.control={params:{flex_width:n.isFlex?4096:0,flex_height:n.isFlex?4096:0,width:n.suggestedWidth,height:n.suggestedHeight,isFlex:n.isFlex}},o=wp.media({button:{text:tsf.other[a].frame_button,close:!1},states:[new wp.media.controller.Library({title:tsf.other[a].frame_title,library:wp.media.query({type:'image'}),multiple:!1,date:!1,priority:20,suggestedWidth:n.suggestedWidth,suggestedHeight:n.suggestedHeight}),new tsf.cropper({imgSelectOptions:tsf.calculateImageSelectOptions})]});const r=function(){o.setState('cropper')};o.off('select',r),o.on('select',r);const l=function(g){let f=g.url,u=g.id,y=g.width,x=g.height;jQuery('#'+a+'-url').val(f),jQuery('#'+a+'-id').val(u)};o.off('cropped',l),o.on('cropped',l);const d=function(g){let f=g.get('url'),u=g.get('id'),y=g.get('width'),x=g.get('height');jQuery('#'+a+'-url').val(f),jQuery('#'+a+'-id').val(u)};o.off('skippedcrop',d),o.on('skippedcrop',d);const c=function(){jQuery('#'+a+'-select').text(tsf.other[a].change),jQuery('#'+a+'-url').prop('readonly',!0).css('opacity',0).animate({opacity:1},{queue:!0,duration:1000},'swing'),tsf.appendRemoveButton(s,a,!0),tsf.registerChange()};o.off('skippedcrop cropped',c),o.on('skippedcrop cropped',c),o.open()},appendRemoveButton:function(t,s,a){t&&s&&!jQuery('#'+s+'-remove').length&&(t.after('<a href="javascript:void(0)" id="'+s+'-remove" class="tsf-remove-social-image button button-small" data-inputid="'+s+'" title="'+tsf.other[s].remove_title+'">'+tsf.other[s].remove+'</a>'),a&&jQuery('#'+s+'-remove').css('opacity',0).animate({opacity:1},{queue:!0,duration:1000},'swing')),tsf.resetImageEditorActions()},removeEditorImage:function(t){let s=jQuery(t.target).data('inputid');if(!jQuery('#'+s+'-select').prop('disabled')){jQuery('#'+s+'-select').addClass('disabled').prop('disabled',!0),jQuery('#'+s+'-remove').addClass('disabled').prop('disabled',!0).fadeOut(500,function(){jQuery(this).remove(),jQuery('#'+s+'-select').text(tsf.other[s].select).removeClass('disabled').removeProp('disabled')});let a=jQuery('#'+s+'-url');a.val(''),a.data('readonly')||a.removeProp('readonly'),a.css('opacity',0).animate({opacity:1},{queue:!0,duration:500},'swing'),jQuery('#'+s+'-id').val(''),tsf.registerChange()}},extendCropper:function(){if('undefined'==typeof tsf.cropper.control){let t,a,s=wp.media.controller,o=wp.media.view;return a=o.Cropper.extend({className:'crop-content tsf-image',ready:function(){o.Cropper.prototype.ready.apply(this,arguments)},onImageLoad:function(){let r,n=this.controller.get('imgSelectOptions');'function'==typeof n&&(n=n(this.options.attachment,this.controller)),'undefined'==typeof n.aspectRatio&&(n=_.extend(n,{parent:this.$el,onInit:function(){this.parent.children().on('mousedown touchstart',function(l){l.shiftKey?r.setOptions({aspectRatio:'1:1'}):r.setOptions({aspectRatio:!1})})}})),this.trigger('image-loaded'),r=this.controller.imgSelect=this.$image.imgAreaSelect(n)}}),t=s.Cropper.extend({createCropContent:function(){this.cropperView=new a({controller:this,attachment:this.get('selection').first()}),this.cropperView.on('image-loaded',this.createCropToolbar,this),this.frame.content.set(this.cropperView)},doCrop:function(n){let r=n.get('cropDetails'),l=tsf.cropper.control;if(l.params.flex_width&&l.params.flex_height)if(r.width===r.height)r.width>l.params.flex_width&&(r.dst_width=r.dst_height=l.params.flex_width);else if(r.width>l.params.flex_width||r.height>l.params.flex_height)if(r.width>r.height){let d=r.width/l.params.flex_width;r.dst_width=l.params.flex_width,r.dst_height=Math.round(r.height/d)}else{let d=r.height/l.params.flex_height;r.dst_height=l.params.flex_height,r.dst_width=Math.round(r.width/d)}return'undefined'==typeof r.dst_width&&(r.dst_width=0,r.dst_height=0),wp.ajax.post('tsf-crop-image',{nonce:tsf.nonces.upload_files,id:n.get('id'),context:'tsf-image',cropDetails:r})}}),t.prototype.control={},void(tsf.cropper=t)}},calculateImageSelectOptions:function(t,s){let y,x,b,T,a=tsf.cropper.control,o=!!parseInt(a.params.flex_width,10),n=!!parseInt(a.params.flex_height,10),r=parseInt(a.params.width,10),l=parseInt(a.params.height,10),d=t.get('width'),c=t.get('height'),g=r/l,f=r,u=l;return T=a.params.isFlex?!tsf.mustBeCropped(a.params.flex_width,a.params.flex_height,d,c):g==d/c,s.set('control',a.params),s.set('canSkipCrop',T),d/c>g?(l=c,r=l*g):(r=d,l=r/g),y=(d-r)/2,x=(c-l)/2,b={handles:!0,keys:!0,instance:!0,persistent:!0,imageWidth:d,imageHeight:c,minWidth:f>r?r:f,minHeight:u>l?l:u,x1:y,y1:x,x2:r+y,y2:l+x},a.params.isFlex?n||o?(n&&(b.minHeight=200,b.maxWidth=d),o&&(b.minWidth=200,b.maxHeight=c)):b.aspectRatio=r+':'+l:(b.handles='corners',b.aspectRatio=r+':'+l),b},mustBeCropped:function(t,s,a,o){return a<=t&&o<=s?!1:!0},resetImageEditorActions:function(){jQuery('.tsf-remove-social-image').off('click',tsf.removeEditorImage),jQuery('.tsf-remove-social-image').on('click',tsf.removeEditorImage)},setupImageEditorActions:function(){jQuery('.tsf-set-social-image').off('click',tsf.openImageEditor),jQuery('.tsf-remove-social-image').off('click',tsf.removeEditorImage),jQuery('.tsf-set-social-image').on('click',tsf.openImageEditor),jQuery('.tsf-remove-social-image').on('click',tsf.removeEditorImage)},checkImageEditorInput:function(){let t=jQuery('.tsf-set-social-image');if(t.length){let s='',a='';jQuery.each(t,function(o,n){s=jQuery(n).data('inputid'),a=jQuery('#'+s+'-id'),a.length&&0<a.val()&&(jQuery('#'+s+'-url').prop('readonly',!0),tsf.appendRemoveButton(jQuery(n),s,!1)),jQuery('#'+s+'-url').val()&&jQuery('#'+s+'-select').text(tsf.other[s].change)})}},setColorOnload:function(){let t=jQuery('.tsf-color-picker');t.length&&jQuery.each(t,function(s,a){let o=jQuery(a),n='',r=o.data('tsf-default-color');o.wpColorPicker({defaultColor:r,width:238,change:function(){n=o.wpColorPicker('color'),''==n&&(n=r),o.val(n),tsf.registerChange()},clear:function(){o.parent().siblings('.wp-color-result').css('backgroundColor',r),tsf.registerChange()},palettes:!1})})},_doFlexResizeListener:function(){if(jQuery('.tsf-flex').length){tsf._setResizeListeners();let t=0,s={},a=0,o=jQuery('.tsf-flex-nav-tab-wrapper'),n=jQuery(window);n.on('tsf-flex-resize',function(){clearTimeout(t);let r=0;t=setTimeout(function(){if(o.length){let l=jQuery('.tsf-flex-nav-tab-inner'),d=o.width(),c=l.width(),g=jQuery('.tsf-flex-nav-name');s.tabWrapper||(s.tabWrapper={},s.tabWrapper.outer=0,s.tabWrapper.inner=0,s.tabWrapper.shown=1),!s.tabWrapper.shown&&s.tabWrapper.outer<d&&(g.fadeIn(250),setTimeout(function(){c=l.width()},r)),setTimeout(function(){c>d?(g.hide(),s.tabWrapper.shown=0):s.tabWrapper.outer<d&&(g.fadeIn(250),s.tabWrapper.shown=1)},2*r),setTimeout(function(){s.tabWrapper.outer=d,s.tabWrapper.inner=c},3*r)}},a),r=10,a=75}),n.trigger('tsf-flex-resize')}},_setResizeListeners:function(){jQuery(window).on('resize orientationchange',tsf._triggerResize),jQuery('#collapse-menu').click(tsf._triggerResize),jQuery('.columns-prefs :input[type=radio]').change(tsf._triggerResize),jQuery('.meta-box-sortables').on('sortupdate',tsf._triggerResize)},_triggerTooltipReset:function(){jQuery(window).trigger('tsf-reset-tooltips')},_triggerTooltipUpdate:function(t){jQuery(t).trigger('tsf-tooltip-update')},_triggerResize:function(){jQuery(window).trigger('tsf-flex-resize')},_triggerCounterUpdate:function(){jQuery(window).trigger('tsf-counter-updated')},_triggerReady:function(){jQuery(document.body).trigger('tsf-ready')},_doReady:function(){tsf._initCounters(),tsf._initTitleInputs(),tsf._initUnboundTitleSettings(),tsf._initSocialTitleInputs(),tsf._initDescInputs(),tsf._initSocialDescInputs(),tsf._initPrimaryTerm(),tsf.setTabsOnload(),tsf.taglineToggleOnload(),tsf._initToolTips(),tsf.setupImageEditorActions(),tsf.checkImageEditorInput(),tsf.setColorOnload(),tsf.attachUnsavedChangesListener(),tsf.onLoadUnregisterChange(),tsf._doFlexResizeListener(),tsf._triggerReady()},setupVars:function(){tsf.counterType=parseInt(tsf.states.counterType),tsf.hasInput=tsf.states.hasInput},ready:function(t){tsf.setupVars(),t('div.updated, div.error, div.notice-warning').insertAfter('div.tsf-top-wrap'),t(document.body).ready(tsf._doReady),t('.tsf-js-confirm-reset').on('click',tsf.confirmedReset),t('.tsf-tabs-radio').on('change',tsf.tabToggle),t('.tsf-flex-nav-tab-radio').on('change',tsf.flexTabToggle),t('#tsf-description-onblogname-toggle :input').on('click',tsf.taglineToggleDesc),t('#tsf-description-additions-toggle :input').on('click',tsf.additionsToggleDesc),t('.tsf-dismiss').on('click',tsf.dismissNotice)}},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 - 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
8
 
9
  /**
10
  * The SEO Framework plugin
11
+ * Copyright (C) 2015 - 2018 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
readme.txt CHANGED
@@ -3,9 +3,9 @@ Contributors: Cybr
3
  Donate link: https://theseoframework.com/donate/
4
  Tags: SEO, XML Sitemap, Google, Open Graph, Schema.org, Twitter
5
  Requires at least: 4.4.0
6
- Tested up to: 4.9.1
7
  Requires PHP: 5.3.0
8
- Stable tag: 3.0.3
9
  License: GPLv3
10
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
11
 
@@ -53,7 +53,7 @@ Nobody has to know about the tools you've used to create your or someone else's
53
 
54
  * Titles according to your settings with archive prefixes.
55
  * Descriptions with anti-spam techniques and detection that informs you when it can be improved.
56
- * A canonical URL to prevent duplicated content; with full Domain Mapping, subdomain, and HTTPS support.
57
  * Various Open Graph, Facebook and Twitter tags.
58
  * Special Open Graph descriptions, which organically integrates within the Facebook and Twitter snippets.
59
  * Open Graph images, they are automatically resized and optimized when needed.
@@ -61,10 +61,10 @@ Nobody has to know about the tools you've used to create your or someone else's
61
  * Structured Data for Google's Knowledge Graph; like Personal/Business site relations, names, and logos.
62
  * Structured Data for Breadcrumbs that extend pages and categories relationship support in Google Search.
63
  * Structured Data for Google Search that lets it know your preferred site name.
64
- * Publishing and editing dates for Social Sites and Search Engines alike.
65
  * Paginated content relationship links, to help visitors going to the right page.
66
- * A sitemap with all your pages, posts and CPT, which listens to their set settings.
67
- * Feed excerpts and backlinks within, to prevent automated content theft.
68
 
69
  **This plugin goes further, behind the screens it:**
70
 
@@ -79,11 +79,11 @@ Nobody has to know about the tools you've used to create your or someone else's
79
 
80
  * Automated title output options; they encourage you to follow the guidelines.
81
  * Automated description output options.
82
- * Schema.org Structured Data output options.
83
  * Various robots meta output options.
84
  * Many home page specific options.
85
  * Facebook, Twitter, and Pinterest social integration options.
86
- * Google, Bing, Pinterest and Yandex Webmaster verification codes.
87
  * Sitemap integration with personalization.
88
  * Robots.txt sitemap integration.
89
  * Feed anti-scraper options.
@@ -100,7 +100,7 @@ Take a look at the API documentation located at [The SEO Framework API Docs](htt
100
  * If the description is too long, too short, duplicated, has too many repeated words and/or automatically generated.
101
  * If the page is indexed, redirected, followed and/or archived, while looking at other WordPress settings.
102
 
103
- **We call this The SEO Bar. Check out the [Screenshots](https://wordpress.org/plugins/autodescription/#screenshots) to see how it helps you!**
104
 
105
  = Hardcore caching =
106
  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.
@@ -117,7 +117,7 @@ A caching plugin isn't even needed for this plugin as you won't notice a differe
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.
@@ -125,7 +125,7 @@ A caching plugin isn't even needed for this plugin as you won't notice a differe
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. It also listens to the "noindex" settings on each of the items and works great with various translation plugins.
129
 
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. 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.
131
 
@@ -152,6 +152,7 @@ The Breadcrumb script generated by this plugin on Posts will also make sure Goog
152
  * Do fill in the Home Page "General" settings.
153
  * Do fill in the Social Meta "General", "Facebook" and "Twitter" settings.
154
  * Notice that red checkboxes are recommended to be left unchecked. And green checkboxes are recommended to be checked.
 
155
 
156
  = This plugin auto-configures SEO meta settings, and: =
157
 
@@ -164,7 +165,7 @@ The Breadcrumb script generated by this plugin on Posts will also make sure Goog
164
  == Screenshots ==
165
 
166
  1. This plugin shows you what you can improve, at a glance. With complete color vision deficiency support.
167
- 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.
168
  3. The dynamic Post/Page SEO settings meta box. Another version of this box is also implemented for Categories and Tags.
169
  4. The dynamic Post/Page SEO settings meta box also fits neatly in the sidebar. For when you want to work faster.
170
  5. The SEO Settings Page. With over 100 settings, you are in full control.
@@ -174,28 +175,20 @@ The Breadcrumb script generated by this plugin on Posts will also make sure Goog
174
  = Is The SEO Framework Free? =
175
 
176
  Absolutely! It will stay free as well, without ads or nags!
 
177
 
178
- = Is there a Premium version? =
179
-
180
- Nope! This plugin is all-inclusive.
181
-
182
- = Free & Premium Extensions =
183
 
184
  For more advanced SEO options and output, we offer the free plugin [Extension Manager](https://wordpress.org/plugins/the-seo-framework-extension-manager/).
185
 
186
  = I have a feature request, I've found a bug, a plugin is incompatible... =
187
 
188
- Please visit [the support forums](https://wordpress.org/support/plugin/autodescription) and kindly tell me about it. I try to get back to you within 48 hours. :)
189
-
190
- = Is this really a Framework? =
191
-
192
- 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.
193
- 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.
194
- 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.
195
 
196
  = I am a developer; how can I help? =
197
 
198
- The SEO Framework is currently a one-man project. However, any input is greatly appreciated and everything will be considered.
199
  Please visit the [GitHub project page](https://github.com/sybrew/the-seo-framework) to submit issues or even pull requests.
200
 
201
  = I want to modify how this plugin works =
@@ -204,26 +197,80 @@ The SEO Framework is very pluggable in many fields. Please refer to the [API doc
204
 
205
  = The sitemap doesn't contain categories, images, news, etc. is this OK? =
206
 
207
- This is not an issue. Search Engines love crawling WordPress because its structure is consistent and well known.
208
- 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.
 
 
 
 
 
 
 
 
 
 
 
 
209
 
210
  = What's do the application/ld+json scripts do? =
211
 
212
- The JSON-LD scripts are Search Engine helpers which tell Search Engines how to connect and index the site.
213
- 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.
214
- This is also referred to as Structured Data.
215
 
216
  = The metadata is not being updated, and I'm using a caching plugin. =
217
 
218
- 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.
 
 
219
 
220
  = I want to transport SEO data from other plugins to The SEO Framework, how do I do this? =
221
 
222
  Please refer to this small guide: [SEO Data Migration](http://theseoframework.com/docs/seo-data-migration/).
223
- Transporting Terms and Taxonomies SEO data isn't supported.
224
 
225
  == Changelog ==
226
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
227
  = 3.0.3 - Diligence =
228
 
229
  **Release date:**
3
  Donate link: https://theseoframework.com/donate/
4
  Tags: SEO, XML Sitemap, Google, Open Graph, Schema.org, Twitter
5
  Requires at least: 4.4.0
6
+ Tested up to: 4.9.4
7
  Requires PHP: 5.3.0
8
+ Stable tag: 3.0.4
9
  License: GPLv3
10
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
11
 
53
 
54
  * Titles according to your settings with archive prefixes.
55
  * Descriptions with anti-spam techniques and detection that informs you when it can be improved.
56
+ * A canonical URL to prevent duplicated content; with full "domain mapping", subdomain, and HTTPS support.
57
  * Various Open Graph, Facebook and Twitter tags.
58
  * Special Open Graph descriptions, which organically integrates within the Facebook and Twitter snippets.
59
  * Open Graph images, they are automatically resized and optimized when needed.
61
  * Structured Data for Google's Knowledge Graph; like Personal/Business site relations, names, and logos.
62
  * Structured Data for Breadcrumbs that extend pages and categories relationship support in Google Search.
63
  * Structured Data for Google Search that lets it know your preferred site name.
64
+ * Publishing and editing dates for social sites and search engines alike.
65
  * Paginated content relationship links, to help visitors going to the right page.
66
+ * A sitemap with all your pages, posts and CPT, which listens to their page settings.
67
+ * Feed excerpts and backlinks within, to reduce automated content theft.
68
 
69
  **This plugin goes further, behind the screens it:**
70
 
79
 
80
  * Automated title output options; they encourage you to follow the guidelines.
81
  * Automated description output options.
82
+ * Schema.org structured data output options.
83
  * Various robots meta output options.
84
  * Many home page specific options.
85
  * Facebook, Twitter, and Pinterest social integration options.
86
+ * Google, Bing, Pinterest and Yandex webmaster verification codes.
87
  * Sitemap integration with personalization.
88
  * Robots.txt sitemap integration.
89
  * Feed anti-scraper options.
100
  * If the description is too long, too short, duplicated, has too many repeated words and/or automatically generated.
101
  * If the page is indexed, redirected, followed and/or archived, while looking at other WordPress settings.
102
 
103
+ **We call this the SEO Bar. Check out the [Screenshots](https://wordpress.org/plugins/autodescription/#screenshots) to see how it helps you!**
104
 
105
  = Hardcore caching =
106
  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.
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.
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. It also listens to the "noindex" settings on each of the items and works great with various translation plugins.
129
 
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. 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.
131
 
152
  * Do fill in the Home Page "General" settings.
153
  * Do fill in the Social Meta "General", "Facebook" and "Twitter" settings.
154
  * Notice that red checkboxes are recommended to be left unchecked. And green checkboxes are recommended to be checked.
155
+ * These color-coded boxes are shown in non-Gecko browsers, i.e. everything but Firefox.
156
 
157
  = This plugin auto-configures SEO meta settings, and: =
158
 
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 informational.
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.
175
  = Is The SEO Framework Free? =
176
 
177
  Absolutely! It will stay free as well, without ads or nags!
178
+ This plugin is all-inclusive without upsells.
179
 
180
+ = Is there more? =
 
 
 
 
181
 
182
  For more advanced SEO options and output, we offer the free plugin [Extension Manager](https://wordpress.org/plugins/the-seo-framework-extension-manager/).
183
 
184
  = I have a feature request, I've found a bug, a plugin is incompatible... =
185
 
186
+ Please visit [the support forums](https://wordpress.org/support/plugin/autodescription) and kindly tell us about it.
187
+ We'll try to get back to you within 72 hours. :)
 
 
 
 
 
188
 
189
  = I am a developer; how can I help? =
190
 
191
+ Any input is greatly appreciated, and everything will be considered.
192
  Please visit the [GitHub project page](https://github.com/sybrew/the-seo-framework) to submit issues or even pull requests.
193
 
194
  = I want to modify how this plugin works =
197
 
198
  = The sitemap doesn't contain categories, images, news, etc. is this OK? =
199
 
200
+ This is not an issue. Search engines love crawling WordPress because its structure is consistent and well known.
201
+ 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.
202
+
203
+ Check out our [Extension Manager](https://wordpress.org/plugins/the-seo-framework-extension-manager/).
204
+ It contains extensions, like Articles, that fill in the gaps with newer techniques.
205
+
206
+ = The sitemap contains unwanted links =
207
+
208
+ The SEO Framework takes all publicly queryable posts, pages, and CPT and puts them in the sitemap.
209
+
210
+ If you don't want a page in the sitemap, consider enabling the `noindex` option. This will also remove the page from search engine result pages.
211
+
212
+ If the link shouldn't be in the sitemap because it's meant for structural reasons, then inform the plugin or theme author that created them.
213
+ You should tell the author to check out the "`public` and `rewrite` post type arguments". The plugin or theme author should know that that means.
214
 
215
  = What's do the application/ld+json scripts do? =
216
 
217
+ The JSON-LD scripts are search engine helpers which tell search engines how to connect and index the site.
218
+ 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.
219
+ This is also referred to as "Structured Data".
220
 
221
  = The metadata is not being updated, and I'm using a caching plugin. =
222
 
223
+ All The SEO Framework's metadata is put into Object cache when a caching plugin is available.
224
+ The descriptions and Schema.org scripts are put into Transients.
225
+ Please be sure to clear your cache or adjust the plugin's caching settings if deemed necessary.
226
 
227
  = I want to transport SEO data from other plugins to The SEO Framework, how do I do this? =
228
 
229
  Please refer to this small guide: [SEO Data Migration](http://theseoframework.com/docs/seo-data-migration/).
230
+ Transporting Categories, Tags and other terms' SEO data isn't supported.
231
 
232
  == Changelog ==
233
 
234
+ = 3.0.4 - Illustrious =
235
+
236
+ **Release date:**
237
+
238
+ * February 25th, 2017
239
+
240
+ **Did you know?**
241
+
242
+ * We're working on an extension for keyword and subject analysis, named [Focus](https://github.com/sybrew/The-SEO-Framework-Extension-Manager/tree/master/extensions/free/focus/trunk).
243
+ * In its current state, it's already on par with other solutions, but we are going to take it even further.
244
+ * More details will follow in a blog post, which we'll link to on our [Twitter page](https://twitter.com/TheSEOFramework) when the features are ready.
245
+
246
+ **Summarized:**
247
+
248
+ * This is a maintenance release with over 10 bugs fixed. Most notoriously were pixel guideline calculation errors and home page title errors.
249
+ * Open Graph and Twitter custom title and description options have been added to every post, page, and CPT.
250
+ * The description character count and pixel length guidelines have been updated.
251
+ * All publicly queryable CPT posts and pages now support SEO settings and are included in the sitemap. No more messing with filters is needed.
252
+
253
+ **About the new description guidelines:**
254
+
255
+ * Google increased their SERP's description length a few months ago, so we've updated the upper-limit guidelines.
256
+ * We recommend enforcing these new guidelines for new pages, cornerstone pages, and the home page.
257
+ * Although the description lengths have been updated, the transient cache isn't invalidated.
258
+ * Over time the cache will refresh itself, this is done automatically by WordPress, or via your caching plugin's transients handler (if applicable).
259
+
260
+ **About the social meta input:**
261
+
262
+ * There are new Open Graph and Twitter inputs in the SEO Settings.
263
+ * The Twitter settings, when left empty, will use the Open Graph output.
264
+ * The Open Graph settings, when left empty, will use the SEO meta output.
265
+ * As always, auto-generated Open Graph and Twitter descriptions won't use prefixes.
266
+
267
+ **Found unwanted links in the sitemap?**
268
+
269
+ * If you find posts in the sitemap that shouldn't be there, please refer to [our renewed FAQ](https://wordpress.org/plugins/autodescription/#faq).
270
+ * The FAQ entry title is "The sitemap contains unwanted links".
271
+
272
+ [View the detailed log](https://theseoframework.com/?p=2264#detailed).
273
+
274
  = 3.0.3 - Diligence =
275
 
276
  **Release date:**
wpml-config.xml ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <wpml-config>
2
+ <custom-fields>
3
+ <custom-field action="translate">_genesis_title</custom-field>
4
+ <custom-field action="translate">_genesis_description</custom-field>
5
+ <custom-field action="translate">_social_image_url</custom-field>
6
+ <custom-field action="translate">_genesis_canonical_uri</custom-field>
7
+ <custom-field action="translate">redirect</custom-field>
8
+ <custom-field action="translate">_open_graph_title</custom-field>
9
+ <custom-field action="translate">_twitter_title</custom-field>
10
+ <custom-field action="translate">_open_graph_description</custom-field>
11
+ <custom-field action="translate">_twitter_description</custom-field>
12
+ </custom-fields>
13
+ </wpml-config>