The SEO Framework - Version 4.0.6

Version Description

In this update, we addressed a few issues our amazing users helped investigate. With that, we implemented better bbPress title support, and fixed a bug regarding WooCommerce and term-ID collisions.

We also increased the entropy for generating object caching keys, addressed some translation and RTL errors, and added a few new filters.

Download this release

Release Info

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

Code changes from version 4.0.5 to 4.0.6

autodescription.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: The SEO Framework
4
  * Plugin URI: https://theseoframework.com/
5
  * Description: An automated, advanced, accessible, unbranded and extremely fast SEO solution for your WordPress website.
6
- * Version: 4.0.5
7
  * Author: The SEO Framework Team
8
  * Author URI: https://theseoframework.com/
9
  * License: GPLv3
@@ -64,7 +64,7 @@ defined( 'ABSPATH' ) or die;
64
  *
65
  * @since 2.3.5
66
  */
67
- define( 'THE_SEO_FRAMEWORK_VERSION', '4.0.5' );
68
 
69
  /**
70
  * The plugin Database version.
3
  * Plugin Name: The SEO Framework
4
  * Plugin URI: https://theseoframework.com/
5
  * Description: An automated, advanced, accessible, unbranded and extremely fast SEO solution for your WordPress website.
6
+ * Version: 4.0.6
7
  * Author: The SEO Framework Team
8
  * Author URI: https://theseoframework.com/
9
  * License: GPLv3
64
  *
65
  * @since 2.3.5
66
  */
67
+ define( 'THE_SEO_FRAMEWORK_VERSION', '4.0.6' );
68
 
69
  /**
70
  * The plugin Database version.
bootstrap/upgrade.php CHANGED
@@ -106,6 +106,7 @@ function _do_upgrade() {
106
  }
107
 
108
  // Check if upgrade is locked. Otherwise, lock it.
 
109
  if ( \get_transient( 'tsf_upgrade_lock' ) ) return;
110
 
111
  $timeout = 5 * MINUTE_IN_SECONDS;
@@ -240,6 +241,9 @@ function _prepare_upgrade_notice() {
240
  * Outputs "your site has been upgraded" notification to applicable plugin users on upgrade.
241
  *
242
  * @since 3.0.6
 
 
 
243
  */
244
  function _do_upgrade_notice() {
245
 
106
  }
107
 
108
  // Check if upgrade is locked. Otherwise, lock it.
109
+ // TODO send out an admin notice, that informs the user the upgrader is running in the background for X seconds?
110
  if ( \get_transient( 'tsf_upgrade_lock' ) ) return;
111
 
112
  $timeout = 5 * MINUTE_IN_SECONDS;
241
  * Outputs "your site has been upgraded" notification to applicable plugin users on upgrade.
242
  *
243
  * @since 3.0.6
244
+ * @TODO Add browser cache flush notice? Or set a pragma/cache-control header?
245
+ * Users that remove query strings (thanks to YSlow) are to blame, though.
246
+ * @link <https://wordpress.org/support/topic/4-0-admin-interface-not-loading-correctly/>
247
  */
248
  function _do_upgrade_notice() {
249
 
inc/classes/admin-init.class.php CHANGED
@@ -365,7 +365,7 @@ class Admin_Init extends Init {
365
  * for alerts, etc.
366
  *
367
  * @since 2.2.2
368
- * @since 2.9.2 : Added user-friendly exception handling.
369
  * @since 2.9.3 : 1. Query arguments work again (regression 2.9.2).
370
  * 2. Now only accepts http and https protocols.
371
  *
@@ -379,7 +379,9 @@ class Admin_Init extends Init {
379
  if ( empty( $page ) )
380
  return;
381
 
382
- $url = html_entity_decode( \menu_page_url( $page, false ) ); // This can be empty... TODO test?
 
 
383
 
384
  foreach ( $query_args as $key => $value ) {
385
  if ( empty( $key ) || empty( $value ) )
@@ -397,7 +399,7 @@ class Admin_Init extends Init {
397
  * 1. Change 302 to 500 if you wish to test headers.
398
  * 2. Also force handle_admin_redirect_error() to run.
399
  */
400
- \wp_safe_redirect( $target, 302 );
401
 
402
  //* White screen of death for non-debugging users. Let's make it friendlier.
403
  if ( $headers_sent ) {
365
  * for alerts, etc.
366
  *
367
  * @since 2.2.2
368
+ * @since 2.9.2 Added user-friendly exception handling.
369
  * @since 2.9.3 : 1. Query arguments work again (regression 2.9.2).
370
  * 2. Now only accepts http and https protocols.
371
  *
379
  if ( empty( $page ) )
380
  return;
381
 
382
+ // This can be empty... so $target will be empty. TODO test for $success and bail?
383
+ // Might cause security issues... we _must_ exit, always? Show warning?
384
+ $url = html_entity_decode( \menu_page_url( $page, false ) );
385
 
386
  foreach ( $query_args as $key => $value ) {
387
  if ( empty( $key ) || empty( $value ) )
399
  * 1. Change 302 to 500 if you wish to test headers.
400
  * 2. Also force handle_admin_redirect_error() to run.
401
  */
402
+ $success = \wp_safe_redirect( $target, 302 ); // phpcs:ignore, VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
403
 
404
  //* White screen of death for non-debugging users. Let's make it friendlier.
405
  if ( $headers_sent ) {
inc/classes/builders/scripts.class.php CHANGED
@@ -250,11 +250,8 @@ final class Scripts {
250
  public static function forward_known_script( $id, $type ) {
251
  if ( ! ( static::get_status_of( $id, $type ) & static::REGISTERED ) ) {
252
  foreach ( static::$scripts as $s ) {
253
- if ( $s['id'] === $id ) {
254
- if ( $s['type'] === $type ) {
255
- static::forward_script( $s );
256
- }
257
- }
258
  }
259
  }
260
  }
250
  public static function forward_known_script( $id, $type ) {
251
  if ( ! ( static::get_status_of( $id, $type ) & static::REGISTERED ) ) {
252
  foreach ( static::$scripts as $s ) {
253
+ if ( $s['id'] === $id && $s['type'] === $type )
254
+ static::forward_script( $s );
 
 
 
255
  }
256
  }
257
  }
inc/classes/builders/seobar-page.class.php CHANGED
@@ -199,7 +199,7 @@ final class SeoBar_Page extends SeoBar {
199
  ];
200
 
201
  // TODO instead of getting values from the options API, why don't we store the parameters and allow them to be modified?
202
- // This way, we can implement AJAX SEO bar items...
203
  $title_part = static::$tsf->get_filtered_raw_custom_field_title( $title_args, false );
204
 
205
  if ( strlen( $title_part ) ) {
@@ -421,7 +421,7 @@ final class SeoBar_Page extends SeoBar {
421
  ];
422
 
423
  // TODO instead of getting values from the options API, why don't we store the parameters and allow them to be modified?
424
- // This way, we can implement AJAX SEO bar items...
425
  $desc = static::$tsf->get_description_from_custom_field( $desc_args, false );
426
 
427
  if ( strlen( $desc ) ) {
199
  ];
200
 
201
  // TODO instead of getting values from the options API, why don't we store the parameters and allow them to be modified?
202
+ // This way, we can implement real-time live-edit AJAX SEO bar items...
203
  $title_part = static::$tsf->get_filtered_raw_custom_field_title( $title_args, false );
204
 
205
  if ( strlen( $title_part ) ) {
421
  ];
422
 
423
  // TODO instead of getting values from the options API, why don't we store the parameters and allow them to be modified?
424
+ // This way, we can implement real-time live-edit AJAX SEO bar items...
425
  $desc = static::$tsf->get_description_from_custom_field( $desc_args, false );
426
 
427
  if ( strlen( $desc ) ) {
inc/classes/builders/seobar-term.class.php CHANGED
@@ -215,7 +215,7 @@ final class SeoBar_Term extends SeoBar {
215
  ];
216
 
217
  // TODO instead of getting values from the options API, why don't we store the parameters and allow them to be modified?
218
- // This way, we can implement AJAX SEO bar items...
219
  $title_part = static::$tsf->get_filtered_raw_custom_field_title( $title_args, false );
220
 
221
  if ( strlen( $title_part ) ) {
@@ -410,7 +410,7 @@ final class SeoBar_Term extends SeoBar {
410
  ];
411
 
412
  // TODO instead of getting values from the options API, why don't we store the parameters and allow them to be modified?
413
- // This way, we can implement AJAX SEO bar items...
414
  $desc = static::$tsf->get_description_from_custom_field( $desc_args, false );
415
 
416
  if ( strlen( $desc ) ) {
215
  ];
216
 
217
  // TODO instead of getting values from the options API, why don't we store the parameters and allow them to be modified?
218
+ // This way, we can implement real-time live-edit AJAX SEO bar items...
219
  $title_part = static::$tsf->get_filtered_raw_custom_field_title( $title_args, false );
220
 
221
  if ( strlen( $title_part ) ) {
410
  ];
411
 
412
  // TODO instead of getting values from the options API, why don't we store the parameters and allow them to be modified?
413
+ // This way, we can implement real-time live-edit AJAX SEO bar items...
414
  $desc = static::$tsf->get_description_from_custom_field( $desc_args, false );
415
 
416
  if ( strlen( $desc ) ) {
inc/classes/builders/seobar.class.php CHANGED
@@ -36,7 +36,7 @@ defined( 'THE_SEO_FRAMEWORK_PRESENT' ) or die;
36
  * @access private
37
  * Use \The_SEO_Framework\Interpreters\SeoBar::generate_bar() instead.
38
  * @internal
39
- * @abstract: Implements test_{$*}, see property $tests and method `_run_test()` for what * may be.
40
  * @see \The_SEO_Framework\Interpreters\SeoBar
41
  */
42
  abstract class SeoBar {
36
  * @access private
37
  * Use \The_SEO_Framework\Interpreters\SeoBar::generate_bar() instead.
38
  * @internal
39
+ * @abstract Implements test_{$*}, see property $tests and method `_run_test()` for what * may be.
40
  * @see \The_SEO_Framework\Interpreters\SeoBar
41
  */
42
  abstract class SeoBar {
inc/classes/cache.class.php CHANGED
@@ -600,9 +600,8 @@ class Cache extends Site_Options {
600
  break;
601
  endswitch;
602
  } elseif ( $this->is_search() ) {
603
- //* Remove spaces. Limit to 10 chars.
604
- // TODO use metahpone?
605
- $query = \esc_sql( substr( str_replace( ' ', '', \get_search_query( true ) ), 0, 10 ) );
606
 
607
  //* Temporarily disable caches to prevent database spam.
608
  $this->the_seo_framework_use_transients = false;
@@ -708,6 +707,7 @@ class Cache extends Site_Options {
708
  * Generates Cache key for taxonomical archives.
709
  *
710
  * @since 2.6.0
 
711
  *
712
  * @param int $page_id The taxonomy or page ID.
713
  * @param string $taxonomy The taxonomy name.
@@ -721,8 +721,8 @@ class Cache extends Site_Options {
721
  $taxonomy_name = explode( '_', $taxonomy );
722
  if ( is_array( $taxonomy_name ) ) {
723
  foreach ( $taxonomy_name as $name ) {
724
- if ( mb_strlen( $name ) >= 3 ) {
725
- $the_id .= mb_substr( $name, 0, 3 ) . '_';
726
  } else {
727
  $the_id = $name . '_';
728
  }
@@ -731,14 +731,14 @@ class Cache extends Site_Options {
731
  }
732
 
733
  if ( ! $the_id ) {
734
- if ( mb_strlen( $taxonomy ) >= 5 ) {
735
- $the_id = mb_substr( $taxonomy, 0, 5 );
736
  } else {
737
- $the_id = \esc_sql( $taxonomy );
738
  }
739
  }
740
 
741
- $the_id = strtolower( $the_id );
742
 
743
  //* Put it all together.
744
  return rtrim( $the_id, '_' ) . '_' . $page_id;
600
  break;
601
  endswitch;
602
  } elseif ( $this->is_search() ) {
603
+ //* Remove spaces, jumble with md5, Limit to 12 chars.
604
+ $query = \esc_sql( substr( md5( str_replace( ' ', '', \get_search_query( true ) ) ), 0, 12 ) );
 
605
 
606
  //* Temporarily disable caches to prevent database spam.
607
  $this->the_seo_framework_use_transients = false;
707
  * Generates Cache key for taxonomical archives.
708
  *
709
  * @since 2.6.0
710
+ * @since 4.0.6 No longer uses mb encoding functions, speeding up this method.
711
  *
712
  * @param int $page_id The taxonomy or page ID.
713
  * @param string $taxonomy The taxonomy name.
721
  $taxonomy_name = explode( '_', $taxonomy );
722
  if ( is_array( $taxonomy_name ) ) {
723
  foreach ( $taxonomy_name as $name ) {
724
+ if ( strlen( $name ) >= 3 ) {
725
+ $the_id .= substr( $name, 0, 3 ) . '_';
726
  } else {
727
  $the_id = $name . '_';
728
  }
731
  }
732
 
733
  if ( ! $the_id ) {
734
+ if ( strlen( $taxonomy ) >= 6 ) {
735
+ $the_id = substr( $taxonomy, 0, 6 );
736
  } else {
737
+ $the_id = $taxonomy;
738
  }
739
  }
740
 
741
+ $the_id = strtolower( \esc_sql( $the_id ) );
742
 
743
  //* Put it all together.
744
  return rtrim( $the_id, '_' ) . '_' . $page_id;
inc/classes/core.class.php CHANGED
@@ -221,16 +221,16 @@ class Core {
221
  );
222
  }
223
 
224
- $tsf_links['about'] = sprintf(
225
- '<a href="%s" rel="noreferrer noopener" target="_blank">%s</a>',
226
- 'https://theseoframework.com/about-us/',
227
- \esc_html_x( 'About', 'About us', 'autodescription' )
228
- );
229
  $tsf_links['tsfem'] = sprintf(
230
  '<a href="%s" rel="noreferrer noopener" target="_blank">%s</a>',
231
  'https://theseoframework.com/extensions/',
232
  \esc_html_x( 'Extensions', 'Plugin extensions', 'autodescription' )
233
  );
 
 
 
 
 
234
 
235
  return array_merge( $tsf_links, $links );
236
  }
@@ -794,11 +794,10 @@ class Core {
794
  */
795
  public function convert_markdown( $text, $convert = [], $args = [] ) {
796
 
797
- preprocess : {
798
- $text = str_replace( "\r\n", "\n", $text );
799
- $text = str_replace( "\t", ' ', $text );
800
- $text = trim( $text );
801
- }
802
 
803
  // You need 3 chars to make a markdown: *m*
804
  if ( strlen( $text ) < 3 )
@@ -880,9 +879,11 @@ class Core {
880
  case 'h3':
881
  case 'h2':
882
  case 'h1':
883
- $amount = filter_var( $type, FILTER_SANITIZE_NUMBER_INT );
884
  //* Considers word non-boundary. @TODO consider removing this?
885
- $expression = sprintf( '/(?:\={%1$s})\B([^\={\%1$s}]+)\B(?:\={%1$s})/', $amount );
 
 
 
886
 
887
  $count = preg_match_all( $expression, $text, $matches, PREG_PATTERN_ORDER );
888
 
221
  );
222
  }
223
 
 
 
 
 
 
224
  $tsf_links['tsfem'] = sprintf(
225
  '<a href="%s" rel="noreferrer noopener" target="_blank">%s</a>',
226
  'https://theseoframework.com/extensions/',
227
  \esc_html_x( 'Extensions', 'Plugin extensions', 'autodescription' )
228
  );
229
+ $tsf_links['pricing'] = sprintf(
230
+ '<a href="%s" rel="noreferrer noopener" target="_blank">%s</a>',
231
+ 'https://theseoframework.com/pricing/',
232
+ \esc_html_x( 'Pricing', 'Plugin pricing', 'autodescription' )
233
+ );
234
 
235
  return array_merge( $tsf_links, $links );
236
  }
794
  */
795
  public function convert_markdown( $text, $convert = [], $args = [] ) {
796
 
797
+ // preprocess
798
+ $text = str_replace( "\r\n", "\n", $text );
799
+ $text = str_replace( "\t", ' ', $text );
800
+ $text = trim( $text );
 
801
 
802
  // You need 3 chars to make a markdown: *m*
803
  if ( strlen( $text ) < 3 )
879
  case 'h3':
880
  case 'h2':
881
  case 'h1':
 
882
  //* Considers word non-boundary. @TODO consider removing this?
883
+ $expression = sprintf(
884
+ '/(?:\={%1$d})\B([^\={\%1$s}]+)\B(?:\={%1$d})/',
885
+ filter_var( $type, FILTER_SANITIZE_NUMBER_INT )
886
+ );
887
 
888
  $count = preg_match_all( $expression, $text, $matches, PREG_PATTERN_ORDER );
889
 
inc/classes/debug.class.php CHANGED
@@ -233,7 +233,6 @@ final class Debug {
233
  * @since 2.8.0 1. Now escapes all parameters.
234
  * 2. Removed check for gettext.
235
  * @access private
236
- * @todo Escape translation string.
237
  *
238
  * @param string $p_or_m The Property or Method.
239
  * @param string $message A message explaining what has been done incorrectly.
@@ -583,6 +582,7 @@ final class Debug {
583
  *
584
  * @since 2.6.6
585
  * @since 4.0.0 Cleaned up global callers; only use TSF methods.
 
586
  *
587
  * @param string $cache_version 'yup' or 'nope'
588
  * @return string Wrapped Query State debug output.
@@ -638,10 +638,13 @@ final class Debug {
638
  $is_singular_archive = $tsf->is_singular_archive();
639
  $is_term_meta_capable = $tsf->is_term_meta_capable();
640
  $is_post_type_supported = $tsf->is_post_type_supported();
 
641
  $get_post_type = \get_post_type();
642
  $get_post_type_real_ID = $tsf->get_post_type_real_ID();
643
  $admin_post_type = $tsf->get_admin_post_type();
644
  $current_taxonomy = $tsf->get_current_taxonomy();
 
 
645
  $is_post_type_archive = \is_post_type_archive();
646
  $is_protected = $tsf->is_protected( $page_id );
647
  // phpcs:enable, WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase -- Not this file's issue.
233
  * @since 2.8.0 1. Now escapes all parameters.
234
  * 2. Removed check for gettext.
235
  * @access private
 
236
  *
237
  * @param string $p_or_m The Property or Method.
238
  * @param string $message A message explaining what has been done incorrectly.
582
  *
583
  * @since 2.6.6
584
  * @since 4.0.0 Cleaned up global callers; only use TSF methods.
585
+ * @since 4.1.0 Added more debugging variables added since 4.0.0.
586
  *
587
  * @param string $cache_version 'yup' or 'nope'
588
  * @return string Wrapped Query State debug output.
638
  $is_singular_archive = $tsf->is_singular_archive();
639
  $is_term_meta_capable = $tsf->is_term_meta_capable();
640
  $is_post_type_supported = $tsf->is_post_type_supported();
641
+ $is_taxonomy_supported = $tsf->is_taxonomy_supported();
642
  $get_post_type = \get_post_type();
643
  $get_post_type_real_ID = $tsf->get_post_type_real_ID();
644
  $admin_post_type = $tsf->get_admin_post_type();
645
  $current_taxonomy = $tsf->get_current_taxonomy();
646
+ $is_taxonomy_disabled = $tsf->is_taxonomy_disabled();
647
+ $is_taxonomy_public = $tsf->is_taxonomy_public();
648
  $is_post_type_archive = \is_post_type_archive();
649
  $is_protected = $tsf->is_protected( $page_id );
650
  // phpcs:enable, WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase -- Not this file's issue.
inc/classes/deprecated.class.php CHANGED
@@ -153,7 +153,7 @@ final class Deprecated {
153
  public function get_seo_bar( $column, $post_id, $tax_id ) {
154
 
155
  $tsf = \the_seo_framework();
156
- $tsf->_deprecated_function( 'the_seo_framework()->post_status()', '4.0.0', 'the_seo_framework()->get_generated_seo_bar()' );
157
 
158
  $type = \get_post_type( $post_id );
159
 
@@ -553,8 +553,7 @@ final class Deprecated {
553
  * Returns image URL suitable for Schema items.
554
  *
555
  * These are images that are strictly assigned to the Post or Page, fallbacks are omitted.
556
- * Themes should compliment these. If not, then Open Graph should at least
557
- * compliment these.
558
  * If that's not even true, then I don't know what happens. But then you're
559
  * in a grey area... @TODO make images optional for Schema?
560
  *
153
  public function get_seo_bar( $column, $post_id, $tax_id ) {
154
 
155
  $tsf = \the_seo_framework();
156
+ $tsf->_deprecated_function( 'the_seo_framework()->get_seo_bar()', '4.0.0', 'the_seo_framework()->get_generated_seo_bar()' );
157
 
158
  $type = \get_post_type( $post_id );
159
 
553
  * Returns image URL suitable for Schema items.
554
  *
555
  * These are images that are strictly assigned to the Post or Page, fallbacks are omitted.
556
+ * Themes should complement these. If not, then Open Graph should at least complement these.
 
557
  * If that's not even true, then I don't know what happens. But then you're
558
  * in a grey area... @TODO make images optional for Schema?
559
  *
inc/classes/detect.class.php CHANGED
@@ -143,6 +143,7 @@ class Detect extends Render {
143
  * @since 1.3.0
144
  * @since 2.8.0 : 1. Can now check for globals.
145
  * 2. Switched detection order from FAST to SLOW.
 
146
  *
147
  * @param array $plugins Array of array for constants, classes and / or functions to check for plugin existence.
148
  * @return boolean True if plugin exists or false if plugin constant, class or function not detected.
@@ -178,7 +179,7 @@ class Detect extends Render {
178
  //* Check for classes
179
  if ( isset( $plugins['classes'] ) ) {
180
  foreach ( $plugins['classes'] as $name ) {
181
- if ( class_exists( $name ) ) {
182
  return true;
183
  }
184
  }
@@ -239,16 +240,29 @@ class Detect extends Render {
239
  * All parameters must match and return true.
240
  *
241
  * @since 2.5.2
 
 
 
 
242
  *
243
  * @param array $plugins Array of array for constants, classes and / or functions to check for plugin existence.
244
  * @return bool True if ALL functions classes and constants exists or false if plugin constant, class or function not detected.
245
  */
246
  public function detect_plugin_multi( array $plugins ) {
247
 
248
- //* Check for classes
249
- if ( isset( $plugins['classes'] ) ) {
250
- foreach ( $plugins['classes'] as $name ) {
251
- if ( ! class_exists( $name ) ) {
 
 
 
 
 
 
 
 
 
252
  return false;
253
  }
254
  }
@@ -263,10 +277,10 @@ class Detect extends Render {
263
  }
264
  }
265
 
266
- //* Check for constants
267
- if ( isset( $plugins['constants'] ) ) {
268
- foreach ( $plugins['constants'] as $name ) {
269
- if ( ! defined( $name ) ) {
270
  return false;
271
  }
272
  }
@@ -532,8 +546,8 @@ class Detect extends Render {
532
  * - Beaver Builder by Fastline Media
533
  *
534
  * @since 4.0.0
 
535
  * @staticvar bool $detected
536
- * @TODO add filter?
537
  *
538
  * @return bool
539
  */
@@ -541,15 +555,26 @@ class Detect extends Render {
541
 
542
  static $detected = null;
543
 
544
- return isset( $detected ) ? $detected : $detected = $this->detect_plugin( [
545
- 'constants' => [
546
- 'ELEMENTOR_VERSION',
547
- 'ET_BUILDER_VERSION',
548
- 'WPB_VC_VERSION',
549
- 'SITEORIGIN_PANELS_VERSION',
550
- 'FL_BUILDER_VERSION',
551
- ],
552
- ] );
 
 
 
 
 
 
 
 
 
 
 
553
  }
554
 
555
  /**
143
  * @since 1.3.0
144
  * @since 2.8.0 : 1. Can now check for globals.
145
  * 2. Switched detection order from FAST to SLOW.
146
+ * @since 4.0.6 Can no longer autoload classes.
147
  *
148
  * @param array $plugins Array of array for constants, classes and / or functions to check for plugin existence.
149
  * @return boolean True if plugin exists or false if plugin constant, class or function not detected.
179
  //* Check for classes
180
  if ( isset( $plugins['classes'] ) ) {
181
  foreach ( $plugins['classes'] as $name ) {
182
+ if ( class_exists( $name, false ) ) {
183
  return true;
184
  }
185
  }
240
  * All parameters must match and return true.
241
  *
242
  * @since 2.5.2
243
+ * @since 4.0.6 : 1. Can now check for globals.
244
+ * 2. Switched detection order from FAST to SLOW.
245
+ * 3. Can no longer autoload classes.
246
+ * This method is only used by can_i_use(), and is only effective in the Ultimate Member compat file...
247
  *
248
  * @param array $plugins Array of array for constants, classes and / or functions to check for plugin existence.
249
  * @return bool True if ALL functions classes and constants exists or false if plugin constant, class or function not detected.
250
  */
251
  public function detect_plugin_multi( array $plugins ) {
252
 
253
+ //* Check for globals
254
+ if ( isset( $plugins['globals'] ) ) {
255
+ foreach ( $plugins['globals'] as $name ) {
256
+ if ( ! isset( $GLOBALS[ $name ] ) ) {
257
+ return false;
258
+ }
259
+ }
260
+ }
261
+
262
+ //* Check for constants
263
+ if ( isset( $plugins['constants'] ) ) {
264
+ foreach ( $plugins['constants'] as $name ) {
265
+ if ( ! defined( $name ) ) {
266
  return false;
267
  }
268
  }
277
  }
278
  }
279
 
280
+ //* Check for classes
281
+ if ( isset( $plugins['classes'] ) ) {
282
+ foreach ( $plugins['classes'] as $name ) {
283
+ if ( ! class_exists( $name, false ) ) {
284
  return false;
285
  }
286
  }
546
  * - Beaver Builder by Fastline Media
547
  *
548
  * @since 4.0.0
549
+ * @since 4.0.6 The output is now filterable.
550
  * @staticvar bool $detected
 
551
  *
552
  * @return bool
553
  */
555
 
556
  static $detected = null;
557
 
558
+ if ( isset( $detected ) ) return $detected;
559
+
560
+ /**
561
+ * @since 4.0.6
562
+ * @param bool $detected Whether an active page builder is detected.
563
+ * @NOTE not to be confused with `the_seo_framework_detect_page_builder`, which tests
564
+ * the page builder status for each post individually.
565
+ */
566
+ return $detected = (bool) \apply_filters(
567
+ 'the_seo_framework_page_builder_active',
568
+ $this->detect_plugin( [
569
+ 'constants' => [
570
+ 'ELEMENTOR_VERSION',
571
+ 'ET_BUILDER_VERSION',
572
+ 'WPB_VC_VERSION',
573
+ 'SITEORIGIN_PANELS_VERSION',
574
+ 'FL_BUILDER_VERSION',
575
+ ],
576
+ ] )
577
+ );
578
  }
579
 
580
  /**
inc/classes/generate-description.class.php CHANGED
@@ -390,6 +390,12 @@ class Generate_Description extends Generate {
390
  $desc = $this->get_post_meta_item( '_genesis_description' ) ?: '';
391
  } elseif ( $this->is_term_meta_capable() ) {
392
  $desc = $this->get_term_meta_item( 'description' ) ?: '';
 
 
 
 
 
 
393
  }
394
  // phpcs:enable, WordPress.WhiteSpace.PrecisionAlignment
395
 
@@ -624,10 +630,10 @@ class Generate_Description extends Generate {
624
  return '';
625
 
626
  if ( is_null( $term ) ) {
627
- $_query = true;
628
- $term = \get_queried_object();
629
  } else {
630
- $_query = false;
631
  }
632
 
633
  /**
@@ -642,9 +648,7 @@ class Generate_Description extends Generate {
642
 
643
  $excerpt = '';
644
 
645
- if ( ! $_query ) {
646
- $excerpt = ! empty( $term->description ) ? $this->s_description_raw( $term->description ) : '';
647
- } else {
648
  if ( $this->is_category() || $this->is_tag() || $this->is_tax() ) {
649
  // WordPress DOES NOT allow HTML in term descriptions, not even if you're a super-administrator.
650
  // See https://wpvulndb.com/vulnerabilities/9445. We won't parse HTMl tags unless WordPress adds native support.
@@ -652,11 +656,23 @@ class Generate_Description extends Generate {
652
  } elseif ( $this->is_author() ) {
653
  $excerpt = $this->s_excerpt_raw( \get_the_author_meta( 'description', (int) \get_query_var( 'author' ) ) );
654
  } elseif ( \is_post_type_archive() ) {
655
- // TODO
656
- $excerpt = '';
 
 
 
 
 
 
657
  } else {
658
- $excerpt = '';
 
 
 
 
659
  }
 
 
660
  }
661
 
662
  return $excerpt;
390
  $desc = $this->get_post_meta_item( '_genesis_description' ) ?: '';
391
  } elseif ( $this->is_term_meta_capable() ) {
392
  $desc = $this->get_term_meta_item( 'description' ) ?: '';
393
+ } elseif ( \is_post_type_archive() ) {
394
+ /**
395
+ * @since 4.0.6
396
+ * @param string $desc The post type archive description.
397
+ */
398
+ $desc = (string) \apply_filters( 'the_seo_framework_pta_description', '' );
399
  }
400
  // phpcs:enable, WordPress.WhiteSpace.PrecisionAlignment
401
 
630
  return '';
631
 
632
  if ( is_null( $term ) ) {
633
+ $in_the_loop = true;
634
+ $term = \get_queried_object();
635
  } else {
636
+ $in_the_loop = false;
637
  }
638
 
639
  /**
648
 
649
  $excerpt = '';
650
 
651
+ if ( $in_the_loop ) {
 
 
652
  if ( $this->is_category() || $this->is_tag() || $this->is_tax() ) {
653
  // WordPress DOES NOT allow HTML in term descriptions, not even if you're a super-administrator.
654
  // See https://wpvulndb.com/vulnerabilities/9445. We won't parse HTMl tags unless WordPress adds native support.
656
  } elseif ( $this->is_author() ) {
657
  $excerpt = $this->s_excerpt_raw( \get_the_author_meta( 'description', (int) \get_query_var( 'author' ) ) );
658
  } elseif ( \is_post_type_archive() ) {
659
+ /**
660
+ * @TODO can we even obtain anything useful ourselves?
661
+ *
662
+ * @since 4.0.6
663
+ * @param string $excerpt The archive description excerpt.
664
+ * @param mixed $term The queried object.
665
+ */
666
+ $excerpt = (string) \apply_filters( 'the_seo_framework_pta_description_excerpt', '', $term );
667
  } else {
668
+ /**
669
+ * @since 4.0.6
670
+ * @param string $excerpt The fallback archive description excerpt.
671
+ */
672
+ $excerpt = (string) \apply_filters( 'the_seo_framework_fallback_archive_description_excerpt', '' );
673
  }
674
+ } else {
675
+ $excerpt = ! empty( $term->description ) ? $this->s_description_raw( $term->description ) : '';
676
  }
677
 
678
  return $excerpt;
inc/classes/generate-image.class.php CHANGED
@@ -310,7 +310,7 @@ class Generate_Image extends Generate_Url {
310
  * boolean multi: Whether multiple images may be returned,
311
  * array cbs: An array of image generation callbacks, in order of most important to least.
312
  * When 'multi' (or $single input) parameter is "false", it will use the first found.
313
- * array fallback: An array of image generaiton callbacks, in order of most important to least,
314
  * Only one image is obtained from the fallback, and only if the regular cbs don't
315
  * return any image.
316
  * }
@@ -417,7 +417,6 @@ class Generate_Image extends Generate_Url {
417
  $params = $this->get_image_generation_params( $args, $context );
418
  $single = $single || ! $params['multi'];
419
 
420
- // TODO s_image_details() here? The cbs may be discarded, and then we won't obtain any fallbacks...
421
  $details = $this->process_image_cbs( $params['cbs'], $args, $params['size'], $single )
422
  ?: $this->process_image_cbs( $params['fallback'], $args, $params['size'], true );
423
 
310
  * boolean multi: Whether multiple images may be returned,
311
  * array cbs: An array of image generation callbacks, in order of most important to least.
312
  * When 'multi' (or $single input) parameter is "false", it will use the first found.
313
+ * array fallback: An array of image generation callbacks, in order of most important to least,
314
  * Only one image is obtained from the fallback, and only if the regular cbs don't
315
  * return any image.
316
  * }
417
  $params = $this->get_image_generation_params( $args, $context );
418
  $single = $single || ! $params['multi'];
419
 
 
420
  $details = $this->process_image_cbs( $params['cbs'], $args, $params['size'], $single )
421
  ?: $this->process_image_cbs( $params['fallback'], $args, $params['size'], true );
422
 
inc/classes/generate-title.class.php CHANGED
@@ -512,6 +512,12 @@ class Generate_Title extends Generate_Description {
512
  $title = $this->get_post_meta_item( '_genesis_title' ) ?: '';
513
  } elseif ( $this->is_term_meta_capable() ) {
514
  $title = $this->get_term_meta_item( 'doctitle' ) ?: '';
 
 
 
 
 
 
515
  }
516
  // phpcs:enable, WordPress.WhiteSpace.PrecisionAlignment
517
 
512
  $title = $this->get_post_meta_item( '_genesis_title' ) ?: '';
513
  } elseif ( $this->is_term_meta_capable() ) {
514
  $title = $this->get_term_meta_item( 'doctitle' ) ?: '';
515
+ } elseif ( \is_post_type_archive() ) {
516
+ /**
517
+ * @since 4.0.6
518
+ * @param string $title The post type archive title.
519
+ */
520
+ $title = (string) \apply_filters( 'the_seo_framework_pta_title', '' );
521
  }
522
  // phpcs:enable, WordPress.WhiteSpace.PrecisionAlignment
523
 
inc/classes/interpreters/seobar.class.php CHANGED
@@ -29,7 +29,7 @@ defined( 'THE_SEO_FRAMEWORK_PRESENT' ) or die;
29
  * Interprets the SEO Bar into an HTML item.
30
  *
31
  * @since 4.0.0
32
- * TODO @see \the_seo_framework()->get_new_seo_bar( $args ) for easy access. (name tbd)
33
  *
34
  * @access public
35
  * Note that you can't instance this class. Only static methods and properties are accessible.
29
  * Interprets the SEO Bar into an HTML item.
30
  *
31
  * @since 4.0.0
32
+ * @see \the_seo_framework()->get_generated_seo_bar( $args ) for easy access.
33
  *
34
  * @access public
35
  * Note that you can't instance this class. Only static methods and properties are accessible.
inc/classes/post-data.class.php CHANGED
@@ -162,7 +162,7 @@ class Post_Data extends Detect {
162
  * @param \WP_Post $post Post object.
163
  */
164
  return (array) \apply_filters_ref_array(
165
- 'the_seo_framework_inpost_seo_save_defaults', // TODO rename to the_seo_framework_post_meta_defaults
166
  [
167
  $this->get_unfiltered_post_meta_defaults(),
168
  $post_id,
@@ -576,9 +576,7 @@ class Post_Data extends Detect {
576
  * Fetches Post content.
577
  *
578
  * @since 2.6.0
579
- * @since 3.1.0 1. No longer applies WordPress' default filters.
580
- * 2. No longer used internally.
581
- * @todo deprecate, unused.
582
  *
583
  * @param int $id The post ID.
584
  * @return string The post content.
162
  * @param \WP_Post $post Post object.
163
  */
164
  return (array) \apply_filters_ref_array(
165
+ 'the_seo_framework_inpost_seo_save_defaults', // TODO rename to the_seo_framework_post_meta_defaults. 4.1.0?
166
  [
167
  $this->get_unfiltered_post_meta_defaults(),
168
  $post_id,
576
  * Fetches Post content.
577
  *
578
  * @since 2.6.0
579
+ * @since 3.1.0 No longer applies WordPress' default filters.
 
 
580
  *
581
  * @param int $id The post ID.
582
  * @return string The post content.
inc/classes/query.class.php CHANGED
@@ -369,6 +369,7 @@ class Query extends Core {
369
  * @since 4.0.5 1. The output is now filterable.
370
  * 2. Added caching.
371
  * 3. Now has a first parameter `$post`.
 
372
  *
373
  * @param int|WP_Post|null $post (Optional) Post ID or post object.
374
  * @return bool
@@ -379,6 +380,7 @@ class Query extends Core {
379
  $post = \get_post( $post );
380
  $id = $post ? $post->ID : 0;
381
  } else {
 
382
  $id = $this->get_the_real_ID();
383
  }
384
 
369
  * @since 4.0.5 1. The output is now filterable.
370
  * 2. Added caching.
371
  * 3. Now has a first parameter `$post`.
372
+ * @since 4.0.6 Added a short-circuit on current-requests for `is_singular()`.
373
  *
374
  * @param int|WP_Post|null $post (Optional) Post ID or post object.
375
  * @return bool
380
  $post = \get_post( $post );
381
  $id = $post ? $post->ID : 0;
382
  } else {
383
+ if ( ! \is_singular() ) return false;
384
  $id = $this->get_the_real_ID();
385
  }
386
 
inc/compat/plugin-bbpress.php CHANGED
@@ -15,6 +15,202 @@ defined( 'THE_SEO_FRAMEWORK_PRESENT' ) and $_this = \the_seo_framework_class() a
15
  */
16
  \add_filter( 'bbp_title', [ $this, 'get_document_title' ], 99, 3 );
17
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  \add_filter( 'the_seo_framework_seo_column_keys_order', __NAMESPACE__ . '\\_bbpress_filter_order_keys' );
19
  /**
20
  * Filters the order keys for The SEO Bar.
15
  */
16
  \add_filter( 'bbp_title', [ $this, 'get_document_title' ], 99, 3 );
17
 
18
+ \add_filter( 'the_seo_framework_title_from_generation', __NAMESPACE__ . '\\_bbpress_filter_title', 10, 2 );
19
+ /**
20
+ * Override's The SEO Framework's auto-generated title with bbPress's on bbPress queries.
21
+ *
22
+ * Still waiting for an API to get the proper title from bbPress (e.g. get raw 'Forum edit: %s'), instead of them formulating
23
+ * a complete title for us.
24
+ *
25
+ * We're going to trust Automattic/bbPress that they'll deprecate all functions called here, instead of removing them,
26
+ * might they desire to add/improve new functionality.
27
+ *
28
+ * @since 4.0.6
29
+ * @source bbp_title()
30
+ * @NOTE Do NOT call `bbp_title()` or apply filter `bbptitle` here, it'll cause an infinite loop.
31
+ *
32
+ * @param string $title The title.
33
+ * @param array|null $args The query arguments. Contains 'id' and 'taxonomy'.
34
+ * Is null when query is autodetermined.
35
+ * @return string The corrected bbPress title on bbPress pages.
36
+ */
37
+ function _bbpress_filter_title( $title, $args ) {
38
+
39
+ if ( null !== $args || ! \is_bbpress() ) return $title;
40
+
41
+ // phpcs:disable, Squiz.Commenting.BlockComment, Generic.WhiteSpace.ScopeIndent, WordPress.WP.I18n, Generic.Formatting.MultipleStatementAlignment -- Not my code.
42
+
43
+ // Title array
44
+ $new_title = [];
45
+
46
+ /** Archives **************************************************************/
47
+
48
+ // Forum Archive
49
+ if ( \bbp_is_forum_archive() ) {
50
+ $new_title['text'] = \bbp_get_forum_archive_title();
51
+
52
+ // Topic Archive
53
+ } elseif ( \bbp_is_topic_archive() ) {
54
+ $new_title['text'] = \bbp_get_topic_archive_title();
55
+
56
+ /** Edit ******************************************************************/
57
+
58
+ // Forum edit page
59
+ } elseif ( \bbp_is_forum_edit() ) {
60
+ $new_title['text'] = \bbp_get_forum_title();
61
+ $new_title['format'] = \esc_attr__( 'Forum Edit: %s', 'bbpress' );
62
+
63
+ // Topic edit page
64
+ } elseif ( \bbp_is_topic_edit() ) {
65
+ $new_title['text'] = \bbp_get_topic_title();
66
+ $new_title['format'] = \esc_attr__( 'Topic Edit: %s', 'bbpress' );
67
+
68
+ // Reply edit page
69
+ } elseif ( \bbp_is_reply_edit() ) {
70
+ $new_title['text'] = \bbp_get_reply_title();
71
+ $new_title['format'] = \esc_attr__( 'Reply Edit: %s', 'bbpress' );
72
+
73
+ // Topic tag edit page
74
+ } elseif ( \bbp_is_topic_tag_edit() ) {
75
+ $new_title['text'] = \bbp_get_topic_tag_name();
76
+ $new_title['format'] = \esc_attr__( 'Topic Tag Edit: %s', 'bbpress' );
77
+
78
+ /** Singles ***************************************************************/
79
+
80
+ // Forum page
81
+ } elseif ( \bbp_is_single_forum() ) {
82
+ $new_title['text'] = \bbp_get_forum_title();
83
+ $new_title['format'] = \esc_attr__( 'Forum: %s', 'bbpress' );
84
+
85
+ // Topic page
86
+ } elseif ( \bbp_is_single_topic() ) {
87
+ $new_title['text'] = \bbp_get_topic_title();
88
+ $new_title['format'] = \esc_attr__( 'Topic: %s', 'bbpress' );
89
+
90
+ // Replies
91
+ } elseif ( \bbp_is_single_reply() ) {
92
+ $new_title['text'] = \bbp_get_reply_title();
93
+
94
+ // Topic tag page
95
+ } elseif ( \bbp_is_topic_tag() || \get_query_var( 'bbp_topic_tag' ) ) {
96
+ $new_title['text'] = \bbp_get_topic_tag_name();
97
+ $new_title['format'] = \esc_attr__( 'Topic Tag: %s', 'bbpress' );
98
+
99
+ /** Users *****************************************************************/
100
+
101
+ // Profile page
102
+ } elseif ( \bbp_is_single_user() ) {
103
+
104
+ // Is user viewing their own profile?
105
+ $is_user_home = \bbp_is_user_home();
106
+
107
+ // User topics created
108
+ if ( \bbp_is_single_user_topics() ) {
109
+ if ( true === $is_user_home ) {
110
+ $new_title['text'] = \esc_attr__( 'Your Topics', 'bbpress' );
111
+ } else {
112
+ $new_title['text'] = \get_userdata( \bbp_get_user_id() )->display_name;
113
+ /* translators: user's display name */
114
+ $new_title['format'] = \esc_attr__( "%s's Topics", 'bbpress' );
115
+ }
116
+
117
+ // User replies created
118
+ } elseif ( \bbp_is_single_user_replies() ) {
119
+ if ( true === $is_user_home ) {
120
+ $new_title['text'] = esc_attr__( 'Your Replies', 'bbpress' );
121
+ } else {
122
+ $new_title['text'] = \get_userdata( \bbp_get_user_id() )->display_name;
123
+ /* translators: user's display name */
124
+ $new_title['format'] = \esc_attr__( "%s's Replies", 'bbpress' );
125
+ }
126
+
127
+ // User favorites
128
+ } elseif ( \bbp_is_favorites() ) {
129
+ if ( true === $is_user_home ) {
130
+ $new_title['text'] = \esc_attr__( 'Your Favorites', 'bbpress' );
131
+ } else {
132
+ $new_title['text'] = \get_userdata( \bbp_get_user_id() )->display_name;
133
+ /* translators: user's display name */
134
+ $new_title['format'] = \esc_attr__( "%s's Favorites", 'bbpress' );
135
+ }
136
+
137
+ // User subscriptions
138
+ } elseif ( \bbp_is_subscriptions() ) {
139
+ if ( true === $is_user_home ) {
140
+ $new_title['text'] = \esc_attr__( 'Your Subscriptions', 'bbpress' );
141
+ } else {
142
+ $new_title['text'] = \get_userdata( \bbp_get_user_id() )->display_name;
143
+ /* translators: user's display name */
144
+ $new_title['format'] = \esc_attr__( "%s's Subscriptions", 'bbpress' );
145
+ }
146
+
147
+ // User "home"
148
+ } else {
149
+ if ( true === $is_user_home ) {
150
+ $new_title['text'] = \esc_attr__( 'Your Profile', 'bbpress' );
151
+ } else {
152
+ $new_title['text'] = \get_userdata( \bbp_get_user_id() )->display_name;
153
+ /* translators: user's display name */
154
+ $new_title['format'] = \esc_attr__( "%s's Profile", 'bbpress' );
155
+ }
156
+ }
157
+
158
+ // Profile edit page
159
+ } elseif ( \bbp_is_single_user_edit() ) {
160
+
161
+ // Current user
162
+ if ( \bbp_is_user_home_edit() ) {
163
+ $new_title['text'] = \esc_attr__( 'Edit Your Profile', 'bbpress' );
164
+
165
+ // Other user
166
+ } else {
167
+ $new_title['text'] = \get_userdata( \bbp_get_user_id() )->display_name;
168
+ $new_title['format'] = \esc_attr__( "Edit %s's Profile", 'bbpress' );
169
+ }
170
+
171
+ /** Views *****************************************************************/
172
+
173
+ // Views
174
+ } elseif ( \bbp_is_single_view() ) {
175
+ $new_title['text'] = \bbp_get_view_title();
176
+ $new_title['format'] = \esc_attr__( 'View: %s', 'bbpress' );
177
+
178
+ /** Search ****************************************************************/
179
+
180
+ // Search
181
+ } elseif ( \bbp_is_search() ) {
182
+ $new_title['text'] = \bbp_get_search_title();
183
+ }
184
+
185
+ // This filter is deprecated. Use 'bbp_before_title_parse_args' instead.
186
+ $new_title = \apply_filters( 'bbp_raw_title_array', $new_title );
187
+
188
+ // Set title array defaults
189
+ $new_title = \bbp_parse_args(
190
+ $new_title,
191
+ [
192
+ 'text' => $title,
193
+ 'format' => '%s',
194
+ ],
195
+ 'title'
196
+ );
197
+
198
+ // Get the formatted raw title
199
+ $new_title = sprintf( $new_title['format'], $new_title['text'] );
200
+
201
+ // Filter the raw title.
202
+ $new_title = \apply_filters( 'bbp_raw_title', $new_title, $sep = '&raquo;', $seplocation = '' );
203
+
204
+ // Compare new title with original title
205
+ if ( $new_title === $title ) {
206
+ return $title;
207
+ }
208
+
209
+ // phpcs:enable, Squiz.Commenting.BlockComment, Generic.WhiteSpace.ScopeIndent, WordPress.WP.I18n, Generic.Formatting.MultipleStatementAlignment -- Not my code.
210
+
211
+ return $new_title;
212
+ }
213
+
214
  \add_filter( 'the_seo_framework_seo_column_keys_order', __NAMESPACE__ . '\\_bbpress_filter_order_keys' );
215
  /**
216
  * Filters the order keys for The SEO Bar.
inc/compat/plugin-woocommerce.php CHANGED
@@ -8,8 +8,6 @@ namespace The_SEO_Framework;
8
 
9
  defined( 'THE_SEO_FRAMEWORK_PRESENT' ) and $_this = \the_seo_framework_class() and $this instanceof $_this or die;
10
 
11
- // @TODO Move everything WC related over to here.
12
-
13
  \add_action( 'woocommerce_init', __NAMESPACE__ . '\\_init_wc_compat' );
14
  /**
15
  * Initializes WooCommerce compatibility.
8
 
9
  defined( 'THE_SEO_FRAMEWORK_PRESENT' ) and $_this = \the_seo_framework_class() and $this instanceof $_this or die;
10
 
 
 
11
  \add_action( 'woocommerce_init', __NAMESPACE__ . '\\_init_wc_compat' );
12
  /**
13
  * Initializes WooCommerce compatibility.
inc/views/admin/metaboxes/robots-metabox.php CHANGED
@@ -15,16 +15,22 @@ $instance = $this->get_view_instance( 'the_seo_framework_robots_metabox', $insta
15
 
16
  switch ( $instance ) :
17
  case 'the_seo_framework_robots_metabox_main':
 
 
 
18
  //* Robots types
19
  $types = [
 
20
  'category' => __( 'Category archives', 'autodescription' ),
21
  'tag' => __( 'Tag archives', 'autodescription' ),
22
  'author' => __( 'Author pages', 'autodescription' ),
23
  'date' => __( 'Date archives', 'autodescription' ),
24
  'search' => __( 'Search pages', 'autodescription' ),
 
25
  'site' => _x( 'the entire site', '...for the entire site', 'autodescription' ),
26
  ];
27
 
 
28
  $post_types = $this->get_rewritable_post_types();
29
 
30
  //* Robots i18n
@@ -229,7 +235,7 @@ switch ( $instance ) :
229
  $_video_snippet_types['number'][ $_n ] = sprintf( _n( '%d second', '%d seconds', $_n, 'autodescription' ), $_n );
230
  }
231
  $video_preview_options = '';
232
- $_current = $this->get_option( 'max_video_preview' );
233
  foreach ( $_video_snippet_types as $_type => $_values ) {
234
  $_label = 'default' === $_type
235
  ? __( 'Standard directive', 'autodescription' )
15
 
16
  switch ( $instance ) :
17
  case 'the_seo_framework_robots_metabox_main':
18
+ // Tackle the plurality issue with https://github.com/sybrew/the-seo-framework/issues/20 ?
19
+ // Or should we tacking it when we add _all_ term type specifics (like SEO exclusion) support?
20
+
21
  //* Robots types
22
  $types = [
23
+ // TODO These ARE plural. https://github.com/sybrew/the-seo-framework/issues/508#issuecomment-597654089
24
  'category' => __( 'Category archives', 'autodescription' ),
25
  'tag' => __( 'Tag archives', 'autodescription' ),
26
  'author' => __( 'Author pages', 'autodescription' ),
27
  'date' => __( 'Date archives', 'autodescription' ),
28
  'search' => __( 'Search pages', 'autodescription' ),
29
+ // TODO This IS NOT plural. https://github.com/sybrew/the-seo-framework/issues/508#issuecomment-597654089
30
  'site' => _x( 'the entire site', '...for the entire site', 'autodescription' ),
31
  ];
32
 
33
+ // TODO This IS plural. https://github.com/sybrew/the-seo-framework/issues/508#issuecomment-597654089
34
  $post_types = $this->get_rewritable_post_types();
35
 
36
  //* Robots i18n
235
  $_video_snippet_types['number'][ $_n ] = sprintf( _n( '%d second', '%d seconds', $_n, 'autodescription' ), $_n );
236
  }
237
  $video_preview_options = '';
238
+ $_current = $this->get_option( 'max_video_preview' );
239
  foreach ( $_video_snippet_types as $_type => $_values ) {
240
  $_label = 'default' === $_type
241
  ? __( 'Standard directive', 'autodescription' )
inc/views/admin/metaboxes/social-metabox.php CHANGED
@@ -154,7 +154,7 @@ switch ( $instance ) :
154
  ?>
155
  <p>
156
  <label for="<?php $this->field_id( 'theme_color' ); ?>">
157
- <strong><?php esc_html_e( 'Theme color', 'autodescription' ); ?></strong>
158
  </label>
159
  </p>
160
  <p>
@@ -283,9 +283,8 @@ switch ( $instance ) :
283
  echo $this->code_wrap( $name ); // phpcs:ignore, WordPress.Security.EscapeOutput
284
  echo ' ';
285
  $this->make_info(
286
- esc_html( 'Learn more about this card.' ),
287
- esc_url( 'https://dev.twitter.com/cards/types/' . $name ),
288
- true
289
  );
290
  ?>
291
  </span>
@@ -299,8 +298,11 @@ switch ( $instance ) :
299
 
300
  <hr>
301
 
 
302
  <?php
303
- $this->description( __( 'When the following options are filled in, Twitter might link your Twitter Site or Author Profile when your post or page is shared.', 'autodescription' ) );
 
 
304
  ?>
305
 
306
  <p>
@@ -351,7 +353,7 @@ switch ( $instance ) :
351
  $this->make_checkbox(
352
  'oembed_remove_author',
353
  __( 'Remove author name?', 'autodescription' ),
354
- __( 'Discord shows the page author name above the sharing embed. Check this options if you find this undesirable.', 'autodescription' ),
355
  true
356
  ),
357
  true
154
  ?>
155
  <p>
156
  <label for="<?php $this->field_id( 'theme_color' ); ?>">
157
+ <strong><?php esc_html_e( 'Theme Color', 'autodescription' ); ?></strong>
158
  </label>
159
  </p>
160
  <p>
283
  echo $this->code_wrap( $name ); // phpcs:ignore, WordPress.Security.EscapeOutput
284
  echo ' ';
285
  $this->make_info(
286
+ __( 'Learn more about this card.', 'autodescription' ),
287
+ 'https://dev.twitter.com/cards/types/' . $name
 
288
  );
289
  ?>
290
  </span>
298
 
299
  <hr>
300
 
301
+ <h4><?php esc_html_e( 'Card and Content Attribution', 'autodescription' ); ?></h4>
302
  <?php
303
+ /* source: https://developer.twitter.com/en/docs/tweets/optimize-with-cards/guides/getting-started#attribution */
304
+ $this->description( __( 'Twitter claims users will be able to follow and view the profiles of attributed accounts directly from the card when these fields are filled in.', 'autodescription' ) );
305
+ $this->description( __( 'However, for now, these fields seem to have no discernible effect.', 'autodescription' ) );
306
  ?>
307
 
308
  <p>
353
  $this->make_checkbox(
354
  'oembed_remove_author',
355
  __( 'Remove author name?', 'autodescription' ),
356
+ __( "Discord shows the page author's name above the sharing embed. Check this option if you find this undesirable.", 'autodescription' ),
357
  true
358
  ),
359
  true
inc/views/admin/metaboxes/title-metabox.php CHANGED
@@ -99,8 +99,8 @@ switch ( $instance ) :
99
  ?>
100
  <h4><?php esc_html_e( 'Automated Title Settings', 'autodescription' ); ?></h4>
101
  <?php
102
- $this->description( 'A title is generated for every page.', 'autodescription' );
103
- $this->description( 'Some titles may have HTML tags inserted by the author for styling.', 'autodescription' );
104
 
105
  $info = $this->make_info(
106
  sprintf(
99
  ?>
100
  <h4><?php esc_html_e( 'Automated Title Settings', 'autodescription' ); ?></h4>
101
  <?php
102
+ $this->description( __( 'A title is generated for every page.', 'autodescription' ) );
103
+ $this->description( __( 'Some titles may have HTML tags inserted by the author for styling.', 'autodescription' ) );
104
 
105
  $info = $this->make_info(
106
  sprintf(
inc/views/admin/seo-settings-columns.php CHANGED
@@ -25,8 +25,7 @@ defined( 'THE_SEO_FRAMEWORK_PRESENT' ) and $_this = the_seo_framework_class() an
25
  \do_action( 'the_seo_framework_before_siteadmin_metaboxes_side', $this->seo_settings_page_hook );
26
 
27
  /**
28
- * @TODO fill this in
29
- * @priority low 2.9.0
30
  */
31
 
32
  \do_action( 'the_seo_framework_after_siteadmin_metaboxes_side', $this->seo_settings_page_hook );
25
  \do_action( 'the_seo_framework_before_siteadmin_metaboxes_side', $this->seo_settings_page_hook );
26
 
27
  /**
28
+ * @TODO fill this in...?
 
29
  */
30
 
31
  \do_action( 'the_seo_framework_after_siteadmin_metaboxes_side', $this->seo_settings_page_hook );
inc/views/debug/output.php CHANGED
@@ -25,8 +25,8 @@ $cache_key = $this->generate_cache_key( $id, $taxonomy );
25
 
26
  if ( is_admin() ) {
27
  $bstyle = \is_rtl()
28
- ? 'direction:ltr;color:#444;font-family:Georgio,sans-serif;font-size:14px;clear:both;float:left;position:relative;width:calc( 100% - 200px );min-height:700px;padding:0;margin:20px 180px 40px 20px;overflow:hidden;border:1px solid #ccc;border-radius:3px;line-height:18px'
29
- : 'direction:ltr;color:#444;font-family:Georgio,sans-serif;font-size:14px;clear:both;float:left;position:relative;width:calc( 100% - 200px );min-height:700px;padding:0;margin:20px 20px 40px 180px;overflow:hidden;border:1px solid #ccc;border-radius:3px;line-height:18px';
30
  ?>
31
  <div style="<?php echo $bstyle; ?>">
32
  <h3 style="font-size:14px;padding:0 12px;margin:0;line-height:39px;border-bottom:2px solid #aaa;position:absolute;z-index:9002;width:100%;right:0;left:0;top:0;background:#fff;border-radius:3px 3px 0 0;height:39px;">
@@ -53,7 +53,7 @@ if ( is_admin() ) {
53
  } else {
54
  ?>
55
  <style type="text/css">.wp-ui-notification{color:#fff;background-color:#d54e21}.code.highlight{font-family:Consolas,Monaco,monospace;font-size:14px;}.theseoframework-debug h3{font-size:18px;margin:18px 0}</style>
56
- <div class="theseoframework-debug" style="direction:ltr;color:#444;font-family:Georgio,sans-serif;font-size:14px;clear:both;float:left;position:relative;width:calc( 100% - 80px );min-height:700px;padding:0;margin:40px;overflow:hidden;border:1px solid #ccc;border-radius:3px;line-height:18px">
57
  <h3 style="font-size:14px;padding:0 12px;margin:0;line-height:39px;border-bottom:2px solid #aaa;position:absolute;z-index:9002;width:100%;right:0;left:0;top:0;background:#fff;border-radius:3px 3px 0 0;height:39px">
58
  SEO Debug Information
59
  <?php
25
 
26
  if ( is_admin() ) {
27
  $bstyle = \is_rtl()
28
+ ? 'direction:ltr;color:#444;font-family:Georgio,sans-serif;font-size:14px;clear:both;float:left;position:relative;width:calc( 100% - 200px );min-height:700px;padding:0;margin:20px 180px 40px 20px;overflow:hidden;border:1px solid #ccc;border-radius:3px;line-height:18pxfont-feature-settings:normal;font-variant:normal'
29
+ : 'direction:ltr;color:#444;font-family:Georgio,sans-serif;font-size:14px;clear:both;float:left;position:relative;width:calc( 100% - 200px );min-height:700px;padding:0;margin:20px 20px 40px 180px;overflow:hidden;border:1px solid #ccc;border-radius:3px;line-height:18pxfont-feature-settings:normal;font-variant:normal';
30
  ?>
31
  <div style="<?php echo $bstyle; ?>">
32
  <h3 style="font-size:14px;padding:0 12px;margin:0;line-height:39px;border-bottom:2px solid #aaa;position:absolute;z-index:9002;width:100%;right:0;left:0;top:0;background:#fff;border-radius:3px 3px 0 0;height:39px;">
53
  } else {
54
  ?>
55
  <style type="text/css">.wp-ui-notification{color:#fff;background-color:#d54e21}.code.highlight{font-family:Consolas,Monaco,monospace;font-size:14px;}.theseoframework-debug h3{font-size:18px;margin:18px 0}</style>
56
+ <div class="theseoframework-debug" style="direction:ltr;color:#444;font-family:Georgio,sans-serif;font-size:14px;clear:both;float:left;position:relative;width:calc( 100% - 80px );min-height:700px;padding:0;margin:40px;overflow:hidden;border:1px solid #ccc;border-radius:3px;line-height:18px;font-feature-settings:normal;font-variant:normal">
57
  <h3 style="font-size:14px;padding:0 12px;margin:0;line-height:39px;border-bottom:2px solid #aaa;position:absolute;z-index:9002;width:100%;right:0;left:0;top:0;background:#fff;border-radius:3px 3px 0 0;height:39px">
58
  SEO Debug Information
59
  <?php
inc/views/sitemap/xml-sitemap.php CHANGED
@@ -58,4 +58,6 @@ if ( $this->the_seo_framework_debug ) {
58
  echo "\n" . '<!-- System estimated peak usage: ' . number_format( memory_get_peak_usage( true ) / 1024 / 1024, 3 ) . ' MB -->';
59
  echo "\n" . '<!-- Freed memory prior to generation: ' . number_format( $this->clean_up_globals_for_sitemap( true ) / 1024, 3 ) . ' kB -->';
60
  echo "\n" . '<!-- Sitemap generation time: ' . number_format( microtime( true ) - $timer_start, 6 ) . ' seconds -->';
 
 
61
  }
58
  echo "\n" . '<!-- System estimated peak usage: ' . number_format( memory_get_peak_usage( true ) / 1024 / 1024, 3 ) . ' MB -->';
59
  echo "\n" . '<!-- Freed memory prior to generation: ' . number_format( $this->clean_up_globals_for_sitemap( true ) / 1024, 3 ) . ' kB -->';
60
  echo "\n" . '<!-- Sitemap generation time: ' . number_format( microtime( true ) - $timer_start, 6 ) . ' seconds -->';
61
+ echo "\n" . '<!-- Sitemap caching enabled: ' . ( $this->get_option( 'cache_sitemap' ) ? 'yes' : 'no' ) . ' -->';
62
+ echo "\n" . '<!-- Sitemap transient key: ' . \esc_html( $this->get_sitemap_transient_name() ) . ' -->';
63
  }
language/autodescription.pot CHANGED
@@ -1,46 +1,63 @@
1
- # Copyright (C) 2020 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 4.0.5\n"
6
- "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/autodescription\n"
7
- "POT-Creation-Date: 2020-03-04 04:17:22+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: 2020-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 = Version number, surrounded in markdown-backticks.
 
 
 
 
 
 
 
16
 
17
- #: bootstrap/upgrade.php:255
 
 
 
 
 
 
 
 
 
18
  msgid "Thank you for updating The SEO Framework! Your website has been upgraded successfully to use The SEO Framework at database version `%s`."
19
  msgstr ""
20
 
21
- #: bootstrap/upgrade.php:266
22
  msgid "Thank you for installing The SEO Framework! Your website is now optimized for search and social sharing, automatically. We hope you enjoy our free plugin. Good luck with your site!"
23
  msgstr ""
24
 
25
  #. translators: %s = Link, markdown.
26
-
27
- #: bootstrap/upgrade.php:275
28
  msgid "The SEO Framework only identifies itself rarely during plugin upgrades. We'd like to use this opportunity to highlight our [plugin setup guide](%s)."
29
  msgstr ""
30
 
31
- #: bootstrap/upgrade.php:421
32
  msgid "Twitter Photo Cards have been deprecated. Your site now uses Summary Cards when applicable."
33
  msgstr ""
34
 
35
- #: bootstrap/upgrade.php:451
36
  msgid "The previous sitemap timestamp settings have been converted into new global timestamp settings."
37
  msgstr ""
38
 
39
- #: bootstrap/upgrade.php:574
40
  msgid "A cronjob is now used to ping search engines, and it alerts them to changes in your sitemap."
41
  msgstr ""
42
 
43
- #: bootstrap/upgrade.php:589
44
  msgid "The positions in the \"Meta Title Additions Location\" setting for the homepage have been reversed, left to right, but the output has not been changed. If you must downgrade for some reason, remember to switch the location back again."
45
  msgstr ""
46
 
@@ -127,15 +144,10 @@ msgid "Good."
127
  msgstr ""
128
 
129
  #. translators: %s = Redirect URL markdown
130
-
131
- #: inc/classes/admin-init.class.php:435
132
  msgid "There has been an error redirecting. Refresh the page or follow [this link](%s)."
133
  msgstr ""
134
 
135
- #: inc/classes/admin-init.class.php:640 inc/classes/admin-init.class.php:701
136
- msgid "Image could not be processed."
137
- msgstr ""
138
-
139
  #: inc/classes/admin-pages.class.php:62
140
  msgid "SEO Settings"
141
  msgstr ""
@@ -189,7 +201,6 @@ msgid "Click to change the counter type"
189
  msgstr ""
190
 
191
  #. translators: %s = number
192
-
193
  #: inc/classes/admin-pages.class.php:1158
194
  msgid "Characters Used: %s"
195
  msgstr ""
@@ -204,7 +215,6 @@ msgid "The SEO Settings may take precedence over these settings."
204
  msgstr ""
205
 
206
  #. translators: %s = Post Type label
207
-
208
  #: inc/classes/bridges/postsettings.class.php:86
209
  msgid "%s SEO Settings"
210
  msgstr ""
@@ -217,25 +227,11 @@ msgstr ""
217
  msgid "Are you sure you want to reset all SEO settings to their defaults?"
218
  msgstr ""
219
 
220
- #: inc/classes/bridges/scripts.class.php:418
221
- #: inc/classes/bridges/scripts.class.php:487
222
- #: inc/classes/generate-title.class.php:1179
223
- msgid "Private: %s"
224
- msgstr ""
225
-
226
- #: inc/classes/bridges/scripts.class.php:420
227
- #: inc/classes/bridges/scripts.class.php:489
228
- #: inc/classes/generate-title.class.php:1164
229
- msgid "Protected: %s"
230
- msgstr ""
231
-
232
- #. translators: Taxonomy term archive title. 1: Taxonomy singular name, 2:
233
- #. Current taxonomy term
234
  #. translators: 1 = 'Assessment(s)', 2 = A list of assessments.
235
-
236
  #: inc/classes/bridges/scripts.class.php:541
237
- #: inc/classes/generate-title.class.php:769
238
- #: inc/classes/generate-title.class.php:836
239
  #: inc/classes/interpreters/seobar.class.php:342
240
  msgid "%1$s: %2$s"
241
  msgstr ""
@@ -280,25 +276,21 @@ msgid "Select Logo"
280
  msgstr ""
281
 
282
  #. translators: %s = term name
283
-
284
  #: inc/classes/bridges/scripts.class.php:897
285
  msgid "Select Primary %s"
286
  msgstr ""
287
 
288
  #. translators: %s = term name
289
-
290
  #: inc/classes/bridges/scripts.class.php:902
291
  msgid "Make primary %s"
292
  msgstr ""
293
 
294
  #. translators: %s = term name
295
-
296
  #: inc/classes/bridges/scripts.class.php:904
297
  msgid "Primary %s"
298
  msgstr ""
299
 
300
  #. translators: Pixel counter. 1: number (value), 2: number (guideline)
301
-
302
  #: inc/classes/bridges/scripts.class.php:999
303
  msgid "%1$d out of %2$d pixels are used."
304
  msgstr ""
@@ -346,9 +338,7 @@ msgstr ""
346
  msgid "Feed Settings"
347
  msgstr ""
348
 
349
- #. translators: 1 = An assessment, 2 = Disclaimer, e.g. "take it with a grain
350
- #. of salt"
351
-
352
  #: inc/classes/builders/seobar-page.class.php:149
353
  #: inc/classes/builders/seobar-page.class.php:364
354
  #: inc/classes/builders/seobar-term.class.php:164
@@ -369,7 +359,6 @@ msgid "No title could be fetched."
369
  msgstr ""
370
 
371
  #. translators: %s = "Untitled"
372
-
373
  #: inc/classes/builders/seobar-page.class.php:156
374
  #: inc/classes/builders/seobar-term.class.php:171
375
  msgid "No title could be fetched, \"%s\" is used instead."
@@ -501,7 +490,6 @@ msgid "It's built using the excerpt field."
501
  msgstr ""
502
 
503
  #. translators: %s = list of duplicated words
504
-
505
  #: inc/classes/builders/seobar-page.class.php:378
506
  #: inc/classes/builders/seobar-term.class.php:366
507
  msgid "Found duplicated words: %s"
@@ -567,7 +555,6 @@ msgid "The description inputted at the Edit Page screen is used."
567
  msgstr ""
568
 
569
  #. translators: 1: Word found, 2: Occurrences
570
-
571
  #: inc/classes/builders/seobar-page.class.php:493
572
  #: inc/classes/builders/seobar-term.class.php:463
573
  msgid "&#8220;%1$s&#8221; is used %2$d times."
@@ -651,10 +638,12 @@ msgstr ""
651
  #: inc/classes/builders/seobar-page.class.php:605
652
  #: inc/classes/builders/seobar-term.class.php:560
653
  #: inc/classes/builders/seobar-term.class.php:569
654
- #: inc/views/admin/metaboxes/robots-metabox.php:54
655
  #: inc/views/edit/seo-settings-singular.php:196
656
- #: inc/views/edit/seo-settings-tt.php:60 inc/views/list/bulk-post.php:19
657
- #: inc/views/list/quick-post.php:19 inc/views/list/quick-term.php:19
 
 
658
  msgid "Indexing"
659
  msgstr ""
660
 
@@ -723,7 +712,7 @@ msgstr ""
723
  #: inc/classes/builders/seobar-page.class.php:759
724
  #: inc/classes/builders/seobar-term.class.php:709
725
  #: inc/classes/builders/seobar-term.class.php:718
726
- #: inc/views/admin/metaboxes/robots-metabox.php:60
727
  #: inc/views/list/quick-term.php:26
728
  msgid "Following"
729
  msgstr ""
@@ -781,10 +770,12 @@ msgstr ""
781
  #: inc/classes/builders/seobar-page.class.php:890
782
  #: inc/classes/builders/seobar-term.class.php:829
783
  #: inc/classes/builders/seobar-term.class.php:838
784
- #: inc/views/admin/metaboxes/robots-metabox.php:66
785
  #: inc/views/edit/seo-settings-singular.php:212
786
- #: inc/views/edit/seo-settings-tt.php:86 inc/views/list/bulk-post.php:33
787
- #: inc/views/list/quick-post.php:33 inc/views/list/quick-term.php:33
 
 
788
  msgid "Archiving"
789
  msgstr ""
790
 
@@ -974,7 +965,6 @@ msgid "Term redirects visitors."
974
  msgstr ""
975
 
976
  #. translators: %s = timestamp
977
-
978
  #: inc/classes/builders/sitemap-base.class.php:73
979
  msgid "Sitemap is generated on %s"
980
  msgstr ""
@@ -984,13 +974,13 @@ msgid "Settings"
984
  msgstr ""
985
 
986
  #: inc/classes/core.class.php:227
987
- msgctxt "About us"
988
- msgid "About"
989
  msgstr ""
990
 
991
  #: inc/classes/core.class.php:232
992
- msgctxt "Plugin extensions"
993
- msgid "Extensions"
994
  msgstr ""
995
 
996
  #: inc/classes/core.class.php:265
@@ -1010,33 +1000,27 @@ msgctxt "Extension Manager is a product name; do not translate it."
1010
  msgid "Get Extension Manager"
1011
  msgstr ""
1012
 
1013
- #. translators: 1: Function name, 2: 'Deprecated', 3: Plugin Version
1014
- #. notification, 4: Replacement function
1015
-
1016
  #: inc/classes/debug.class.php:150
1017
  msgid "%1$s is %2$s since version %3$s of The SEO Framework! Use %4$s instead."
1018
  msgstr ""
1019
 
1020
- #: inc/classes/debug.class.php:152 inc/classes/debug.class.php:163
 
1021
  msgid "deprecated"
1022
  msgstr ""
1023
 
1024
- #. translators: 1: Function name, 2: 'Deprecated', 3: Plugin Version
1025
- #. notification
1026
-
1027
  #: inc/classes/debug.class.php:161
1028
  msgid "%1$s is %2$s since version %3$s of The SEO Framework with no alternative available."
1029
  msgstr ""
1030
 
1031
  #. translators: %s = Version number
1032
-
1033
  #: inc/classes/debug.class.php:212
1034
  msgid "(This message was added in version %s of The SEO Framework.)"
1035
  msgstr ""
1036
 
1037
- #. translators: 1: Function name, 2: 'Incorrectly', 3: Error message 4: Plugin
1038
- #. Version notification
1039
-
1040
  #: inc/classes/debug.class.php:216
1041
  msgid "%1$s was called %2$s. %3$s %4$s"
1042
  msgstr ""
@@ -1046,8 +1030,7 @@ msgid "incorrectly"
1046
  msgstr ""
1047
 
1048
  #. translators: 1: Method or Property name, 2: Message
1049
-
1050
- #: inc/classes/debug.class.php:267
1051
  msgid "%1$s is not accessible. %2$s"
1052
  msgstr ""
1053
 
@@ -1057,159 +1040,30 @@ msgid "Source"
1057
  msgstr ""
1058
 
1059
  #. translators: %s = Blog page title. Front-end output.
1060
-
1061
- #: inc/classes/generate-description.class.php:705
1062
  msgid "Latest posts: %s"
1063
  msgstr ""
1064
 
1065
- #: inc/classes/generate-description.class.php:714
1066
  msgctxt "Placement. e.g. Post Title \"on\" Blog Name"
1067
  msgid "on"
1068
  msgstr ""
1069
 
1070
  #. translators: 1: Title, 2: on, 3: Blogname
1071
  #. translators: 1: Option label, 2: [?] option info note, 3: Optional warning
1072
-
1073
- #: inc/classes/generate-description.class.php:718
1074
  #: inc/views/admin/metaboxes/homepage-metabox.php:434
1075
  #: inc/views/admin/metaboxes/homepage-metabox.php:450
1076
  #: inc/views/admin/metaboxes/homepage-metabox.php:466
1077
  msgid "%1$s %2$s %3$s"
1078
  msgstr ""
1079
 
1080
- #. translators: Category archive title. 1: Category name
1081
-
1082
- #: inc/classes/generate-title.class.php:758
1083
- #: inc/classes/generate-title.class.php:783
1084
- msgid "Category: %s"
1085
- msgstr ""
1086
-
1087
- #. translators: Tag archive title. 1: Tag name
1088
-
1089
- #: inc/classes/generate-title.class.php:762
1090
- #: inc/classes/generate-title.class.php:787
1091
- msgid "Tag: %s"
1092
- msgstr ""
1093
-
1094
- #. translators: Author archive title. 1: Author name
1095
-
1096
- #: inc/classes/generate-title.class.php:775
1097
- #: inc/classes/generate-title.class.php:791
1098
- msgid "Author: %s"
1099
- msgstr ""
1100
-
1101
- #: inc/classes/generate-title.class.php:777
1102
- #: inc/classes/generate-title.class.php:839
1103
- msgid "Archives"
1104
- msgstr ""
1105
-
1106
- #: inc/classes/generate-title.class.php:794
1107
- msgctxt "yearly archives date format"
1108
- msgid "Y"
1109
- msgstr ""
1110
-
1111
- #. translators: Yearly archive title. 1: Year
1112
-
1113
- #: inc/classes/generate-title.class.php:796
1114
- msgid "Year: %s"
1115
- msgstr ""
1116
-
1117
- #: inc/classes/generate-title.class.php:798
1118
- msgctxt "monthly archives date format"
1119
- msgid "F Y"
1120
- msgstr ""
1121
-
1122
- #. translators: Monthly archive title. 1: Month name and year
1123
-
1124
- #: inc/classes/generate-title.class.php:800
1125
- msgid "Month: %s"
1126
- msgstr ""
1127
-
1128
- #: inc/classes/generate-title.class.php:802
1129
- msgctxt "daily archives date format"
1130
- msgid "F j, Y"
1131
- msgstr ""
1132
-
1133
- #. translators: Daily archive title. 1: Date
1134
-
1135
- #: inc/classes/generate-title.class.php:804
1136
- msgid "Day: %s"
1137
- msgstr ""
1138
-
1139
- #: inc/classes/generate-title.class.php:808
1140
- msgctxt "post format archive title"
1141
- msgid "Asides"
1142
- msgstr ""
1143
-
1144
- #: inc/classes/generate-title.class.php:810
1145
- msgctxt "post format archive title"
1146
- msgid "Galleries"
1147
- msgstr ""
1148
-
1149
- #: inc/classes/generate-title.class.php:812
1150
- msgctxt "post format archive title"
1151
- msgid "Images"
1152
- msgstr ""
1153
-
1154
- #: inc/classes/generate-title.class.php:814
1155
- msgctxt "post format archive title"
1156
- msgid "Videos"
1157
- msgstr ""
1158
-
1159
- #: inc/classes/generate-title.class.php:816
1160
- msgctxt "post format archive title"
1161
- msgid "Quotes"
1162
- msgstr ""
1163
-
1164
- #: inc/classes/generate-title.class.php:818
1165
- msgctxt "post format archive title"
1166
- msgid "Links"
1167
- msgstr ""
1168
-
1169
- #: inc/classes/generate-title.class.php:820
1170
- msgctxt "post format archive title"
1171
- msgid "Statuses"
1172
- msgstr ""
1173
-
1174
- #: inc/classes/generate-title.class.php:822
1175
- msgctxt "post format archive title"
1176
- msgid "Audio"
1177
- msgstr ""
1178
-
1179
- #: inc/classes/generate-title.class.php:824
1180
- msgctxt "post format archive title"
1181
- msgid "Chats"
1182
- msgstr ""
1183
-
1184
- #. translators: Post type archive title. 1: Post type name
1185
-
1186
- #: inc/classes/generate-title.class.php:829
1187
- msgid "Archives: %s"
1188
- msgstr ""
1189
-
1190
- #: inc/classes/generate-title.class.php:986
1191
- msgid "Untitled"
1192
- msgstr ""
1193
-
1194
- #. translators: %s: search phrase
1195
-
1196
- #: inc/classes/generate-title.class.php:998
1197
- msgid "Search Results for &#8220;%s&#8221;"
1198
- msgstr ""
1199
-
1200
- #: inc/classes/generate-title.class.php:1113
1201
- msgid "Page %s"
1202
- msgstr ""
1203
-
1204
  #. translators: 1 = SEO Bar type title, 2 = Status reason. 3 = Assessments
1205
-
1206
  #: inc/classes/interpreters/seobar.class.php:292
1207
  msgid "%1$s: %2$s %3$s"
1208
  msgstr ""
1209
 
1210
- #. translators: 1 = Assessment number (mind the %d (D)), 2 = Assessment
1211
- #. explanation
1212
-
1213
  #: inc/classes/interpreters/seobar.class.php:340
1214
  msgid "%1$d: %2$s"
1215
  msgstr ""
@@ -1314,7 +1168,6 @@ msgid "If this site publishes podcasts, enable this option. Otherwise, leave it
1314
  msgstr ""
1315
 
1316
  #. translators: %s = Reading Settings URL. Links are in Markdown!
1317
-
1318
  #: inc/views/admin/metaboxes/feed-metabox.php:48
1319
  msgid "Note: The feed is already converted into an excerpt through the [Reading Settings](%s)."
1320
  msgstr ""
@@ -1511,7 +1364,6 @@ msgid "Preferred canonical URL scheme:"
1511
  msgstr ""
1512
 
1513
  #. translators: %s = HTTP or HTTPS
1514
-
1515
  #: inc/views/admin/metaboxes/general-metabox.php:302
1516
  msgid "Detect automatically (%s)"
1517
  msgstr ""
@@ -1529,19 +1381,16 @@ msgid "It's recommended to turn these options on for better SEO consistency and
1529
  msgstr ""
1530
 
1531
  #. translators: the backticks are Markdown! Preserve them as-is!
1532
-
1533
  #: inc/views/admin/metaboxes/general-metabox.php:325
1534
  msgid "Add `rel` link tags to posts and pages?"
1535
  msgstr ""
1536
 
1537
  #. translators: the backticks are Markdown! Preserve them as-is!
1538
-
1539
  #: inc/views/admin/metaboxes/general-metabox.php:336
1540
  msgid "Add `rel` link tags to archives?"
1541
  msgstr ""
1542
 
1543
  #. translators: the backticks are Markdown! Preserve them as-is!
1544
-
1545
  #: inc/views/admin/metaboxes/general-metabox.php:347
1546
  msgid "Add `rel` link tags to the homepage?"
1547
  msgstr ""
@@ -1571,7 +1420,7 @@ msgid "This outputs the complete date including hours, minutes, and timezone."
1571
  msgstr ""
1572
 
1573
  #: inc/views/admin/metaboxes/general-metabox.php:420
1574
- #: inc/views/admin/metaboxes/robots-metabox.php:319
1575
  msgid "Post Type Settings"
1576
  msgstr ""
1577
 
@@ -1592,7 +1441,7 @@ msgid "Disabling SEO allows search engines to crawl the post type without restri
1592
  msgstr ""
1593
 
1594
  #: inc/views/admin/metaboxes/general-metabox.php:431
1595
- #: inc/views/admin/metaboxes/robots-metabox.php:321
1596
  msgid "These settings are applied to the post type pages and their terms. When terms are shared between post types, all their post types should be checked for this to have an effect."
1597
  msgstr ""
1598
 
@@ -1605,7 +1454,7 @@ msgid "These settings will take precedence over the settings set within the home
1605
  msgstr ""
1606
 
1607
  #: inc/views/admin/metaboxes/homepage-metabox.php:32
1608
- #: inc/views/admin/metaboxes/robots-metabox.php:48
1609
  #: inc/views/admin/metaboxes/sitemaps-metabox.php:20
1610
  #: inc/views/admin/metaboxes/social-metabox.php:20
1611
  #: inc/views/admin/metaboxes/title-metabox.php:57
@@ -1650,7 +1499,6 @@ msgid "Note: The title placeholder is fetched from the Page SEO Settings on the
1650
  msgstr ""
1651
 
1652
  #. translators: %s = Homepage URL markdown
1653
-
1654
  #: inc/views/admin/metaboxes/homepage-metabox.php:127
1655
  #: inc/views/admin/metaboxes/homepage-metabox.php:177
1656
  msgid "A plugin has been detected that suggests to maintain this option on the [homepage](%s)."
@@ -1745,7 +1593,6 @@ msgid "Overwritten by page settings"
1745
  msgstr ""
1746
 
1747
  #. translators: the backticks are Markdown! Preserve them as-is!
1748
-
1749
  #: inc/views/admin/metaboxes/homepage-metabox.php:437
1750
  msgid "Apply `noindex` to the homepage?"
1751
  msgstr ""
@@ -1755,7 +1602,6 @@ msgid "This tells search engines not to show this page in their search results."
1755
  msgstr ""
1756
 
1757
  #. translators: the backticks are Markdown! Preserve them as-is!
1758
-
1759
  #: inc/views/admin/metaboxes/homepage-metabox.php:453
1760
  msgid "Apply `nofollow` to the homepage?"
1761
  msgstr ""
@@ -1765,7 +1611,6 @@ msgid "This tells search engines not to follow links on this page."
1765
  msgstr ""
1766
 
1767
  #. translators: the backticks are Markdown! Preserve them as-is!
1768
-
1769
  #: inc/views/admin/metaboxes/homepage-metabox.php:469
1770
  msgid "Apply `noarchive` to the homepage?"
1771
  msgstr ""
@@ -1780,7 +1625,6 @@ msgid "Warning: No public site should ever apply \"noindex\" or \"nofollow\" to
1780
  msgstr ""
1781
 
1782
  #. translators: %s = Homepage URL markdown
1783
-
1784
  #: inc/views/admin/metaboxes/homepage-metabox.php:511
1785
  msgid "Note: These options may be overwritten by the [page settings](%s)."
1786
  msgstr ""
@@ -1794,187 +1638,181 @@ msgid "If your homepage is paginated and outputs content that's also found elsew
1794
  msgstr ""
1795
 
1796
  #. translators: the backticks are Markdown! Preserve them as-is!
1797
-
1798
  #: inc/views/admin/metaboxes/homepage-metabox.php:533
1799
  msgid "Apply `noindex` to every second or later page on the homepage?"
1800
  msgstr ""
1801
 
1802
- #: inc/views/admin/metaboxes/robots-metabox.php:20
1803
  msgid "Category archives"
1804
  msgstr ""
1805
 
1806
- #: inc/views/admin/metaboxes/robots-metabox.php:21
1807
  msgid "Tag archives"
1808
  msgstr ""
1809
 
1810
- #: inc/views/admin/metaboxes/robots-metabox.php:22
1811
  msgid "Author pages"
1812
  msgstr ""
1813
 
1814
- #: inc/views/admin/metaboxes/robots-metabox.php:23
1815
  msgid "Date archives"
1816
  msgstr ""
1817
 
1818
- #: inc/views/admin/metaboxes/robots-metabox.php:24
1819
  msgid "Search pages"
1820
  msgstr ""
1821
 
1822
- #: inc/views/admin/metaboxes/robots-metabox.php:25
1823
  msgctxt "...for the entire site"
1824
  msgid "the entire site"
1825
  msgstr ""
1826
 
1827
- #: inc/views/admin/metaboxes/robots-metabox.php:34
1828
  msgid "These options most likely prevent indexing of the selected archives and pages. If you enable this, the selected archives or pages will urge to be removed from search engine results pages."
1829
  msgstr ""
1830
 
1831
- #: inc/views/admin/metaboxes/robots-metabox.php:38
1832
  msgid "These options most likely prevent links from being followed on the selected archives and pages. If you enable this, the selected archives or pages in-page links will gain no SEO value, including your internal links."
1833
  msgstr ""
1834
 
1835
- #: inc/views/admin/metaboxes/robots-metabox.php:42
1836
  msgid "These options most likely prevent caching of the selected archives and pages. If you enable this, bots are urged not create a cached copy of the selected archives or pages."
1837
  msgstr ""
1838
 
1839
- #: inc/views/admin/metaboxes/robots-metabox.php:87
1840
  msgid "Advanced Query Protection"
1841
  msgstr ""
1842
 
1843
- #: inc/views/admin/metaboxes/robots-metabox.php:89
1844
  msgid "Some URL queries can cause WordPress to show faux archives. When search engines spot these, they will crawl and index them, which may cause a drop in ranking. Advanced query protection will prevent robots from indexing these archives."
1845
  msgstr ""
1846
 
1847
- #: inc/views/admin/metaboxes/robots-metabox.php:94
1848
  msgid "Enable advanced query protection?"
1849
  msgstr ""
1850
 
1851
- #: inc/views/admin/metaboxes/robots-metabox.php:103
1852
  msgid "Paginated Archive Settings"
1853
  msgstr ""
1854
 
1855
- #: inc/views/admin/metaboxes/robots-metabox.php:105
1856
  msgid "Indexing the second or later page of any archive might cause duplication errors. Search engines look down upon them; therefore, it's recommended to disable indexing of those pages."
1857
  msgstr ""
1858
 
1859
  #. translators: the backticks are Markdown! Preserve them as-is!
1860
-
1861
- #: inc/views/admin/metaboxes/robots-metabox.php:112
1862
  msgid "Apply `noindex` to every second or later archive page?"
1863
  msgstr ""
1864
 
1865
- #: inc/views/admin/metaboxes/robots-metabox.php:123
1866
  msgid "Copyright Directive Settings"
1867
  msgstr ""
1868
 
1869
- #: inc/views/admin/metaboxes/robots-metabox.php:125
1870
  msgid "Some search engines allow you to control copyright directives on the content they aggregate. It's best to allow some content to be taken by these aggregators, as that can improve contextualized exposure via snippets and previews. When left unspecified, regional regulations may apply. It is up to the aggregator to honor these requests."
1871
  msgstr ""
1872
 
1873
- #: inc/views/admin/metaboxes/robots-metabox.php:130
1874
  msgid "Specify aggregator copyright compliance directives?"
1875
  msgstr ""
1876
 
1877
- #: inc/views/admin/metaboxes/robots-metabox.php:138
1878
  msgid "Unlimited"
1879
  msgstr ""
1880
 
1881
- #: inc/views/admin/metaboxes/robots-metabox.php:139
1882
  msgctxt "quanity: zero"
1883
  msgid "None, disallow snippet"
1884
  msgstr ""
1885
 
1886
  #. translators: %d = number
1887
-
1888
- #: inc/views/admin/metaboxes/robots-metabox.php:143
1889
  msgid "%d character"
1890
  msgid_plural "%d characters"
1891
  msgstr[0] ""
1892
  msgstr[1] ""
1893
 
1894
- #: inc/views/admin/metaboxes/robots-metabox.php:149
1895
- #: inc/views/admin/metaboxes/robots-metabox.php:235
1896
  msgid "Standard directive"
1897
  msgstr ""
1898
 
1899
- #: inc/views/admin/metaboxes/robots-metabox.php:150
1900
- #: inc/views/admin/metaboxes/robots-metabox.php:236
1901
  msgid "Granular directive"
1902
  msgstr ""
1903
 
1904
- #: inc/views/admin/metaboxes/robots-metabox.php:173
1905
  msgid "Maximum text snippet length"
1906
  msgstr ""
1907
 
1908
- #: inc/views/admin/metaboxes/robots-metabox.php:177
1909
  msgid "This may limit the text snippet length for all pages on this site."
1910
  msgstr ""
1911
 
1912
- #: inc/views/admin/metaboxes/robots-metabox.php:181
1913
  msgid "This directive also imposes a limit on meta descriptions and structured data, which unintentionally restricts the amount of information you can share. Therefore, it's best to use at least a 320 character limit."
1914
  msgstr ""
1915
 
1916
- #: inc/views/admin/metaboxes/robots-metabox.php:190
1917
  msgctxt "quanity: zero"
1918
  msgid "None, disallow preview"
1919
  msgstr ""
1920
 
1921
- #: inc/views/admin/metaboxes/robots-metabox.php:191
1922
  msgid "Thumbnail or standard size"
1923
  msgstr ""
1924
 
1925
- #: inc/views/admin/metaboxes/robots-metabox.php:192
1926
  msgid "Large or full size"
1927
  msgstr ""
1928
 
1929
- #: inc/views/admin/metaboxes/robots-metabox.php:210
1930
  msgid "Maximum image preview size"
1931
  msgstr ""
1932
 
1933
- #: inc/views/admin/metaboxes/robots-metabox.php:214
1934
  msgid "This may limit the image preview size for all images from this site."
1935
  msgstr ""
1936
 
1937
- #: inc/views/admin/metaboxes/robots-metabox.php:224
1938
  msgid "Full video preview"
1939
  msgstr ""
1940
 
1941
- #: inc/views/admin/metaboxes/robots-metabox.php:225
1942
  msgctxt "quanity: zero"
1943
  msgid "None, still image only"
1944
  msgstr ""
1945
 
1946
  #. translators: %d = number
1947
-
1948
- #: inc/views/admin/metaboxes/robots-metabox.php:229
1949
  msgid "%d second"
1950
  msgid_plural "%d seconds"
1951
  msgstr[0] ""
1952
  msgstr[1] ""
1953
 
1954
- #: inc/views/admin/metaboxes/robots-metabox.php:258
1955
  msgid "Maximum video preview length"
1956
  msgstr ""
1957
 
1958
- #: inc/views/admin/metaboxes/robots-metabox.php:262
1959
  msgid "This may limit the video preview length for all videos on this site."
1960
  msgstr ""
1961
 
1962
- #. translators: 1 = noindex/nofollow/noarchive, 2 = Post, Post type, Category
1963
- #. archives, the entire site, etc.
1964
-
1965
- #: inc/views/admin/metaboxes/robots-metabox.php:277
1966
  msgid "Apply %1$s to %2$s?"
1967
  msgstr ""
1968
 
1969
- #: inc/views/admin/metaboxes/robots-metabox.php:282
1970
  msgid "Robots Settings"
1971
  msgstr ""
1972
 
1973
- #: inc/views/admin/metaboxes/robots-metabox.php:307
1974
  msgid "Warning: No public site should ever enable this option."
1975
  msgstr ""
1976
 
1977
- #: inc/views/admin/metaboxes/robots-metabox.php:326
1978
  msgid "Warning: No site should enable these options for Posts and Pages."
1979
  msgstr ""
1980
 
@@ -2163,7 +2001,6 @@ msgid "These settings do not affect sharing behavior with the social networks."
2163
  msgstr ""
2164
 
2165
  #. translators: %s = Learn more URL. Markdown!
2166
-
2167
  #: inc/views/admin/metaboxes/schema-metabox.php:289
2168
  msgid "These settings are marked for removal. When you clear a field, it will be hidden forever. [Learn more](%s)."
2169
  msgstr ""
@@ -2245,9 +2082,7 @@ msgstr ""
2245
  msgid "Note: You're using the plain permalink structure; so, no robots.txt file can be generated."
2246
  msgstr ""
2247
 
2248
- #. translators: 1 = Link to settings, Markdown. 2 = example input, also
2249
- #. markdown! Preserve the Markdown as-is!
2250
-
2251
  #: inc/views/admin/metaboxes/sitemaps-metabox.php:158
2252
  msgid "Change your [Permalink Settings](%1$s). Recommended structure: `%2$s`."
2253
  msgstr ""
@@ -2285,7 +2120,6 @@ msgid "The modified time suggests to search engines where to look for content ch
2285
  msgstr ""
2286
 
2287
  #. translators: the backticks are Markdown! Preserve them as-is!
2288
-
2289
  #: inc/views/admin/metaboxes/sitemaps-metabox.php:216
2290
  msgid "Add `<lastmod>` to the sitemap?"
2291
  msgstr ""
@@ -2299,7 +2133,6 @@ msgid "The priority index suggests to search engines which pages are deemed more
2299
  msgstr ""
2300
 
2301
  #. translators: the backticks are Markdown! Preserve them as-is!
2302
-
2303
  #: inc/views/admin/metaboxes/sitemaps-metabox.php:238
2304
  msgid "Add `<priority>` to the sitemap?"
2305
  msgstr ""
@@ -2329,7 +2162,6 @@ msgid "Notify Search Engines"
2329
  msgstr ""
2330
 
2331
  #. translators: %s = Google
2332
-
2333
  #: inc/views/admin/metaboxes/sitemaps-metabox.php:285
2334
  msgid "Notify %s about sitemap changes?"
2335
  msgstr ""
@@ -2459,7 +2291,7 @@ msgid "Discord styles embeds with the theme color. The theme color can also affe
2459
  msgstr ""
2460
 
2461
  #: inc/views/admin/metaboxes/social-metabox.php:157
2462
- msgid "Theme color"
2463
  msgstr ""
2464
 
2465
  #: inc/views/admin/metaboxes/social-metabox.php:165
@@ -2516,7 +2348,7 @@ msgid "Your Facebook profile."
2516
  msgstr ""
2517
 
2518
  #: inc/views/admin/metaboxes/social-metabox.php:242
2519
- #: inc/views/admin/metaboxes/social-metabox.php:334
2520
  msgid "Authors can override this option on their profile page."
2521
  msgstr ""
2522
 
@@ -2541,60 +2373,70 @@ msgstr ""
2541
  msgid "The Twitter Card type may have the image highlighted, either small at the side or large above."
2542
  msgstr ""
2543
 
2544
- #: inc/views/admin/metaboxes/social-metabox.php:303
2545
- msgid "When the following options are filled in, Twitter might link your Twitter Site or Author Profile when your post or page is shared."
 
 
 
 
2546
  msgstr ""
2547
 
2548
- #: inc/views/admin/metaboxes/social-metabox.php:308
 
 
 
 
 
 
 
 
2549
  msgid "Website Twitter Profile"
2550
  msgstr ""
2551
 
2552
- #: inc/views/admin/metaboxes/social-metabox.php:312
2553
- #: inc/views/admin/metaboxes/social-metabox.php:328
2554
  msgid "Find your @username."
2555
  msgstr ""
2556
 
2557
- #: inc/views/admin/metaboxes/social-metabox.php:324
2558
  msgid "Twitter Author Fallback Profile"
2559
  msgstr ""
2560
 
2561
- #: inc/views/admin/metaboxes/social-metabox.php:343
2562
  msgid "oEmbed Settings"
2563
  msgstr ""
2564
 
2565
- #: inc/views/admin/metaboxes/social-metabox.php:345
2566
  msgid "Some social sharing services and clients, like WordPress and Discord, obtain the linked page information via oEmbed."
2567
  msgstr ""
2568
 
2569
- #: inc/views/admin/metaboxes/social-metabox.php:353
2570
  msgid "Remove author name?"
2571
  msgstr ""
2572
 
2573
- #: inc/views/admin/metaboxes/social-metabox.php:354
2574
- msgid "Discord shows the page author name above the sharing embed. Check this options if you find this undesirable."
2575
  msgstr ""
2576
 
2577
- #: inc/views/admin/metaboxes/social-metabox.php:362
2578
  msgid "Posts"
2579
  msgstr ""
2580
 
2581
- #: inc/views/admin/metaboxes/social-metabox.php:365
2582
  msgid "Post Date Settings"
2583
  msgstr ""
2584
 
2585
- #: inc/views/admin/metaboxes/social-metabox.php:367
2586
  msgid "Some social sites output the shared post's publishing and modified data in the sharing snippet."
2587
  msgstr ""
2588
 
2589
  #. translators: the backticks are Markdown! Preserve them as-is!
2590
-
2591
- #: inc/views/admin/metaboxes/social-metabox.php:378
2592
  msgid "Add `article:published_time` to posts?"
2593
  msgstr ""
2594
 
2595
  #. translators: the backticks are Markdown! Preserve them as-is!
2596
-
2597
- #: inc/views/admin/metaboxes/social-metabox.php:388
2598
  msgid "Add `article:modified_time` to posts?"
2599
  msgstr ""
2600
 
@@ -2619,8 +2461,15 @@ msgstr ""
2619
  msgid "Prefixes"
2620
  msgstr ""
2621
 
2622
- #. translators: %s = HTML tag example
 
 
2623
 
 
 
 
 
 
2624
  #: inc/views/admin/metaboxes/title-metabox.php:108
2625
  msgid "This strips HTML tags, like %s, from the title."
2626
  msgstr ""
@@ -2665,10 +2514,6 @@ msgstr ""
2665
  msgid "Note: Only use this option if you are aware of its SEO effects."
2666
  msgstr ""
2667
 
2668
- #: inc/views/admin/metaboxes/title-metabox.php:207
2669
- msgid "Category"
2670
- msgstr ""
2671
-
2672
  #: inc/views/admin/metaboxes/title-metabox.php:226
2673
  msgid "Example Category"
2674
  msgstr ""
@@ -2722,7 +2567,6 @@ msgid "Get the Yandex verification code."
2722
  msgstr ""
2723
 
2724
  #. translators: literal translation from '百度搜索资源平台'-Code
2725
-
2726
  #: inc/views/admin/metaboxes/webmaster-metabox.php:57
2727
  msgid "Baidu Search Resource Platform Code"
2728
  msgstr ""
@@ -2786,13 +2630,15 @@ msgid "Use this when you want to rearrange the title parts manually."
2786
  msgstr ""
2787
 
2788
  #: inc/views/edit/seo-settings-singular.php:204
2789
- #: inc/views/edit/seo-settings-tt.php:73 inc/views/list/bulk-post.php:26
 
2790
  #: inc/views/list/quick-post.php:26
2791
  msgid "Link following"
2792
  msgstr ""
2793
 
2794
  #: inc/views/edit/seo-settings-singular.php:222
2795
- #: inc/views/edit/seo-settings-tt.php:279 inc/views/list/quick-post.php:57
 
2796
  #: inc/views/list/quick-term.php:57
2797
  msgid "Canonical URL"
2798
  msgstr ""
@@ -2811,9 +2657,9 @@ msgid "Note: A non-default selection will overwrite the global homepage settings
2811
  msgstr ""
2812
 
2813
  #. translators: %s = default option value
2814
-
2815
  #: inc/views/edit/seo-settings-singular.php:289
2816
- #: inc/views/edit/seo-settings-tt.php:316 inc/views/list/quick-post.php:74
 
2817
  #: inc/views/list/quick-term.php:74
2818
  msgid "Default (%s)"
2819
  msgstr ""
@@ -2831,7 +2677,8 @@ msgid "Exclude this page from all archive queries on this site."
2831
  msgstr ""
2832
 
2833
  #: inc/views/edit/seo-settings-singular.php:347
2834
- #: inc/views/edit/seo-settings-tt.php:332 inc/views/list/quick-post.php:87
 
2835
  #: inc/views/list/quick-term.php:87
2836
  msgid "301 Redirect URL"
2837
  msgstr ""
@@ -2861,8 +2708,10 @@ msgstr ""
2861
  msgid "Social SEO Settings"
2862
  msgstr ""
2863
 
2864
- #: inc/views/edit/seo-settings-tt.php:272 inc/views/list/bulk-post.php:54
2865
- #: inc/views/list/quick-post.php:54 inc/views/list/quick-term.php:54
 
 
2866
  msgid "Visibility SEO Settings"
2867
  msgstr ""
2868
 
@@ -2870,10 +2719,6 @@ msgstr ""
2870
  msgid "These directives may urge robots not to display, follow links on, or create a cached copy of this term."
2871
  msgstr ""
2872
 
2873
- #: inc/views/list/bulk-post.php:67
2874
- msgid "&mdash; No Change &mdash;"
2875
- msgstr ""
2876
-
2877
  #: inc/views/list/bulk-post.php:68
2878
  msgid "Default (unknown)"
2879
  msgstr ""
@@ -2900,13 +2745,11 @@ msgid "XML Sitemap"
2900
  msgstr ""
2901
 
2902
  #. translators: URLs are in Markdown. Don't forget to localize the URLs.
2903
-
2904
  #: inc/views/sitemap/xsl-stylesheet.php:244
2905
  msgid "This is a generated XML Sitemap, meant to be consumed by search engines like [Google](https://www.google.com/) or [Bing](https://www.bing.com/)."
2906
  msgstr ""
2907
 
2908
  #. translators: URLs are in Markdown. Don't localize this URL.
2909
-
2910
  #: inc/views/sitemap/xsl-stylesheet.php:264
2911
  msgid "You can find more information on XML sitemaps at [sitemaps.org](https://www.sitemaps.org/)."
2912
  msgstr ""
@@ -2924,13 +2767,11 @@ msgid "Priority"
2924
  msgstr ""
2925
 
2926
  #. translators: URLs are in Markdown.
2927
-
2928
  #: inc/views/sitemap/xsl-stylesheet.php:366
2929
  msgid "Generated by [The SEO Framework](https://theseoframework.com/)"
2930
  msgstr ""
2931
 
2932
  #. translators: %s = term name
2933
-
2934
  #: inc/views/templates/inpost/primary-term-selector.php:28
2935
  msgid "The buttons below are for primary %s selection."
2936
  msgstr ""
@@ -2938,22 +2779,3 @@ msgstr ""
2938
  #: inc/views/templates/settings/settings.php:14
2939
  msgid "This post type is disabled, so this option won't work."
2940
  msgstr ""
2941
- #. Plugin Name of the plugin/theme
2942
- msgid "The SEO Framework"
2943
- msgstr ""
2944
-
2945
- #. Plugin URI of the plugin/theme
2946
- msgid "https://theseoframework.com/"
2947
- msgstr ""
2948
-
2949
- #. Description of the plugin/theme
2950
- msgid "An automated, advanced, accessible, unbranded and extremely fast SEO solution for your WordPress website."
2951
- msgstr ""
2952
-
2953
- #. Author of the plugin/theme
2954
- msgid "The SEO Framework Team"
2955
- msgstr ""
2956
-
2957
- #. Author URI of the plugin/theme
2958
- msgid "https://theseoframework.com/"
2959
- msgstr ""
1
+ # Copyright (C) 2020 The SEO Framework Team
2
+ # This file is distributed under the same license as the The SEO Framework plugin.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: The SEO Framework 4.0.6\n"
6
+ "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/trunk\n"
7
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
8
+ "Language-Team: LANGUAGE <LL@li.org>\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
+ "POT-Creation-Date: 2020-04-28T14:51:39+02:00\n"
13
+ "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
+ "X-Generator: WP-CLI 2.4.0\n"
15
+ "X-Domain: autodescription\n"
16
 
17
+ #. Plugin Name of the plugin
18
+ msgid "The SEO Framework"
19
+ msgstr ""
20
+
21
+ #. Plugin URI of the plugin
22
+ #. Author URI of the plugin
23
+ msgid "https://theseoframework.com/"
24
+ msgstr ""
25
 
26
+ #. Description of the plugin
27
+ msgid "An automated, advanced, accessible, unbranded and extremely fast SEO solution for your WordPress website."
28
+ msgstr ""
29
+
30
+ #. Author of the plugin
31
+ msgid "The SEO Framework Team"
32
+ msgstr ""
33
+
34
+ #. translators: %s = Version number, surrounded in markdown-backticks.
35
+ #: bootstrap/upgrade.php:259
36
  msgid "Thank you for updating The SEO Framework! Your website has been upgraded successfully to use The SEO Framework at database version `%s`."
37
  msgstr ""
38
 
39
+ #: bootstrap/upgrade.php:270
40
  msgid "Thank you for installing The SEO Framework! Your website is now optimized for search and social sharing, automatically. We hope you enjoy our free plugin. Good luck with your site!"
41
  msgstr ""
42
 
43
  #. translators: %s = Link, markdown.
44
+ #: bootstrap/upgrade.php:279
 
45
  msgid "The SEO Framework only identifies itself rarely during plugin upgrades. We'd like to use this opportunity to highlight our [plugin setup guide](%s)."
46
  msgstr ""
47
 
48
+ #: bootstrap/upgrade.php:425
49
  msgid "Twitter Photo Cards have been deprecated. Your site now uses Summary Cards when applicable."
50
  msgstr ""
51
 
52
+ #: bootstrap/upgrade.php:455
53
  msgid "The previous sitemap timestamp settings have been converted into new global timestamp settings."
54
  msgstr ""
55
 
56
+ #: bootstrap/upgrade.php:578
57
  msgid "A cronjob is now used to ping search engines, and it alerts them to changes in your sitemap."
58
  msgstr ""
59
 
60
+ #: bootstrap/upgrade.php:593
61
  msgid "The positions in the \"Meta Title Additions Location\" setting for the homepage have been reversed, left to right, but the output has not been changed. If you must downgrade for some reason, remember to switch the location back again."
62
  msgstr ""
63
 
144
  msgstr ""
145
 
146
  #. translators: %s = Redirect URL markdown
147
+ #: inc/classes/admin-init.class.php:437
 
148
  msgid "There has been an error redirecting. Refresh the page or follow [this link](%s)."
149
  msgstr ""
150
 
 
 
 
 
151
  #: inc/classes/admin-pages.class.php:62
152
  msgid "SEO Settings"
153
  msgstr ""
201
  msgstr ""
202
 
203
  #. translators: %s = number
 
204
  #: inc/classes/admin-pages.class.php:1158
205
  msgid "Characters Used: %s"
206
  msgstr ""
215
  msgstr ""
216
 
217
  #. translators: %s = Post Type label
 
218
  #: inc/classes/bridges/postsettings.class.php:86
219
  msgid "%s SEO Settings"
220
  msgstr ""
227
  msgid "Are you sure you want to reset all SEO settings to their defaults?"
228
  msgstr ""
229
 
230
+ #. translators: Taxonomy term archive title. 1: Taxonomy singular name, 2: Current taxonomy term
 
 
 
 
 
 
 
 
 
 
 
 
 
231
  #. translators: 1 = 'Assessment(s)', 2 = A list of assessments.
 
232
  #: inc/classes/bridges/scripts.class.php:541
233
+ #: inc/classes/generate-title.class.php:775
234
+ #: inc/classes/generate-title.class.php:842
235
  #: inc/classes/interpreters/seobar.class.php:342
236
  msgid "%1$s: %2$s"
237
  msgstr ""
276
  msgstr ""
277
 
278
  #. translators: %s = term name
 
279
  #: inc/classes/bridges/scripts.class.php:897
280
  msgid "Select Primary %s"
281
  msgstr ""
282
 
283
  #. translators: %s = term name
 
284
  #: inc/classes/bridges/scripts.class.php:902
285
  msgid "Make primary %s"
286
  msgstr ""
287
 
288
  #. translators: %s = term name
 
289
  #: inc/classes/bridges/scripts.class.php:904
290
  msgid "Primary %s"
291
  msgstr ""
292
 
293
  #. translators: Pixel counter. 1: number (value), 2: number (guideline)
 
294
  #: inc/classes/bridges/scripts.class.php:999
295
  msgid "%1$d out of %2$d pixels are used."
296
  msgstr ""
338
  msgid "Feed Settings"
339
  msgstr ""
340
 
341
+ #. translators: 1 = An assessment, 2 = Disclaimer, e.g. "take it with a grain of salt"
 
 
342
  #: inc/classes/builders/seobar-page.class.php:149
343
  #: inc/classes/builders/seobar-page.class.php:364
344
  #: inc/classes/builders/seobar-term.class.php:164
359
  msgstr ""
360
 
361
  #. translators: %s = "Untitled"
 
362
  #: inc/classes/builders/seobar-page.class.php:156
363
  #: inc/classes/builders/seobar-term.class.php:171
364
  msgid "No title could be fetched, \"%s\" is used instead."
490
  msgstr ""
491
 
492
  #. translators: %s = list of duplicated words
 
493
  #: inc/classes/builders/seobar-page.class.php:378
494
  #: inc/classes/builders/seobar-term.class.php:366
495
  msgid "Found duplicated words: %s"
555
  msgstr ""
556
 
557
  #. translators: 1: Word found, 2: Occurrences
 
558
  #: inc/classes/builders/seobar-page.class.php:493
559
  #: inc/classes/builders/seobar-term.class.php:463
560
  msgid "&#8220;%1$s&#8221; is used %2$d times."
638
  #: inc/classes/builders/seobar-page.class.php:605
639
  #: inc/classes/builders/seobar-term.class.php:560
640
  #: inc/classes/builders/seobar-term.class.php:569
641
+ #: inc/views/admin/metaboxes/robots-metabox.php:60
642
  #: inc/views/edit/seo-settings-singular.php:196
643
+ #: inc/views/edit/seo-settings-tt.php:60
644
+ #: inc/views/list/bulk-post.php:19
645
+ #: inc/views/list/quick-post.php:19
646
+ #: inc/views/list/quick-term.php:19
647
  msgid "Indexing"
648
  msgstr ""
649
 
712
  #: inc/classes/builders/seobar-page.class.php:759
713
  #: inc/classes/builders/seobar-term.class.php:709
714
  #: inc/classes/builders/seobar-term.class.php:718
715
+ #: inc/views/admin/metaboxes/robots-metabox.php:66
716
  #: inc/views/list/quick-term.php:26
717
  msgid "Following"
718
  msgstr ""
770
  #: inc/classes/builders/seobar-page.class.php:890
771
  #: inc/classes/builders/seobar-term.class.php:829
772
  #: inc/classes/builders/seobar-term.class.php:838
773
+ #: inc/views/admin/metaboxes/robots-metabox.php:72
774
  #: inc/views/edit/seo-settings-singular.php:212
775
+ #: inc/views/edit/seo-settings-tt.php:86
776
+ #: inc/views/list/bulk-post.php:33
777
+ #: inc/views/list/quick-post.php:33
778
+ #: inc/views/list/quick-term.php:33
779
  msgid "Archiving"
780
  msgstr ""
781
 
965
  msgstr ""
966
 
967
  #. translators: %s = timestamp
 
968
  #: inc/classes/builders/sitemap-base.class.php:73
969
  msgid "Sitemap is generated on %s"
970
  msgstr ""
974
  msgstr ""
975
 
976
  #: inc/classes/core.class.php:227
977
+ msgctxt "Plugin extensions"
978
+ msgid "Extensions"
979
  msgstr ""
980
 
981
  #: inc/classes/core.class.php:232
982
+ msgctxt "Plugin pricing"
983
+ msgid "Pricing"
984
  msgstr ""
985
 
986
  #: inc/classes/core.class.php:265
1000
  msgid "Get Extension Manager"
1001
  msgstr ""
1002
 
1003
+ #. translators: 1: Function name, 2: 'Deprecated', 3: Plugin Version notification, 4: Replacement function
 
 
1004
  #: inc/classes/debug.class.php:150
1005
  msgid "%1$s is %2$s since version %3$s of The SEO Framework! Use %4$s instead."
1006
  msgstr ""
1007
 
1008
+ #: inc/classes/debug.class.php:152
1009
+ #: inc/classes/debug.class.php:163
1010
  msgid "deprecated"
1011
  msgstr ""
1012
 
1013
+ #. translators: 1: Function name, 2: 'Deprecated', 3: Plugin Version notification
 
 
1014
  #: inc/classes/debug.class.php:161
1015
  msgid "%1$s is %2$s since version %3$s of The SEO Framework with no alternative available."
1016
  msgstr ""
1017
 
1018
  #. translators: %s = Version number
 
1019
  #: inc/classes/debug.class.php:212
1020
  msgid "(This message was added in version %s of The SEO Framework.)"
1021
  msgstr ""
1022
 
1023
+ #. translators: 1: Function name, 2: 'Incorrectly', 3: Error message 4: Plugin Version notification
 
 
1024
  #: inc/classes/debug.class.php:216
1025
  msgid "%1$s was called %2$s. %3$s %4$s"
1026
  msgstr ""
1030
  msgstr ""
1031
 
1032
  #. translators: 1: Method or Property name, 2: Message
1033
+ #: inc/classes/debug.class.php:266
 
1034
  msgid "%1$s is not accessible. %2$s"
1035
  msgstr ""
1036
 
1040
  msgstr ""
1041
 
1042
  #. translators: %s = Blog page title. Front-end output.
1043
+ #: inc/classes/generate-description.class.php:721
 
1044
  msgid "Latest posts: %s"
1045
  msgstr ""
1046
 
1047
+ #: inc/classes/generate-description.class.php:730
1048
  msgctxt "Placement. e.g. Post Title \"on\" Blog Name"
1049
  msgid "on"
1050
  msgstr ""
1051
 
1052
  #. translators: 1: Title, 2: on, 3: Blogname
1053
  #. translators: 1: Option label, 2: [?] option info note, 3: Optional warning
1054
+ #: inc/classes/generate-description.class.php:734
 
1055
  #: inc/views/admin/metaboxes/homepage-metabox.php:434
1056
  #: inc/views/admin/metaboxes/homepage-metabox.php:450
1057
  #: inc/views/admin/metaboxes/homepage-metabox.php:466
1058
  msgid "%1$s %2$s %3$s"
1059
  msgstr ""
1060
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1061
  #. translators: 1 = SEO Bar type title, 2 = Status reason. 3 = Assessments
 
1062
  #: inc/classes/interpreters/seobar.class.php:292
1063
  msgid "%1$s: %2$s %3$s"
1064
  msgstr ""
1065
 
1066
+ #. translators: 1 = Assessment number (mind the %d (D)), 2 = Assessment explanation
 
 
1067
  #: inc/classes/interpreters/seobar.class.php:340
1068
  msgid "%1$d: %2$s"
1069
  msgstr ""
1168
  msgstr ""
1169
 
1170
  #. translators: %s = Reading Settings URL. Links are in Markdown!
 
1171
  #: inc/views/admin/metaboxes/feed-metabox.php:48
1172
  msgid "Note: The feed is already converted into an excerpt through the [Reading Settings](%s)."
1173
  msgstr ""
1364
  msgstr ""
1365
 
1366
  #. translators: %s = HTTP or HTTPS
 
1367
  #: inc/views/admin/metaboxes/general-metabox.php:302
1368
  msgid "Detect automatically (%s)"
1369
  msgstr ""
1381
  msgstr ""
1382
 
1383
  #. translators: the backticks are Markdown! Preserve them as-is!
 
1384
  #: inc/views/admin/metaboxes/general-metabox.php:325
1385
  msgid "Add `rel` link tags to posts and pages?"
1386
  msgstr ""
1387
 
1388
  #. translators: the backticks are Markdown! Preserve them as-is!
 
1389
  #: inc/views/admin/metaboxes/general-metabox.php:336
1390
  msgid "Add `rel` link tags to archives?"
1391
  msgstr ""
1392
 
1393
  #. translators: the backticks are Markdown! Preserve them as-is!
 
1394
  #: inc/views/admin/metaboxes/general-metabox.php:347
1395
  msgid "Add `rel` link tags to the homepage?"
1396
  msgstr ""
1420
  msgstr ""
1421
 
1422
  #: inc/views/admin/metaboxes/general-metabox.php:420
1423
+ #: inc/views/admin/metaboxes/robots-metabox.php:325
1424
  msgid "Post Type Settings"
1425
  msgstr ""
1426
 
1441
  msgstr ""
1442
 
1443
  #: inc/views/admin/metaboxes/general-metabox.php:431
1444
+ #: inc/views/admin/metaboxes/robots-metabox.php:327
1445
  msgid "These settings are applied to the post type pages and their terms. When terms are shared between post types, all their post types should be checked for this to have an effect."
1446
  msgstr ""
1447
 
1454
  msgstr ""
1455
 
1456
  #: inc/views/admin/metaboxes/homepage-metabox.php:32
1457
+ #: inc/views/admin/metaboxes/robots-metabox.php:54
1458
  #: inc/views/admin/metaboxes/sitemaps-metabox.php:20
1459
  #: inc/views/admin/metaboxes/social-metabox.php:20
1460
  #: inc/views/admin/metaboxes/title-metabox.php:57
1499
  msgstr ""
1500
 
1501
  #. translators: %s = Homepage URL markdown
 
1502
  #: inc/views/admin/metaboxes/homepage-metabox.php:127
1503
  #: inc/views/admin/metaboxes/homepage-metabox.php:177
1504
  msgid "A plugin has been detected that suggests to maintain this option on the [homepage](%s)."
1593
  msgstr ""
1594
 
1595
  #. translators: the backticks are Markdown! Preserve them as-is!
 
1596
  #: inc/views/admin/metaboxes/homepage-metabox.php:437
1597
  msgid "Apply `noindex` to the homepage?"
1598
  msgstr ""
1602
  msgstr ""
1603
 
1604
  #. translators: the backticks are Markdown! Preserve them as-is!
 
1605
  #: inc/views/admin/metaboxes/homepage-metabox.php:453
1606
  msgid "Apply `nofollow` to the homepage?"
1607
  msgstr ""
1611
  msgstr ""
1612
 
1613
  #. translators: the backticks are Markdown! Preserve them as-is!
 
1614
  #: inc/views/admin/metaboxes/homepage-metabox.php:469
1615
  msgid "Apply `noarchive` to the homepage?"
1616
  msgstr ""
1625
  msgstr ""
1626
 
1627
  #. translators: %s = Homepage URL markdown
 
1628
  #: inc/views/admin/metaboxes/homepage-metabox.php:511
1629
  msgid "Note: These options may be overwritten by the [page settings](%s)."
1630
  msgstr ""
1638
  msgstr ""
1639
 
1640
  #. translators: the backticks are Markdown! Preserve them as-is!
 
1641
  #: inc/views/admin/metaboxes/homepage-metabox.php:533
1642
  msgid "Apply `noindex` to every second or later page on the homepage?"
1643
  msgstr ""
1644
 
1645
+ #: inc/views/admin/metaboxes/robots-metabox.php:24
1646
  msgid "Category archives"
1647
  msgstr ""
1648
 
1649
+ #: inc/views/admin/metaboxes/robots-metabox.php:25
1650
  msgid "Tag archives"
1651
  msgstr ""
1652
 
1653
+ #: inc/views/admin/metaboxes/robots-metabox.php:26
1654
  msgid "Author pages"
1655
  msgstr ""
1656
 
1657
+ #: inc/views/admin/metaboxes/robots-metabox.php:27
1658
  msgid "Date archives"
1659
  msgstr ""
1660
 
1661
+ #: inc/views/admin/metaboxes/robots-metabox.php:28
1662
  msgid "Search pages"
1663
  msgstr ""
1664
 
1665
+ #: inc/views/admin/metaboxes/robots-metabox.php:30
1666
  msgctxt "...for the entire site"
1667
  msgid "the entire site"
1668
  msgstr ""
1669
 
1670
+ #: inc/views/admin/metaboxes/robots-metabox.php:40
1671
  msgid "These options most likely prevent indexing of the selected archives and pages. If you enable this, the selected archives or pages will urge to be removed from search engine results pages."
1672
  msgstr ""
1673
 
1674
+ #: inc/views/admin/metaboxes/robots-metabox.php:44
1675
  msgid "These options most likely prevent links from being followed on the selected archives and pages. If you enable this, the selected archives or pages in-page links will gain no SEO value, including your internal links."
1676
  msgstr ""
1677
 
1678
+ #: inc/views/admin/metaboxes/robots-metabox.php:48
1679
  msgid "These options most likely prevent caching of the selected archives and pages. If you enable this, bots are urged not create a cached copy of the selected archives or pages."
1680
  msgstr ""
1681
 
1682
+ #: inc/views/admin/metaboxes/robots-metabox.php:93
1683
  msgid "Advanced Query Protection"
1684
  msgstr ""
1685
 
1686
+ #: inc/views/admin/metaboxes/robots-metabox.php:95
1687
  msgid "Some URL queries can cause WordPress to show faux archives. When search engines spot these, they will crawl and index them, which may cause a drop in ranking. Advanced query protection will prevent robots from indexing these archives."
1688
  msgstr ""
1689
 
1690
+ #: inc/views/admin/metaboxes/robots-metabox.php:100
1691
  msgid "Enable advanced query protection?"
1692
  msgstr ""
1693
 
1694
+ #: inc/views/admin/metaboxes/robots-metabox.php:109
1695
  msgid "Paginated Archive Settings"
1696
  msgstr ""
1697
 
1698
+ #: inc/views/admin/metaboxes/robots-metabox.php:111
1699
  msgid "Indexing the second or later page of any archive might cause duplication errors. Search engines look down upon them; therefore, it's recommended to disable indexing of those pages."
1700
  msgstr ""
1701
 
1702
  #. translators: the backticks are Markdown! Preserve them as-is!
1703
+ #: inc/views/admin/metaboxes/robots-metabox.php:118
 
1704
  msgid "Apply `noindex` to every second or later archive page?"
1705
  msgstr ""
1706
 
1707
+ #: inc/views/admin/metaboxes/robots-metabox.php:129
1708
  msgid "Copyright Directive Settings"
1709
  msgstr ""
1710
 
1711
+ #: inc/views/admin/metaboxes/robots-metabox.php:131
1712
  msgid "Some search engines allow you to control copyright directives on the content they aggregate. It's best to allow some content to be taken by these aggregators, as that can improve contextualized exposure via snippets and previews. When left unspecified, regional regulations may apply. It is up to the aggregator to honor these requests."
1713
  msgstr ""
1714
 
1715
+ #: inc/views/admin/metaboxes/robots-metabox.php:136
1716
  msgid "Specify aggregator copyright compliance directives?"
1717
  msgstr ""
1718
 
1719
+ #: inc/views/admin/metaboxes/robots-metabox.php:144
1720
  msgid "Unlimited"
1721
  msgstr ""
1722
 
1723
+ #: inc/views/admin/metaboxes/robots-metabox.php:145
1724
  msgctxt "quanity: zero"
1725
  msgid "None, disallow snippet"
1726
  msgstr ""
1727
 
1728
  #. translators: %d = number
1729
+ #: inc/views/admin/metaboxes/robots-metabox.php:149
 
1730
  msgid "%d character"
1731
  msgid_plural "%d characters"
1732
  msgstr[0] ""
1733
  msgstr[1] ""
1734
 
1735
+ #: inc/views/admin/metaboxes/robots-metabox.php:155
1736
+ #: inc/views/admin/metaboxes/robots-metabox.php:241
1737
  msgid "Standard directive"
1738
  msgstr ""
1739
 
1740
+ #: inc/views/admin/metaboxes/robots-metabox.php:156
1741
+ #: inc/views/admin/metaboxes/robots-metabox.php:242
1742
  msgid "Granular directive"
1743
  msgstr ""
1744
 
1745
+ #: inc/views/admin/metaboxes/robots-metabox.php:179
1746
  msgid "Maximum text snippet length"
1747
  msgstr ""
1748
 
1749
+ #: inc/views/admin/metaboxes/robots-metabox.php:183
1750
  msgid "This may limit the text snippet length for all pages on this site."
1751
  msgstr ""
1752
 
1753
+ #: inc/views/admin/metaboxes/robots-metabox.php:187
1754
  msgid "This directive also imposes a limit on meta descriptions and structured data, which unintentionally restricts the amount of information you can share. Therefore, it's best to use at least a 320 character limit."
1755
  msgstr ""
1756
 
1757
+ #: inc/views/admin/metaboxes/robots-metabox.php:196
1758
  msgctxt "quanity: zero"
1759
  msgid "None, disallow preview"
1760
  msgstr ""
1761
 
1762
+ #: inc/views/admin/metaboxes/robots-metabox.php:197
1763
  msgid "Thumbnail or standard size"
1764
  msgstr ""
1765
 
1766
+ #: inc/views/admin/metaboxes/robots-metabox.php:198
1767
  msgid "Large or full size"
1768
  msgstr ""
1769
 
1770
+ #: inc/views/admin/metaboxes/robots-metabox.php:216
1771
  msgid "Maximum image preview size"
1772
  msgstr ""
1773
 
1774
+ #: inc/views/admin/metaboxes/robots-metabox.php:220
1775
  msgid "This may limit the image preview size for all images from this site."
1776
  msgstr ""
1777
 
1778
+ #: inc/views/admin/metaboxes/robots-metabox.php:230
1779
  msgid "Full video preview"
1780
  msgstr ""
1781
 
1782
+ #: inc/views/admin/metaboxes/robots-metabox.php:231
1783
  msgctxt "quanity: zero"
1784
  msgid "None, still image only"
1785
  msgstr ""
1786
 
1787
  #. translators: %d = number
1788
+ #: inc/views/admin/metaboxes/robots-metabox.php:235
 
1789
  msgid "%d second"
1790
  msgid_plural "%d seconds"
1791
  msgstr[0] ""
1792
  msgstr[1] ""
1793
 
1794
+ #: inc/views/admin/metaboxes/robots-metabox.php:264
1795
  msgid "Maximum video preview length"
1796
  msgstr ""
1797
 
1798
+ #: inc/views/admin/metaboxes/robots-metabox.php:268
1799
  msgid "This may limit the video preview length for all videos on this site."
1800
  msgstr ""
1801
 
1802
+ #. translators: 1 = noindex/nofollow/noarchive, 2 = Post, Post type, Category archives, the entire site, etc.
1803
+ #: inc/views/admin/metaboxes/robots-metabox.php:283
 
 
1804
  msgid "Apply %1$s to %2$s?"
1805
  msgstr ""
1806
 
1807
+ #: inc/views/admin/metaboxes/robots-metabox.php:288
1808
  msgid "Robots Settings"
1809
  msgstr ""
1810
 
1811
+ #: inc/views/admin/metaboxes/robots-metabox.php:313
1812
  msgid "Warning: No public site should ever enable this option."
1813
  msgstr ""
1814
 
1815
+ #: inc/views/admin/metaboxes/robots-metabox.php:332
1816
  msgid "Warning: No site should enable these options for Posts and Pages."
1817
  msgstr ""
1818
 
2001
  msgstr ""
2002
 
2003
  #. translators: %s = Learn more URL. Markdown!
 
2004
  #: inc/views/admin/metaboxes/schema-metabox.php:289
2005
  msgid "These settings are marked for removal. When you clear a field, it will be hidden forever. [Learn more](%s)."
2006
  msgstr ""
2082
  msgid "Note: You're using the plain permalink structure; so, no robots.txt file can be generated."
2083
  msgstr ""
2084
 
2085
+ #. translators: 1 = Link to settings, Markdown. 2 = example input, also markdown! Preserve the Markdown as-is!
 
 
2086
  #: inc/views/admin/metaboxes/sitemaps-metabox.php:158
2087
  msgid "Change your [Permalink Settings](%1$s). Recommended structure: `%2$s`."
2088
  msgstr ""
2120
  msgstr ""
2121
 
2122
  #. translators: the backticks are Markdown! Preserve them as-is!
 
2123
  #: inc/views/admin/metaboxes/sitemaps-metabox.php:216
2124
  msgid "Add `<lastmod>` to the sitemap?"
2125
  msgstr ""
2133
  msgstr ""
2134
 
2135
  #. translators: the backticks are Markdown! Preserve them as-is!
 
2136
  #: inc/views/admin/metaboxes/sitemaps-metabox.php:238
2137
  msgid "Add `<priority>` to the sitemap?"
2138
  msgstr ""
2162
  msgstr ""
2163
 
2164
  #. translators: %s = Google
 
2165
  #: inc/views/admin/metaboxes/sitemaps-metabox.php:285
2166
  msgid "Notify %s about sitemap changes?"
2167
  msgstr ""
2291
  msgstr ""
2292
 
2293
  #: inc/views/admin/metaboxes/social-metabox.php:157
2294
+ msgid "Theme Color"
2295
  msgstr ""
2296
 
2297
  #: inc/views/admin/metaboxes/social-metabox.php:165
2348
  msgstr ""
2349
 
2350
  #: inc/views/admin/metaboxes/social-metabox.php:242
2351
+ #: inc/views/admin/metaboxes/social-metabox.php:336
2352
  msgid "Authors can override this option on their profile page."
2353
  msgstr ""
2354
 
2373
  msgid "The Twitter Card type may have the image highlighted, either small at the side or large above."
2374
  msgstr ""
2375
 
2376
+ #: inc/views/admin/metaboxes/social-metabox.php:286
2377
+ msgid "Learn more about this card."
2378
+ msgstr ""
2379
+
2380
+ #: inc/views/admin/metaboxes/social-metabox.php:301
2381
+ msgid "Card and Content Attribution"
2382
  msgstr ""
2383
 
2384
+ #: inc/views/admin/metaboxes/social-metabox.php:304
2385
+ msgid "Twitter claims users will be able to follow and view the profiles of attributed accounts directly from the card when these fields are filled in."
2386
+ msgstr ""
2387
+
2388
+ #: inc/views/admin/metaboxes/social-metabox.php:305
2389
+ msgid "However, for now, these fields seem to have no discernible effect."
2390
+ msgstr ""
2391
+
2392
+ #: inc/views/admin/metaboxes/social-metabox.php:310
2393
  msgid "Website Twitter Profile"
2394
  msgstr ""
2395
 
2396
+ #: inc/views/admin/metaboxes/social-metabox.php:314
2397
+ #: inc/views/admin/metaboxes/social-metabox.php:330
2398
  msgid "Find your @username."
2399
  msgstr ""
2400
 
2401
+ #: inc/views/admin/metaboxes/social-metabox.php:326
2402
  msgid "Twitter Author Fallback Profile"
2403
  msgstr ""
2404
 
2405
+ #: inc/views/admin/metaboxes/social-metabox.php:345
2406
  msgid "oEmbed Settings"
2407
  msgstr ""
2408
 
2409
+ #: inc/views/admin/metaboxes/social-metabox.php:347
2410
  msgid "Some social sharing services and clients, like WordPress and Discord, obtain the linked page information via oEmbed."
2411
  msgstr ""
2412
 
2413
+ #: inc/views/admin/metaboxes/social-metabox.php:355
2414
  msgid "Remove author name?"
2415
  msgstr ""
2416
 
2417
+ #: inc/views/admin/metaboxes/social-metabox.php:356
2418
+ msgid "Discord shows the page author's name above the sharing embed. Check this option if you find this undesirable."
2419
  msgstr ""
2420
 
2421
+ #: inc/views/admin/metaboxes/social-metabox.php:364
2422
  msgid "Posts"
2423
  msgstr ""
2424
 
2425
+ #: inc/views/admin/metaboxes/social-metabox.php:367
2426
  msgid "Post Date Settings"
2427
  msgstr ""
2428
 
2429
+ #: inc/views/admin/metaboxes/social-metabox.php:369
2430
  msgid "Some social sites output the shared post's publishing and modified data in the sharing snippet."
2431
  msgstr ""
2432
 
2433
  #. translators: the backticks are Markdown! Preserve them as-is!
2434
+ #: inc/views/admin/metaboxes/social-metabox.php:380
 
2435
  msgid "Add `article:published_time` to posts?"
2436
  msgstr ""
2437
 
2438
  #. translators: the backticks are Markdown! Preserve them as-is!
2439
+ #: inc/views/admin/metaboxes/social-metabox.php:390
 
2440
  msgid "Add `article:modified_time` to posts?"
2441
  msgstr ""
2442
 
2461
  msgid "Prefixes"
2462
  msgstr ""
2463
 
2464
+ #: inc/views/admin/metaboxes/title-metabox.php:102
2465
+ msgid "A title is generated for every page."
2466
+ msgstr ""
2467
 
2468
+ #: inc/views/admin/metaboxes/title-metabox.php:103
2469
+ msgid "Some titles may have HTML tags inserted by the author for styling."
2470
+ msgstr ""
2471
+
2472
+ #. translators: %s = HTML tag example
2473
  #: inc/views/admin/metaboxes/title-metabox.php:108
2474
  msgid "This strips HTML tags, like %s, from the title."
2475
  msgstr ""
2514
  msgid "Note: Only use this option if you are aware of its SEO effects."
2515
  msgstr ""
2516
 
 
 
 
 
2517
  #: inc/views/admin/metaboxes/title-metabox.php:226
2518
  msgid "Example Category"
2519
  msgstr ""
2567
  msgstr ""
2568
 
2569
  #. translators: literal translation from '百度搜索资源平台'-Code
 
2570
  #: inc/views/admin/metaboxes/webmaster-metabox.php:57
2571
  msgid "Baidu Search Resource Platform Code"
2572
  msgstr ""
2630
  msgstr ""
2631
 
2632
  #: inc/views/edit/seo-settings-singular.php:204
2633
+ #: inc/views/edit/seo-settings-tt.php:73
2634
+ #: inc/views/list/bulk-post.php:26
2635
  #: inc/views/list/quick-post.php:26
2636
  msgid "Link following"
2637
  msgstr ""
2638
 
2639
  #: inc/views/edit/seo-settings-singular.php:222
2640
+ #: inc/views/edit/seo-settings-tt.php:279
2641
+ #: inc/views/list/quick-post.php:57
2642
  #: inc/views/list/quick-term.php:57
2643
  msgid "Canonical URL"
2644
  msgstr ""
2657
  msgstr ""
2658
 
2659
  #. translators: %s = default option value
 
2660
  #: inc/views/edit/seo-settings-singular.php:289
2661
+ #: inc/views/edit/seo-settings-tt.php:316
2662
+ #: inc/views/list/quick-post.php:74
2663
  #: inc/views/list/quick-term.php:74
2664
  msgid "Default (%s)"
2665
  msgstr ""
2677
  msgstr ""
2678
 
2679
  #: inc/views/edit/seo-settings-singular.php:347
2680
+ #: inc/views/edit/seo-settings-tt.php:332
2681
+ #: inc/views/list/quick-post.php:87
2682
  #: inc/views/list/quick-term.php:87
2683
  msgid "301 Redirect URL"
2684
  msgstr ""
2708
  msgid "Social SEO Settings"
2709
  msgstr ""
2710
 
2711
+ #: inc/views/edit/seo-settings-tt.php:272
2712
+ #: inc/views/list/bulk-post.php:54
2713
+ #: inc/views/list/quick-post.php:54
2714
+ #: inc/views/list/quick-term.php:54
2715
  msgid "Visibility SEO Settings"
2716
  msgstr ""
2717
 
2719
  msgid "These directives may urge robots not to display, follow links on, or create a cached copy of this term."
2720
  msgstr ""
2721
 
 
 
 
 
2722
  #: inc/views/list/bulk-post.php:68
2723
  msgid "Default (unknown)"
2724
  msgstr ""
2745
  msgstr ""
2746
 
2747
  #. translators: URLs are in Markdown. Don't forget to localize the URLs.
 
2748
  #: inc/views/sitemap/xsl-stylesheet.php:244
2749
  msgid "This is a generated XML Sitemap, meant to be consumed by search engines like [Google](https://www.google.com/) or [Bing](https://www.bing.com/)."
2750
  msgstr ""
2751
 
2752
  #. translators: URLs are in Markdown. Don't localize this URL.
 
2753
  #: inc/views/sitemap/xsl-stylesheet.php:264
2754
  msgid "You can find more information on XML sitemaps at [sitemaps.org](https://www.sitemaps.org/)."
2755
  msgstr ""
2767
  msgstr ""
2768
 
2769
  #. translators: URLs are in Markdown.
 
2770
  #: inc/views/sitemap/xsl-stylesheet.php:366
2771
  msgid "Generated by [The SEO Framework](https://theseoframework.com/)"
2772
  msgstr ""
2773
 
2774
  #. translators: %s = term name
 
2775
  #: inc/views/templates/inpost/primary-term-selector.php:28
2776
  msgid "The buttons below are for primary %s selection."
2777
  msgstr ""
2779
  #: inc/views/templates/settings/settings.php:14
2780
  msgid "This post type is disabled, so this option won't work."
2781
  msgstr ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib/js/settings.js CHANGED
@@ -318,6 +318,9 @@ window.tsfSettings = function( $ ) {
318
  /**
319
  * Updates the hover additions placement.
320
  *
 
 
 
321
  * @function
322
  * @return {undefined}
323
  */
@@ -325,14 +328,8 @@ window.tsfSettings = function( $ ) {
325
  let oldPlacement = tsfTitle.getState( 'additionPlacement' ),
326
  placement = 'after';
327
 
328
- if ( tsf.l10n.states.isRTL ) {
329
- if ( 'right' === $( '#tsf-home-title-location input:checked' ).val() ) {
330
- placement = 'before';
331
- }
332
- } else {
333
- if ( 'left' === $( '#tsf-home-title-location input:checked' ).val() ) {
334
- placement = 'before';
335
- }
336
  }
337
 
338
  if ( placement !== oldPlacement ) {
318
  /**
319
  * Updates the hover additions placement.
320
  *
321
+ * @since 4.0.0
322
+ * @since 4.0.6 No longer changes behavior depending on RTL-status.
323
+ *
324
  * @function
325
  * @return {undefined}
326
  */
328
  let oldPlacement = tsfTitle.getState( 'additionPlacement' ),
329
  placement = 'after';
330
 
331
+ if ( 'left' === $( '#tsf-home-title-location input:checked' ).val() ) {
332
+ placement = 'before';
 
 
 
 
 
 
333
  }
334
 
335
  if ( placement !== oldPlacement ) {
lib/js/settings.min.js CHANGED
@@ -1 +1 @@
1
- 'use strict';window.tsfSettings=function(a){const b="undefined"!=typeof tsfSettingsL10n&&tsfSettingsL10n,c=()=>{const b=b=>{a(b.target).is(":checked")?(a(".tsf-pixel-counter-wrap").show(),tsfC.triggerCounterUpdate()):a(".tsf-pixel-counter-wrap").hide()};a("#autodescription-site-settings\\[display_character_counter\\]").on("click",b),a("#autodescription-site-settings\\[display_pixel_counter\\]").on("click",b);let c=!1;const d=b=>{if(b.target.name){let d=b.target.name.split(/(?:.+\[)(.+?)(?:])/).join("");a(b.target).is(":checked")?h(d):c&&i(d)}},e=wp.template("tsf-disabled-post-type-help")(),f=a=>"tsf-disabled-post-type-input-clone-"+a,g=a=>[document.getElementById("autodescription-site-settings[noindex_post_types]["+a+"]"),document.getElementById("autodescription-site-settings[nofollow_post_types]["+a+"]"),document.getElementById("autodescription-site-settings[noarchive_post_types]["+a+"]")].filter(a=>a),h=b=>{g(b).forEach(c=>{let d=c.cloneNode(!0);d.type="hidden",d.id+="-cloned",d.classList.add(f(b)),c.disabled=!0,c.dataset.hasWarning=!0,a(c.closest("label")).append(e).append(d)}),tsfTT.triggerReset()},i=a=>{g(a).forEach(b=>{b.dataset.hasWarning&&(b.closest("label").querySelector(".tsf-post-type-warning").remove(),document.querySelectorAll("."+f(a)).forEach(a=>{a.remove()}),b.disabled=!1,b.dataset.hasWarning=!1)})};a(".tsf-disabled-post-types").on("change.tsfSetPostType",d).trigger("change.tsfSetPostType"),c=!0},d=()=>{let b=a(".tsf-color-picker");b.length&&a.each(b,(b,c)=>{let d=a(c),e="",f=d.data("tsf-default-color");d.wpColorPicker({defaultColor:f,width:238,change:()=>{e=d.wpColorPicker("color"),""===e&&(e=f),d.val(e),tsfAys.registerChange()},clear:()=>{f.length&&(d.val(f),d.closest(".wp-picker-container").find(".wp-color-result").css("backgroundColor",f)),tsfAys.registerChange()},palettes:!1})})},e=()=>{let b=document.getElementById("autodescription-site-settings[title_rem_additions]");a(b).on("change",()=>{let c=a(".tsf-title-additions-js");a(b).is(":checked")?c.css("display","none"):c.css("display","inline")}),a(b).trigger("change");a("#tsf-title-location input").on("click",b=>{let c=a(".tsf-title-additions-example-left"),d=a(".tsf-title-additions-example-right");"right"===a(b.target).val()?(c.css("display","none"),d.css("display","inline")):(c.css("display","inline"),d.css("display","none"))});a("#tsf-title-prefixes-toggle :input").on("click",b=>{let c=a(b.target),d=a(".tsf-title-prefix-example");c.is(":checked")?d.css("display","none"):d.css("display","inline")});a("#tsf-title-separator :input").on("click",b=>{let c=b.target.dataset.entity,d="";d=a("<div/>").html(c).text(),a(".tsf-sep-js").text(" "+d+" "),a(window).trigger("tsf-title-sep-updated",[d])})},f=()=>{const c=document.getElementById("autodescription-site-settings[homepage_title]"),d=document.getElementById("autodescription-site-settings[homepage_title_tagline]"),e=document.getElementById("autodescription-site-settings[homepage_tagline]"),f=tsf.escapeString(b.i18n.protectedTitle),g=tsf.escapeString(b.i18n.privateTitle);tsfTitle.setInputElement(c);const h=()=>{let b=tsfTitle.getState("additionPlacement"),c="after";tsf.l10n.states.isRTL?"right"===a("#tsf-home-title-location input:checked").val()&&(c="before"):"left"===a("#tsf-home-title-location input:checked").val()&&(c="before"),c!==b&&tsfTitle.updateState("additionPlacement",c)};h(),a("#tsf-home-title-location").on("click",":input",h);const i=a=>{let b=tsfTitle.getState("prefixValue"),c="";switch(a){case"password":c=f;break;case"private":c=g;break;default:case"public":c="";}c!==b&&tsfTitle.updateState("prefixValue",c)};b.states.isFrontPrivate?i("private"):b.states.isFrontProtected&&i("password");a(c).on("input.tsfInputTitle",b=>{let c=a(".tsf-custom-title-js"),d=tsf.decodeEntities(tsf.sDoubleSpace(b.target.value.trim()));d.length?c.html(tsf.escapeString(d)):c.html(tsf.escapeString(tsf.decodeEntities(tsfTitle.getState("defaultTitle"))))}),a(c).trigger("input.tsfInputTitle");let j,k=a(".tsf-custom-tagline-js");const l=()=>{clearTimeout(j),j=setTimeout(()=>{let b=tsfTitle.getState("additionValue");b=tsf.decodeEntities(tsf.sDoubleSpace(b.trim())),b.length&&tsfTitle.getState("useTagline")?(k.html(tsf.escapeString(b)),a(".tsf-custom-blogname-js").show()):a(".tsf-custom-blogname-js").hide()})};a(d).on("input.tsfInputTagline",()=>{let a=tsfTitle.getState("additionValue"),b=d.value.trim();b.length||(b=d.placeholder||""),b=tsf.escapeString(tsf.decodeEntities(b.trim())),a!==b&&(tsfTitle.updateState("additionValue",b),l())}),a(d).trigger("input.tsfInputTagline");a(e).on("change.tsfToggleTagline",a=>{let b=!1;a.target.checked?(b=!0,d.readOnly=!1):(b=!1,d.readOnly=!0),tsfTitle.updateState("useTagline",b),l()}),a(e).trigger("change.tsfToggleTagline");a(window).on("tsf-title-sep-updated",(a,b)=>{tsfTitle.updateState("separator",b)}),tsfTitle.enqueueUnregisteredInputTrigger()},g=()=>{tsfDescription.setInputElement(document.getElementById("autodescription-site-settings[homepage_description]")),tsfDescription.enqueueUnregisteredInputTrigger()},h=()=>{const b=()=>{tsfTitle.enqueueUnregisteredInputTrigger(),tsfDescription.enqueueUnregisteredInputTrigger()};a(document).on("postbox-toggled",function(a,c){if("autodescription-homepage-settings"===c.id){let a=c.querySelector(".inside");0<a.offsetHeight&&0<a.offsetWidth&&b()}}),a("#tsf-homepage-tab-general").on("tsf-tab-toggled",tsfTitle.enqueueUnregisteredInputTrigger)},i=()=>{const b=a("#autodescription-site-settings\\[set_copyright_directives\\]"),c=a("#autodescription-site-settings\\[max_snippet_length\\], #autodescription-site-settings\\[max_image_preview\\], #autodescription-site-settings\\[max_video_preview\\]");if(b.length&&c.length){b.on("change.tsfToggleDirectives",b=>{b.target.checked?(c.prop("disabled",!1),a(".tsf-toggle-directives-surrogate").remove()):(c.prop("disabled",!0),c.each((b,c)=>{a("<input />").attr("type","hidden").attr("name",c.name||"").val(c.value||0).addClass("tsf-toggle-directives-surrogate").insertAfter(c)}))}),b.trigger("change.tsfToggleDirectives")}},j=()=>{const b=a("#autodescription-site-settings\\[google_verification\\], #autodescription-site-settings\\[bing_verification\\], #autodescription-site-settings\\[yandex_verification\\], #autodescription-site-settings\\[baidu_verification\\], #autodescription-site-settings\\[pint_verification\\]");if(b.length){const a=a=>{let b=a.originalEvent.clipboardData&&a.originalEvent.clipboardData.getData("text")||void 0;if(b){let c=/<meta[^>]+content=(\"|\')?([^\"\'>\s]+)\1?.*?>/i.exec(b);c&&2 in c&&"string"==typeof c[2]&&c[2].length&&(a.stopPropagation(),a.preventDefault(),a.target.value=c[2],tsfAys.registerChange())}};b.on("paste",a)}},k=()=>{c(),e(),f(),g(),h(),i(),j(),d()},l=()=>{tsfSocial.initTitleInputs({ref:document.getElementById("tsf-title-reference"),meta:document.getElementById("autodescription-site-settings[homepage_title]"),og:document.getElementById("autodescription-site-settings[homepage_og_title]"),tw:document.getElementById("autodescription-site-settings[homepage_twitter_title]")}),tsfSocial.initDescriptionInputs({ref:document.getElementById("tsf-description-reference"),meta:document.getElementById("autodescription-site-settings[homepage_description]"),og:document.getElementById("autodescription-site-settings[homepage_og_description]"),tw:document.getElementById("autodescription-site-settings[homepage_twitter_description]")})},m=()=>confirm(b.i18n.confirmReset),n=()=>{a(".tsf-tabs-radio").on("change",(b,c)=>{let d=a(b.target);if(!d.is(":checked"))return;c="boolean"==typeof c&&c;let e=b.target.id,f=b.target.name,g="tsf-active-tab-content",h="tsf-tab-active",i=a("."+g),j=d.closest(".tsf-nav-tab-wrapper").find("."+h),k=i.find("input:invalid, select:invalid, textarea:invalid");if(k.length)return k[0].reportValidity(),j.prop("checked",!0),d.prop("checked",!1),b.stopPropagation(),b.preventDefault(),!1;let l=a("#"+e+"-content");if(j.removeClass(h),j.siblings("label").removeClass("tsf-no-focus-ring"),d.addClass(h),c){let b=a("."+f+"-content");b.removeClass(g).hide(),l.addClass(g).show(),a("#"+e).trigger("tsf-tab-toggled")}else if(l.length&&!l.is(i)){let b=a("."+f+"-content");b.fadeOut(150,function(){a(this).removeClass(g)}),setTimeout(()=>{l.addClass(g).fadeIn(250)},150),setTimeout(()=>{a("#"+e).trigger("tsf-tab-toggled")},175)}});a(".tsf-nav-tab-wrapper").on("click.tsfNavTab",".tsf-nav-tab",a=>{a.currentTarget.classList.add("tsf-no-focus-ring")});a(document.body).on("tsf-ready",()=>{a(".tsf-tabs-radio:checked").each((b,c)=>{a(c).trigger("change",[!0])})})};return Object.assign({load:()=>{a("div.updated, div.error, div.notice, .notice-error, .notice-warning, .notice-info").insertAfter(".tsf-top-wrap"),a(document.body).on("tsf-onload",k),a(document.body).on("tsf-ready",l),a(".tsf-js-confirm-reset").on("click",m),n()}},{},{l10n:b})}(jQuery),jQuery(window.tsfSettings.load);
1
+ 'use strict';window.tsfSettings=function(a){const b="undefined"!=typeof tsfSettingsL10n&&tsfSettingsL10n,c=()=>{const b=b=>{a(b.target).is(":checked")?(a(".tsf-pixel-counter-wrap").show(),tsfC.triggerCounterUpdate()):a(".tsf-pixel-counter-wrap").hide()};a("#autodescription-site-settings\\[display_character_counter\\]").on("click",b),a("#autodescription-site-settings\\[display_pixel_counter\\]").on("click",b);let c=!1;const d=b=>{if(b.target.name){let d=b.target.name.split(/(?:.+\[)(.+?)(?:])/).join("");a(b.target).is(":checked")?h(d):c&&i(d)}},e=wp.template("tsf-disabled-post-type-help")(),f=a=>"tsf-disabled-post-type-input-clone-"+a,g=a=>[document.getElementById("autodescription-site-settings[noindex_post_types]["+a+"]"),document.getElementById("autodescription-site-settings[nofollow_post_types]["+a+"]"),document.getElementById("autodescription-site-settings[noarchive_post_types]["+a+"]")].filter(a=>a),h=b=>{g(b).forEach(c=>{let d=c.cloneNode(!0);d.type="hidden",d.id+="-cloned",d.classList.add(f(b)),c.disabled=!0,c.dataset.hasWarning=!0,a(c.closest("label")).append(e).append(d)}),tsfTT.triggerReset()},i=a=>{g(a).forEach(b=>{b.dataset.hasWarning&&(b.closest("label").querySelector(".tsf-post-type-warning").remove(),document.querySelectorAll("."+f(a)).forEach(a=>{a.remove()}),b.disabled=!1,b.dataset.hasWarning=!1)})};a(".tsf-disabled-post-types").on("change.tsfSetPostType",d).trigger("change.tsfSetPostType"),c=!0},d=()=>{let b=a(".tsf-color-picker");b.length&&a.each(b,(b,c)=>{let d=a(c),e="",f=d.data("tsf-default-color");d.wpColorPicker({defaultColor:f,width:238,change:()=>{e=d.wpColorPicker("color"),""===e&&(e=f),d.val(e),tsfAys.registerChange()},clear:()=>{f.length&&(d.val(f),d.closest(".wp-picker-container").find(".wp-color-result").css("backgroundColor",f)),tsfAys.registerChange()},palettes:!1})})},e=()=>{let b=document.getElementById("autodescription-site-settings[title_rem_additions]");a(b).on("change",()=>{let c=a(".tsf-title-additions-js");a(b).is(":checked")?c.css("display","none"):c.css("display","inline")}),a(b).trigger("change");a("#tsf-title-location input").on("click",b=>{let c=a(".tsf-title-additions-example-left"),d=a(".tsf-title-additions-example-right");"right"===a(b.target).val()?(c.css("display","none"),d.css("display","inline")):(c.css("display","inline"),d.css("display","none"))});a("#tsf-title-prefixes-toggle :input").on("click",b=>{let c=a(b.target),d=a(".tsf-title-prefix-example");c.is(":checked")?d.css("display","none"):d.css("display","inline")});a("#tsf-title-separator :input").on("click",b=>{let c=b.target.dataset.entity,d="";d=a("<div/>").html(c).text(),a(".tsf-sep-js").text(" "+d+" "),a(window).trigger("tsf-title-sep-updated",[d])})},f=()=>{const c=document.getElementById("autodescription-site-settings[homepage_title]"),d=document.getElementById("autodescription-site-settings[homepage_title_tagline]"),e=document.getElementById("autodescription-site-settings[homepage_tagline]"),f=tsf.escapeString(b.i18n.protectedTitle),g=tsf.escapeString(b.i18n.privateTitle);tsfTitle.setInputElement(c);const h=()=>{let b=tsfTitle.getState("additionPlacement"),c="after";"left"===a("#tsf-home-title-location input:checked").val()&&(c="before"),c!==b&&tsfTitle.updateState("additionPlacement",c)};h(),a("#tsf-home-title-location").on("click",":input",h);const i=a=>{let b=tsfTitle.getState("prefixValue"),c="";switch(a){case"password":c=f;break;case"private":c=g;break;default:case"public":c="";}c!==b&&tsfTitle.updateState("prefixValue",c)};b.states.isFrontPrivate?i("private"):b.states.isFrontProtected&&i("password");a(c).on("input.tsfInputTitle",b=>{let c=a(".tsf-custom-title-js"),d=tsf.decodeEntities(tsf.sDoubleSpace(b.target.value.trim()));d.length?c.html(tsf.escapeString(d)):c.html(tsf.escapeString(tsf.decodeEntities(tsfTitle.getState("defaultTitle"))))}),a(c).trigger("input.tsfInputTitle");let j,k=a(".tsf-custom-tagline-js");const l=()=>{clearTimeout(j),j=setTimeout(()=>{let b=tsfTitle.getState("additionValue");b=tsf.decodeEntities(tsf.sDoubleSpace(b.trim())),b.length&&tsfTitle.getState("useTagline")?(k.html(tsf.escapeString(b)),a(".tsf-custom-blogname-js").show()):a(".tsf-custom-blogname-js").hide()})};a(d).on("input.tsfInputTagline",()=>{let a=tsfTitle.getState("additionValue"),b=d.value.trim();b.length||(b=d.placeholder||""),b=tsf.escapeString(tsf.decodeEntities(b.trim())),a!==b&&(tsfTitle.updateState("additionValue",b),l())}),a(d).trigger("input.tsfInputTagline");a(e).on("change.tsfToggleTagline",a=>{let b=!1;a.target.checked?(b=!0,d.readOnly=!1):(b=!1,d.readOnly=!0),tsfTitle.updateState("useTagline",b),l()}),a(e).trigger("change.tsfToggleTagline");a(window).on("tsf-title-sep-updated",(a,b)=>{tsfTitle.updateState("separator",b)}),tsfTitle.enqueueUnregisteredInputTrigger()},g=()=>{tsfDescription.setInputElement(document.getElementById("autodescription-site-settings[homepage_description]")),tsfDescription.enqueueUnregisteredInputTrigger()},h=()=>{const b=()=>{tsfTitle.enqueueUnregisteredInputTrigger(),tsfDescription.enqueueUnregisteredInputTrigger()};a(document).on("postbox-toggled",function(a,c){if("autodescription-homepage-settings"===c.id){let a=c.querySelector(".inside");0<a.offsetHeight&&0<a.offsetWidth&&b()}}),a("#tsf-homepage-tab-general").on("tsf-tab-toggled",tsfTitle.enqueueUnregisteredInputTrigger)},i=()=>{const b=a("#autodescription-site-settings\\[set_copyright_directives\\]"),c=a("#autodescription-site-settings\\[max_snippet_length\\], #autodescription-site-settings\\[max_image_preview\\], #autodescription-site-settings\\[max_video_preview\\]");if(b.length&&c.length){b.on("change.tsfToggleDirectives",b=>{b.target.checked?(c.prop("disabled",!1),a(".tsf-toggle-directives-surrogate").remove()):(c.prop("disabled",!0),c.each((b,c)=>{a("<input />").attr("type","hidden").attr("name",c.name||"").val(c.value||0).addClass("tsf-toggle-directives-surrogate").insertAfter(c)}))}),b.trigger("change.tsfToggleDirectives")}},j=()=>{const b=a("#autodescription-site-settings\\[google_verification\\], #autodescription-site-settings\\[bing_verification\\], #autodescription-site-settings\\[yandex_verification\\], #autodescription-site-settings\\[baidu_verification\\], #autodescription-site-settings\\[pint_verification\\]");if(b.length){const a=a=>{let b=a.originalEvent.clipboardData&&a.originalEvent.clipboardData.getData("text")||void 0;if(b){let c=/<meta[^>]+content=(\"|\')?([^\"\'>\s]+)\1?.*?>/i.exec(b);c&&2 in c&&"string"==typeof c[2]&&c[2].length&&(a.stopPropagation(),a.preventDefault(),a.target.value=c[2],tsfAys.registerChange())}};b.on("paste",a)}},k=()=>{c(),e(),f(),g(),h(),i(),j(),d()},l=()=>{tsfSocial.initTitleInputs({ref:document.getElementById("tsf-title-reference"),meta:document.getElementById("autodescription-site-settings[homepage_title]"),og:document.getElementById("autodescription-site-settings[homepage_og_title]"),tw:document.getElementById("autodescription-site-settings[homepage_twitter_title]")}),tsfSocial.initDescriptionInputs({ref:document.getElementById("tsf-description-reference"),meta:document.getElementById("autodescription-site-settings[homepage_description]"),og:document.getElementById("autodescription-site-settings[homepage_og_description]"),tw:document.getElementById("autodescription-site-settings[homepage_twitter_description]")})},m=()=>confirm(b.i18n.confirmReset),n=()=>{a(".tsf-tabs-radio").on("change",(b,c)=>{let d=a(b.target);if(!d.is(":checked"))return;c="boolean"==typeof c&&c;let e=b.target.id,f=b.target.name,g="tsf-active-tab-content",h="tsf-tab-active",i=a("."+g),j=d.closest(".tsf-nav-tab-wrapper").find("."+h),k=i.find("input:invalid, select:invalid, textarea:invalid");if(k.length)return k[0].reportValidity(),j.prop("checked",!0),d.prop("checked",!1),b.stopPropagation(),b.preventDefault(),!1;let l=a("#"+e+"-content");if(j.removeClass(h),j.siblings("label").removeClass("tsf-no-focus-ring"),d.addClass(h),c){let b=a("."+f+"-content");b.removeClass(g).hide(),l.addClass(g).show(),a("#"+e).trigger("tsf-tab-toggled")}else if(l.length&&!l.is(i)){let b=a("."+f+"-content");b.fadeOut(150,function(){a(this).removeClass(g)}),setTimeout(()=>{l.addClass(g).fadeIn(250)},150),setTimeout(()=>{a("#"+e).trigger("tsf-tab-toggled")},175)}});a(".tsf-nav-tab-wrapper").on("click.tsfNavTab",".tsf-nav-tab",a=>{a.currentTarget.classList.add("tsf-no-focus-ring")});a(document.body).on("tsf-ready",()=>{a(".tsf-tabs-radio:checked").each((b,c)=>{a(c).trigger("change",[!0])})})};return Object.assign({load:()=>{a("div.updated, div.error, div.notice, .notice-error, .notice-warning, .notice-info").insertAfter(".tsf-top-wrap"),a(document.body).on("tsf-onload",k),a(document.body).on("tsf-ready",l),a(".tsf-js-confirm-reset").on("click",m),n()}},{},{l10n:b})}(jQuery),jQuery(window.tsfSettings.load);
lib/js/title.js CHANGED
@@ -198,6 +198,7 @@ window.tsfTitle = function( $ ) {
198
  * Updates hover prefix.
199
  *
200
  * @since 4.0.0
 
201
  * @access private
202
  *
203
  * @return {undefined}
@@ -209,11 +210,19 @@ window.tsfTitle = function( $ ) {
209
  if ( prefixValue ) {
210
  switch ( state.prefixPlacement ) {
211
  case 'before':
212
- value = prefixValue + ' ';
 
 
 
 
213
  break;
214
 
215
  case 'after':
216
- value = ' ' + prefixValue;
 
 
 
 
217
  break;
218
  }
219
  }
@@ -376,6 +385,7 @@ window.tsfTitle = function( $ ) {
376
  * Used by the character counters, pixel counters, and social meta inputs.
377
  *
378
  * @since 4.0.0
 
379
  * @access private
380
  *
381
  * @function
@@ -394,13 +404,21 @@ window.tsfTitle = function( $ ) {
394
  text = event.target.placeholder;
395
  } else {
396
  if ( prefix.length ) {
397
- switch ( state.additionPlacement ) {
398
  case 'before':
399
- text = prefix + text;
 
 
 
 
400
  break;
401
 
402
  case 'after':
403
- text = text + prefix;
 
 
 
 
404
  break;
405
  }
406
  }
198
  * Updates hover prefix.
199
  *
200
  * @since 4.0.0
201
+ * @since 4.0.6 Now changes behavior depending on RTL-status.
202
  * @access private
203
  *
204
  * @return {undefined}
210
  if ( prefixValue ) {
211
  switch ( state.prefixPlacement ) {
212
  case 'before':
213
+ if ( tsf.l10n.states.isRTL ) {
214
+ value = ' ' + prefixValue;
215
+ } else {
216
+ value = prefixValue + ' ';
217
+ }
218
  break;
219
 
220
  case 'after':
221
+ if ( tsf.l10n.states.isRTL ) {
222
+ value = prefixValue + ' ';
223
+ } else {
224
+ value = ' ' + prefixValue;
225
+ }
226
  break;
227
  }
228
  }
385
  * Used by the character counters, pixel counters, and social meta inputs.
386
  *
387
  * @since 4.0.0
388
+ * @since 4.0.6 Now changes behavior depending on RTL-status.
389
  * @access private
390
  *
391
  * @function
404
  text = event.target.placeholder;
405
  } else {
406
  if ( prefix.length ) {
407
+ switch ( state.prefixPlacement ) {
408
  case 'before':
409
+ if ( tsf.l10n.states.isRTL ) {
410
+ text = text + prefix;
411
+ } else {
412
+ text = prefix + text;
413
+ }
414
  break;
415
 
416
  case 'after':
417
+ if ( tsf.l10n.states.isRTL ) {
418
+ text = prefix + text;
419
+ } else {
420
+ text = text + prefix;
421
+ }
422
  break;
423
  }
424
  }
lib/js/title.min.js CHANGED
@@ -1 +1 @@
1
- 'use strict';window.tsfTitle=function(a){const b="undefined"!=typeof tsfTitleL10n&&tsfTitleL10n;let c,d={allowReferenceChange:!0,useTagline:b.states.useTagline,separator:b.states.titleSeparator,additionPlacement:b.states.additionPlacement,prefixPlacement:b.states.prefixPlacement,additionValue:tsf.escapeString(b.states.additionValue.trim()),prefixValue:"",defaultTitle:tsf.escapeString(b.states.defaultTitle.trim())};const e=tsf.escapeString(b.params.untitledTitle);let f="",g="";const h=document.getElementById("tsf-title-placeholder-prefix")||a("</span>")[0],i=document.getElementById("tsf-title-placeholder")||a("</span>")[0],j=a=>a?a in d?d[a]:void 0:d,k=()=>{let a="",b="";if(d.useTagline&&(b=d.additionValue),b)switch(d.additionPlacement){case"before":a=b+" "+d.separator+" ";break;case"after":a=" "+d.separator+" "+b;}f=a||"",i.innerHTML=f},l=()=>{let a="",b=d.prefixValue.trim();if(b)switch(d.prefixPlacement){case"before":a=b+" ";break;case"after":a=" "+b;}g=a||"",h.innerHTML=g},m=function(b){if(!i&&!h)return;let c=a(b.target),e=c.val(),j=!!f.length,k=!!g.length;if(!j&&i&&(i.style.display="none"),!k&&h&&(h.style.display="none"),!j&&!k)return void c.css("text-indent","initial");if(!e.length)return c.css("text-indent","initial"),i&&(i.style.display="none"),void(h&&(h.style.display="none"));let l=c.outerWidth(!0),m=(c.outerHeight(!0)-c.height())/2,n=(l-c.innerWidth())/2,o=tsf.l10n.states.isRTL?"right":"left",p=(c.outerWidth(!0)-c.width())/2,q={display:c.css("display"),lineHeight:c.css("lineHeight"),fontFamily:c.css("fontFamily"),fontWeight:c.css("fontWeight"),fontSize:c.css("fontSize"),letterSpacing:c.css("letterSpacing"),paddingTop:m+"px",paddingBottom:m+"px"},r=a(h),s=a(i),t=0,u=0,v=0,w=0,x=0,y=0;if(k&&(r.css(q),r.css({maxWidth:"initial"}),x=r[0].getBoundingClientRect().width,x<y&&(x=0)),j){let b=0;switch((()=>{let c=a("#tsf-title-offset");c.text(e),c.css({fontFamily:q.fontFamily,fontWeight:q.fontWeight,letterSpacing:q.letterSpacing,fontSize:q.fontSize}),b=c[0].getBoundingClientRect().width})(),t=c[0].getBoundingClientRect().width-n-p-b-x,t<y&&(x+=t,t=0),s.css(q),s.css({maxWidth:"initial"}),d.additionPlacement){case"before":let f=s[0].getBoundingClientRect().width;f=t<f?t:f,f<y&&(f=0),t=f,w+=t,v+=t,u+=p;break;case"after":u+=p+b+x;}}v+=p,x=0>x?0:x,w+=x;let z;k&&(z={},z[o]=v+"px",z.maxWidth=x+"px",r.css(z)),j&&(z={},z[o]=u+"px",z.maxWidth=t+"px",s.css(z)),z={},z["text-indent"]=w+"px",c.css(z)},n=b=>{let c=document.getElementById("tsf-title-reference"),e=d.allowReferenceChange&&b.target.value||d.defaultTitle;if(c){if(e=e.trim(),1>e.length||!d.allowReferenceChange)e=b.target.placeholder;else{if(g.length)switch(d.additionPlacement){case"before":e=g+e;break;case"after":e+=g;}if(f.length)switch(d.additionPlacement){case"before":e=f+e;break;case"after":e+=f;}}c.innerHTML=tsf.escapeString(tsf.decodeEntities(tsf.sDoubleSpace(e.trim()))),setTimeout(()=>{a(c).change()},0)}},o=a=>{!d.allowReferenceChange||a.target.value||(a.target.placeholder=document.getElementById("tsf-title-reference").innerText)},p=a=>{let b=document.getElementById(a.target.id+"_chars"),c=document.getElementById("tsf-title-reference");b&&tsfC&&tsfC.updateCharacterCounter({e:b,text:c.innerHTML,field:"title",type:"search"})},q=a=>{let b=document.getElementById(a.target.id+"_pixels"),c=document.getElementById("tsf-title-reference");b&&tsfC&&tsfC.updatePixelCounter({e:b,text:c.innerHTML,field:"title",type:"search"})},r=()=>{a(c).trigger("input.tsfUpdateTitles")},s=()=>{a(c).trigger("tsf-update-title-counter")},t=a=>{m(a),n(a),o(a),u(a)},u=a=>{p(a),q(a)};let v=0;const w=()=>{clearTimeout(v),v=setTimeout(r,10)},x=()=>{if(!tsfAys)r();else{let a=tsfAys.getChangedState;r(),a||tsfAys.reset()}};let y=0;const z=()=>{clearTimeout(y),y=setTimeout(x,10)},A=b=>{let c=a(b.target).siblings("input").first();if(c.length){let a=c[0];switch(a.focus(),b.detail){case 3:a.setSelectionRange(0,a.value.length);break;case 2:let c,e;"tsf-title-placeholder"===b.target.id&&"after"===d.additionPlacement||"tsf-title-placeholder-prefix"===b.target.id&&tsf.l10n.states.isTRL?(c=a.value.replace(/([0-9A-Z_a-z]+|[\t-\r \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]+)$/u,"").length,e=a.value.length):(c=0,e=a.value.length-a.value.replace(/^([\t-\r \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]+|[0-9A-Z_a-z]+)/u,"").length),a.setSelectionRange(c,e);break;case 1:default:let f="tsf-title-placeholder"===b.target.id&&"after"===d.additionPlacement?a.value.length:0;a.setSelectionRange(f,f);}}};let B=window.innerWidth;const C=()=>{let a=window.innerWidth;B<a?782>=B&&782<=a&&x():782<=B&&782>=a&&x(),B=a},D=()=>{h.addEventListener("click",A),i.addEventListener("click",A),a(document).on("wp-window-resized",C),a(window).on("tsf-counter-updated",w)},E=()=>{!c instanceof Element||(a(c).on("input.tsfUpdateTitles",t),a(c).on("tsf-update-title-counter",u),k(),l(),z())};return Object.assign({load:()=>{a(document.body).on("tsf-onload",D),a(document.body).on("tsf-ready",E)}},{setInputElement:a=>{c=a},getState:j,updateState:(a,b)=>{switch(d[a]=b,a){case"prefixValue":case"prefixPlacement":l(),w();break;case"useTagline":case"separator":case"additionValue":case"additionPlacement":k(),w();break;case"allowReferenceChange":case"defaultTitle":default:w();}},triggerCounter:s,triggerInput:r,enqueueTriggerInput:w,triggerUnregisteredInput:x,enqueueUnregisteredInputTrigger:z},{l10n:b,untitledTitle:e})}(jQuery),jQuery(window.tsfTitle.load);
1
+ 'use strict';window.tsfTitle=function(a){const b="undefined"!=typeof tsfTitleL10n&&tsfTitleL10n;let c,d={allowReferenceChange:!0,useTagline:b.states.useTagline,separator:b.states.titleSeparator,additionPlacement:b.states.additionPlacement,prefixPlacement:b.states.prefixPlacement,additionValue:tsf.escapeString(b.states.additionValue.trim()),prefixValue:"",defaultTitle:tsf.escapeString(b.states.defaultTitle.trim())};const e=tsf.escapeString(b.params.untitledTitle);let f="",g="";const h=document.getElementById("tsf-title-placeholder-prefix")||a("</span>")[0],i=document.getElementById("tsf-title-placeholder")||a("</span>")[0],j=a=>a?a in d?d[a]:void 0:d,k=()=>{let a="",b="";if(d.useTagline&&(b=d.additionValue),b)switch(d.additionPlacement){case"before":a=b+" "+d.separator+" ";break;case"after":a=" "+d.separator+" "+b;}f=a||"",i.innerHTML=f},l=()=>{let a="",b=d.prefixValue.trim();if(b)switch(d.prefixPlacement){case"before":a=tsf.l10n.states.isRTL?" "+b:b+" ";break;case"after":a=tsf.l10n.states.isRTL?b+" ":" "+b;}g=a||"",h.innerHTML=g},m=function(b){if(!i&&!h)return;let c=a(b.target),e=c.val(),j=!!f.length,k=!!g.length;if(!j&&i&&(i.style.display="none"),!k&&h&&(h.style.display="none"),!j&&!k)return void c.css("text-indent","initial");if(!e.length)return c.css("text-indent","initial"),i&&(i.style.display="none"),void(h&&(h.style.display="none"));let l=c.outerWidth(!0),m=(c.outerHeight(!0)-c.height())/2,n=(l-c.innerWidth())/2,o=tsf.l10n.states.isRTL?"right":"left",p=(c.outerWidth(!0)-c.width())/2,q={display:c.css("display"),lineHeight:c.css("lineHeight"),fontFamily:c.css("fontFamily"),fontWeight:c.css("fontWeight"),fontSize:c.css("fontSize"),letterSpacing:c.css("letterSpacing"),paddingTop:m+"px",paddingBottom:m+"px"},r=a(h),s=a(i),t=0,u=0,v=0,w=0,x=0,y=0;if(k&&(r.css(q),r.css({maxWidth:"initial"}),x=r[0].getBoundingClientRect().width,x<y&&(x=0)),j){let b=0;switch((()=>{let c=a("#tsf-title-offset");c.text(e),c.css({fontFamily:q.fontFamily,fontWeight:q.fontWeight,letterSpacing:q.letterSpacing,fontSize:q.fontSize}),b=c[0].getBoundingClientRect().width})(),t=c[0].getBoundingClientRect().width-n-p-b-x,t<y&&(x+=t,t=0),s.css(q),s.css({maxWidth:"initial"}),d.additionPlacement){case"before":let f=s[0].getBoundingClientRect().width;f=t<f?t:f,f<y&&(f=0),t=f,w+=t,v+=t,u+=p;break;case"after":u+=p+b+x;}}v+=p,x=0>x?0:x,w+=x;let z;k&&(z={},z[o]=v+"px",z.maxWidth=x+"px",r.css(z)),j&&(z={},z[o]=u+"px",z.maxWidth=t+"px",s.css(z)),z={},z["text-indent"]=w+"px",c.css(z)},n=b=>{let c=document.getElementById("tsf-title-reference"),e=d.allowReferenceChange&&b.target.value||d.defaultTitle;if(c){if(e=e.trim(),1>e.length||!d.allowReferenceChange)e=b.target.placeholder;else{if(g.length)switch(d.prefixPlacement){case"before":tsf.l10n.states.isRTL?e+=g:e=g+e;break;case"after":tsf.l10n.states.isRTL?e=g+e:e+=g;}if(f.length)switch(d.additionPlacement){case"before":e=f+e;break;case"after":e+=f;}}c.innerHTML=tsf.escapeString(tsf.decodeEntities(tsf.sDoubleSpace(e.trim()))),setTimeout(()=>{a(c).change()},0)}},o=a=>{!d.allowReferenceChange||a.target.value||(a.target.placeholder=document.getElementById("tsf-title-reference").innerText)},p=a=>{let b=document.getElementById(a.target.id+"_chars"),c=document.getElementById("tsf-title-reference");b&&tsfC&&tsfC.updateCharacterCounter({e:b,text:c.innerHTML,field:"title",type:"search"})},q=a=>{let b=document.getElementById(a.target.id+"_pixels"),c=document.getElementById("tsf-title-reference");b&&tsfC&&tsfC.updatePixelCounter({e:b,text:c.innerHTML,field:"title",type:"search"})},r=()=>{a(c).trigger("input.tsfUpdateTitles")},s=()=>{a(c).trigger("tsf-update-title-counter")},t=a=>{m(a),n(a),o(a),u(a)},u=a=>{p(a),q(a)};let v=0;const w=()=>{clearTimeout(v),v=setTimeout(r,10)},x=()=>{if(!tsfAys)r();else{let a=tsfAys.getChangedState;r(),a||tsfAys.reset()}};let y=0;const z=()=>{clearTimeout(y),y=setTimeout(x,10)},A=b=>{let c=a(b.target).siblings("input").first();if(c.length){let a=c[0];switch(a.focus(),b.detail){case 3:a.setSelectionRange(0,a.value.length);break;case 2:let c,e;"tsf-title-placeholder"===b.target.id&&"after"===d.additionPlacement||"tsf-title-placeholder-prefix"===b.target.id&&tsf.l10n.states.isTRL?(c=a.value.replace(/(\w+|\s+)$/u,"").length,e=a.value.length):(c=0,e=a.value.length-a.value.replace(/^(\s+|\w+)/u,"").length),a.setSelectionRange(c,e);break;case 1:default:let f="tsf-title-placeholder"===b.target.id&&"after"===d.additionPlacement?a.value.length:0;a.setSelectionRange(f,f);}}};let B=window.innerWidth;const C=()=>{let a=window.innerWidth;B<a?782>=B&&782<=a&&x():782<=B&&782>=a&&x(),B=a},D=()=>{h.addEventListener("click",A),i.addEventListener("click",A),a(document).on("wp-window-resized",C),a(window).on("tsf-counter-updated",w)},E=()=>{!c instanceof Element||(a(c).on("input.tsfUpdateTitles",t),a(c).on("tsf-update-title-counter",u),k(),l(),z())};return Object.assign({load:()=>{a(document.body).on("tsf-onload",D),a(document.body).on("tsf-ready",E)}},{setInputElement:a=>{c=a},getState:j,updateState:(a,b)=>{switch(d[a]=b,a){case"prefixValue":case"prefixPlacement":l(),w();break;case"useTagline":case"separator":case"additionValue":case"additionPlacement":k(),w();break;case"allowReferenceChange":case"defaultTitle":default:w();}},triggerCounter:s,triggerInput:r,enqueueTriggerInput:w,triggerUnregisteredInput:x,enqueueUnregisteredInputTrigger:z},{l10n:b,untitledTitle:e})}(jQuery),jQuery(window.tsfTitle.load);
readme.txt CHANGED
@@ -4,7 +4,7 @@ Tags: seo, xml sitemap, google search, open graph, schema.org, twitter card, per
4
  Requires at least: 4.9.0
5
  Tested up to: 5.4
6
  Requires PHP: 5.6.0
7
- Stable tag: 4.0.5
8
  License: GPLv3
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
 
@@ -76,10 +76,11 @@ The SEO Framework sends us no information and does not create cookies. Learn mor
76
 
77
  For additional functionality, check out our free companion plugin [Extension Manager](https://theseoframework.com/?p=2760). It provides numerous free and paid extensions, such as:
78
 
79
- * [Local](https://theseoframework.com/?p=2306) lets you set up **important local business information** for search engines to consume.
80
- * [Focus](https://theseoframework.com/?p=2305) guides you through the process of writing targeted content that ranks with **focus keywords**, and for Premium users also their inflections and synonyms.
81
  * [Articles](https://theseoframework.com/?p=2303) **enhances your published posts** by automatically adding important Structured Data.
82
  * [Honeypot](https://theseoframework.com/?p=2300) **catches comment spammers** through four lightweight yet powerful ways.
 
 
83
  * [AMP](https://theseoframework.com/?p=2304) **binds The SEO Framework to the AMP plugin** for AMP supported articles and pages.
84
  * [Monitor](https://theseoframework.com/?p=2302) **keeps track of your website's SEO** optimizations and statistics.
85
  * [Incognito](https://theseoframework.com/?p=2301) **hides all development-comments** from The SEO Framework.
@@ -228,6 +229,12 @@ If you wish to display breadcrumbs, then your theme should provide this. Alterna
228
 
229
  == Changelog ==
230
 
 
 
 
 
 
 
231
  = 4.0.5 =
232
 
233
  In WordPress, we found various query endpoints that can be malformed to create broken pages. Backlinks to these pages can harm your site's ranking. In this update, we added advanced query protection, which you can enable via the robots meta settings.
@@ -236,7 +243,7 @@ The ["Connected Social Pages" input fields will now disappear](https://github.co
236
 
237
  On the other hand, we added a new feed indexing option, Discord sharing options (oEmbed, theme color), and the aforementioned advanced query protection option. Support for EDD and Polylang has been expanded, and we reintroduced the hyphen option for titles (which is the new default).
238
 
239
- In this update, we bring a few other quality-of-life changes, as well. We added a dozen new filters, touched up the interface, streamlined the query handler, and [fixed known corner-case issues and bugs](https://theseoframework.com/?p=3505#detailed).
240
 
241
  = 4.0.4 =
242
 
4
  Requires at least: 4.9.0
5
  Tested up to: 5.4
6
  Requires PHP: 5.6.0
7
+ Stable tag: 4.0.6
8
  License: GPLv3
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
 
76
 
77
  For additional functionality, check out our free companion plugin [Extension Manager](https://theseoframework.com/?p=2760). It provides numerous free and paid extensions, such as:
78
 
79
+ * [Focus](https://theseoframework.com/?p=2305) guides you through the process of writing targeted content that ranks with **focus keywords and synonyms**.
 
80
  * [Articles](https://theseoframework.com/?p=2303) **enhances your published posts** by automatically adding important Structured Data.
81
  * [Honeypot](https://theseoframework.com/?p=2300) **catches comment spammers** through four lightweight yet powerful ways.
82
+ * [Cord](https://theseoframework.com/?p=3404) helps you connect your website to **Google Analytics and Facebook Pixel**.
83
+ * [Local](https://theseoframework.com/?p=2306) lets you set up **important local business information** for search engines to consume.
84
  * [AMP](https://theseoframework.com/?p=2304) **binds The SEO Framework to the AMP plugin** for AMP supported articles and pages.
85
  * [Monitor](https://theseoframework.com/?p=2302) **keeps track of your website's SEO** optimizations and statistics.
86
  * [Incognito](https://theseoframework.com/?p=2301) **hides all development-comments** from The SEO Framework.
229
 
230
  == Changelog ==
231
 
232
+ = 4.0.6 =
233
+
234
+ In this update, we addressed a few issues our amazing users helped investigate. With that, we implemented better bbPress title support, and fixed a bug regarding WooCommerce and term-ID collisions.
235
+
236
+ We also increased the entropy for generating object caching keys, addressed some translation and RTL errors, and added [a few new filters](https://theseoframework.com/?p=3537).
237
+
238
  = 4.0.5 =
239
 
240
  In WordPress, we found various query endpoints that can be malformed to create broken pages. Backlinks to these pages can harm your site's ranking. In this update, we added advanced query protection, which you can enable via the robots meta settings.
243
 
244
  On the other hand, we added a new feed indexing option, Discord sharing options (oEmbed, theme color), and the aforementioned advanced query protection option. Support for EDD and Polylang has been expanded, and we reintroduced the hyphen option for titles (which is the new default).
245
 
246
+ In this update, we also bring a few other quality-of-life changes, as well. We added a dozen new filters, touched up the interface, streamlined the query handler, and [fixed known corner-case issues and bugs](https://theseoframework.com/?p=3505).
247
 
248
  = 4.0.4 =
249