Yoast SEO - Version 14.0.3

Version Description

Release Date: April 30th, 2020

Bugfixes:

  • Fixes a bug where running the migrations could cause fatal errors on sites where plugins are installed remotely. Some remote plugin installers don't remove files that are removed in an update. Since our migration runner goes through all migrations on the server, this could lead to fatal errors.
  • Fixes a bug where the pre_get_document_title filter could be skipped when other plugins were using this filter as well.
  • Fixes a bug where an error would be thrown when the name of an indexable table had been converted to a different case.
  • Fixes a bug where a taxonomy parent would not be present in the breadcrumbs even though it was set in the breadcrumbs settings.

Enhancements:

  • Adds a missing index to the new indexables table. Props to @pagelypete.

Other:

  • Adds the wpseo_frontend_presentation filter that can be used by third-party plugins to easily alter all our meta output with 1 single filter.
Download this release

Release Info

Developer Yoast
Plugin Icon 128x128 Yoast SEO
Version 14.0.3
Comparing to
See all releases

Code changes from version 14.0.2 to 14.0.3

Files changed (120) hide show
  1. config/dependency-injection/services.php +1 -0
  2. css/dist/{admin-global-1402-rtl.css → admin-global-1403-rtl.css} +0 -0
  3. css/dist/{admin-global-1402.css → admin-global-1403.css} +0 -0
  4. css/dist/{adminbar-1402-rtl.css → adminbar-1403-rtl.css} +0 -0
  5. css/dist/{adminbar-1402.css → adminbar-1403.css} +0 -0
  6. css/dist/{alerts-1402-rtl.css → alerts-1403-rtl.css} +0 -0
  7. css/dist/{alerts-1402.css → alerts-1403.css} +0 -0
  8. css/dist/{dashboard-1402-rtl.css → dashboard-1403-rtl.css} +0 -0
  9. css/dist/{dashboard-1402.css → dashboard-1403.css} +0 -0
  10. css/dist/{edit-page-1402-rtl.css → edit-page-1403-rtl.css} +0 -0
  11. css/dist/{edit-page-1402.css → edit-page-1403.css} +0 -0
  12. css/dist/{featured-image-1402-rtl.css → featured-image-1403-rtl.css} +0 -0
  13. css/dist/{featured-image-1402.css → featured-image-1403.css} +0 -0
  14. css/dist/{filter-explanation-1402-rtl.css → filter-explanation-1403-rtl.css} +0 -0
  15. css/dist/{filter-explanation-1402.css → filter-explanation-1403.css} +0 -0
  16. css/dist/{inside-editor-1402-rtl.css → inside-editor-1403-rtl.css} +0 -0
  17. css/dist/{inside-editor-1402.css → inside-editor-1403.css} +0 -0
  18. css/dist/{metabox-1402-rtl.css → metabox-1403-rtl.css} +0 -0
  19. css/dist/{metabox-1402.css → metabox-1403.css} +0 -0
  20. css/dist/{metabox-primary-category-1402-rtl.css → metabox-primary-category-1403-rtl.css} +0 -0
  21. css/dist/{metabox-primary-category-1402.css → metabox-primary-category-1403.css} +0 -0
  22. css/dist/{monorepo-1402-rtl.css → monorepo-1403-rtl.css} +0 -0
  23. css/dist/{monorepo-1402.css → monorepo-1403.css} +0 -0
  24. css/dist/{search-appearance-1402-rtl.css → search-appearance-1403-rtl.css} +0 -0
  25. css/dist/{search-appearance-1402.css → search-appearance-1403.css} +0 -0
  26. css/dist/{structured-data-blocks-1402-rtl.css → structured-data-blocks-1403-rtl.css} +0 -0
  27. css/dist/{structured-data-blocks-1402.css → structured-data-blocks-1403.css} +0 -0
  28. css/dist/{toggle-switch-1402-rtl.css → toggle-switch-1403-rtl.css} +0 -0
  29. css/dist/{toggle-switch-1402.css → toggle-switch-1403.css} +0 -0
  30. css/dist/{wpseo-dismissible-1402-rtl.css → wpseo-dismissible-1403-rtl.css} +0 -0
  31. css/dist/{wpseo-dismissible-1402.css → wpseo-dismissible-1403.css} +0 -0
  32. css/dist/{yoast-components-1402-rtl.css → yoast-components-1403-rtl.css} +0 -0
  33. css/dist/{yoast-components-1402.css → yoast-components-1403.css} +0 -0
  34. css/dist/{yoast-extensions-1402-rtl.css → yoast-extensions-1403-rtl.css} +0 -0
  35. css/dist/{yoast-extensions-1402.css → yoast-extensions-1403.css} +0 -0
  36. css/dist/{yst_plugin_tools-1402-rtl.css → yst_plugin_tools-1403-rtl.css} +0 -0
  37. css/dist/{yst_plugin_tools-1402.css → yst_plugin_tools-1403.css} +0 -0
  38. css/dist/{yst_seo_score-1402-rtl.css → yst_seo_score-1403-rtl.css} +0 -0
  39. css/dist/{yst_seo_score-1402.css → yst_seo_score-1403.css} +0 -0
  40. deprecated/frontend/breadcrumbs.php +4 -1
  41. deprecated/frontend/frontend.php +31 -20
  42. inc/class-upgrade.php +41 -33
  43. js/dist/{analysis-1402.js → analysis-1403.js} +0 -0
  44. js/dist/{babel-polyfill-1402.js → babel-polyfill-1403.js} +0 -0
  45. js/dist/{commons-1402.js → commons-1403.js} +0 -0
  46. js/dist/{components-1402.js → components-1403.js} +0 -0
  47. js/dist/{configuration-wizard-1402.js → configuration-wizard-1403.js} +0 -0
  48. js/dist/{help-scout-beacon-1402.js → help-scout-beacon-1403.js} +0 -0
  49. js/dist/{jed-1402.js → jed-1403.js} +0 -0
  50. js/dist/{redux-1402.js → redux-1403.js} +0 -0
  51. js/dist/{search-appearance-1402.js → search-appearance-1403.js} +0 -0
  52. js/dist/{styled-components-1402.js → styled-components-1403.js} +0 -0
  53. js/dist/{wp-seo-admin-1402.js → wp-seo-admin-1403.js} +0 -0
  54. js/dist/{wp-seo-admin-global-1402.js → wp-seo-admin-global-1403.js} +0 -0
  55. js/dist/{wp-seo-admin-gsc-1402.js → wp-seo-admin-gsc-1403.js} +0 -0
  56. js/dist/{wp-seo-admin-media-1402.js → wp-seo-admin-media-1403.js} +0 -0
  57. js/dist/{wp-seo-analysis-worker-1402.js → wp-seo-analysis-worker-1403.js} +0 -0
  58. js/dist/{wp-seo-api-1402.js → wp-seo-api-1403.js} +0 -0
  59. js/dist/{wp-seo-bulk-editor-1402.js → wp-seo-bulk-editor-1403.js} +0 -0
  60. js/dist/{wp-seo-dashboard-widget-1402.js → wp-seo-dashboard-widget-1403.js} +0 -0
  61. js/dist/{wp-seo-edit-page-1402.js → wp-seo-edit-page-1403.js} +0 -0
  62. js/dist/{wp-seo-featured-image-1402.js → wp-seo-featured-image-1403.js} +0 -0
  63. js/dist/{wp-seo-filter-explanation-1402.js → wp-seo-filter-explanation-1403.js} +0 -0
  64. js/dist/{wp-seo-indexation-1402.js → wp-seo-indexation-1403.js} +0 -0
  65. js/dist/{wp-seo-metabox-1402.js → wp-seo-metabox-1403.js} +0 -0
  66. js/dist/{wp-seo-metabox-category-1402.js → wp-seo-metabox-category-1403.js} +0 -0
  67. js/dist/{wp-seo-modal-1402.js → wp-seo-modal-1403.js} +0 -0
  68. js/dist/{wp-seo-network-admin-1402.js → wp-seo-network-admin-1403.js} +0 -0
  69. js/dist/{wp-seo-post-scraper-1402.js → wp-seo-post-scraper-1403.js} +0 -0
  70. js/dist/{wp-seo-quick-edit-handler-1402.js → wp-seo-quick-edit-handler-1403.js} +0 -0
  71. js/dist/{wp-seo-recalculate-1402.js → wp-seo-recalculate-1403.js} +0 -0
  72. js/dist/{wp-seo-reindex-links-1402.js → wp-seo-reindex-links-1403.js} +0 -0
  73. js/dist/{wp-seo-replacevar-plugin-1402.js → wp-seo-replacevar-plugin-1403.js} +0 -0
  74. js/dist/{wp-seo-shortcode-plugin-1402.js → wp-seo-shortcode-plugin-1403.js} +0 -0
  75. js/dist/{wp-seo-structured-data-blocks-1402.js → wp-seo-structured-data-blocks-1403.js} +0 -0
  76. js/dist/{wp-seo-term-scraper-1402.js → wp-seo-term-scraper-1403.js} +0 -0
  77. js/dist/{wp-seo-used-keywords-assessment-1402.js → wp-seo-used-keywords-assessment-1403.js} +0 -0
  78. languages/wordpress-seo-ro_RO.json +1 -1
  79. languages/wordpress-seojs-ro_RO.json +1 -1
  80. lib/orm.php +3 -4
  81. lib/ruckusing-adapter.php +186 -56
  82. readme.txt +19 -1
  83. {migrations → src/config/migrations}/20171228151840_WpYoastIndexable.php +0 -0
  84. {migrations → src/config/migrations}/20171228151841_WpYoastPrimaryTerm.php +0 -0
  85. {migrations → src/config/migrations}/20190529075038_WpYoastDropIndexableMetaTableIfExists.php +0 -0
  86. {migrations → src/config/migrations}/20191011111109_WpYoastIndexableHierarchy.php +0 -0
  87. {migrations → src/config/migrations}/20200408101900_AddCollationToTables.php +0 -0
  88. {migrations → src/config/migrations}/20200420073606_AddColumnsToIndexables.php +0 -0
  89. {migrations → src/config/migrations}/20200428123747_BreadcrumbTitleAndHierarchyReset.php +0 -0
  90. {migrations → src/config/migrations}/20200428194858_ExpandIndexableColumnLengths.php +0 -0
  91. {migrations → src/config/migrations}/20200429105310_TruncateIndexableTables.php +0 -0
  92. src/config/migrations/20200430075614_AddIndexableObjectIdAndTypeIndex.php +56 -0
  93. {migrations → src/config/migrations}/ruckusing/lib/Ruckusing/Adapter/why +0 -0
  94. {migrations → src/config/migrations}/ruckusing/lib/Task/why +0 -0
  95. src/config/ruckusing-framework.php +1 -1
  96. src/generated/container.php +1 -1
  97. src/generators/breadcrumbs-generator.php +37 -6
  98. src/initializers/migration-runner.php +1 -1
  99. src/integrations/breadcrumbs-integration.php +4 -1
  100. src/integrations/front-end-integration.php +11 -2
  101. src/integrations/third-party/woocommerce.php +38 -3
  102. src/presenters/title-presenter.php +13 -0
  103. src/repositories/indexable-hierarchy-repository.php +4 -5
  104. src/repositories/indexable-repository.php +3 -5
  105. src/repositories/primary-term-repository.php +4 -6
  106. src/repositories/seo-links-repository.php +3 -5
  107. src/repositories/seo-meta-repository.php +4 -6
  108. src/routes/route-interface.php +1 -1
  109. src/surfaces/values/meta.php +9 -4
  110. vendor/autoload.php +1 -1
  111. vendor/autoload_52.php +0 -7
  112. vendor/composer/ClassLoader.php +4 -4
  113. vendor/composer/ClassLoader52.php +0 -271
  114. vendor/composer/autoload_classmap.php +10 -5
  115. vendor/composer/autoload_real.php +4 -7
  116. vendor/composer/autoload_real_52.php +0 -58
  117. vendor/composer/autoload_static.php +14 -9
  118. vendor_prefixed/j4mie/idiorm/idiorm.php +0 -2415
  119. wp-seo-main.php +1 -1
  120. wp-seo.php +1 -1
config/dependency-injection/services.php CHANGED
@@ -44,6 +44,7 @@ $excluded_directories = [
44
  'backwards-compatibility',
45
  'surfaces/values',
46
  'presenters',
 
47
  ];
48
 
49
  $excluded = \implode( ',', \array_merge( $excluded_directories, $excluded_files ) );
44
  'backwards-compatibility',
45
  'surfaces/values',
46
  'presenters',
47
+ 'config/migrations',
48
  ];
49
 
50
  $excluded = \implode( ',', \array_merge( $excluded_directories, $excluded_files ) );
css/dist/{admin-global-1402-rtl.css → admin-global-1403-rtl.css} RENAMED
File without changes
css/dist/{admin-global-1402.css → admin-global-1403.css} RENAMED
File without changes
css/dist/{adminbar-1402-rtl.css → adminbar-1403-rtl.css} RENAMED
File without changes
css/dist/{adminbar-1402.css → adminbar-1403.css} RENAMED
File without changes
css/dist/{alerts-1402-rtl.css → alerts-1403-rtl.css} RENAMED
File without changes
css/dist/{alerts-1402.css → alerts-1403.css} RENAMED
File without changes
css/dist/{dashboard-1402-rtl.css → dashboard-1403-rtl.css} RENAMED
File without changes
css/dist/{dashboard-1402.css → dashboard-1403.css} RENAMED
File without changes
css/dist/{edit-page-1402-rtl.css → edit-page-1403-rtl.css} RENAMED
File without changes
css/dist/{edit-page-1402.css → edit-page-1403.css} RENAMED
File without changes
css/dist/{featured-image-1402-rtl.css → featured-image-1403-rtl.css} RENAMED
File without changes
css/dist/{featured-image-1402.css → featured-image-1403.css} RENAMED
File without changes
css/dist/{filter-explanation-1402-rtl.css → filter-explanation-1403-rtl.css} RENAMED
File without changes
css/dist/{filter-explanation-1402.css → filter-explanation-1403.css} RENAMED
File without changes
css/dist/{inside-editor-1402-rtl.css → inside-editor-1403-rtl.css} RENAMED
File without changes
css/dist/{inside-editor-1402.css → inside-editor-1403.css} RENAMED
File without changes
css/dist/{metabox-1402-rtl.css → metabox-1403-rtl.css} RENAMED
File without changes
css/dist/{metabox-1402.css → metabox-1403.css} RENAMED
File without changes
css/dist/{metabox-primary-category-1402-rtl.css → metabox-primary-category-1403-rtl.css} RENAMED
File without changes
css/dist/{metabox-primary-category-1402.css → metabox-primary-category-1403.css} RENAMED
File without changes
css/dist/{monorepo-1402-rtl.css → monorepo-1403-rtl.css} RENAMED
File without changes
css/dist/{monorepo-1402.css → monorepo-1403.css} RENAMED
File without changes
css/dist/{search-appearance-1402-rtl.css → search-appearance-1403-rtl.css} RENAMED
File without changes
css/dist/{search-appearance-1402.css → search-appearance-1403.css} RENAMED
File without changes
css/dist/{structured-data-blocks-1402-rtl.css → structured-data-blocks-1403-rtl.css} RENAMED
File without changes
css/dist/{structured-data-blocks-1402.css → structured-data-blocks-1403.css} RENAMED
File without changes
css/dist/{toggle-switch-1402-rtl.css → toggle-switch-1403-rtl.css} RENAMED
File without changes
css/dist/{toggle-switch-1402.css → toggle-switch-1403.css} RENAMED
File without changes
css/dist/{wpseo-dismissible-1402-rtl.css → wpseo-dismissible-1403-rtl.css} RENAMED
File without changes
css/dist/{wpseo-dismissible-1402.css → wpseo-dismissible-1403.css} RENAMED
File without changes
css/dist/{yoast-components-1402-rtl.css → yoast-components-1403-rtl.css} RENAMED
File without changes
css/dist/{yoast-components-1402.css → yoast-components-1403.css} RENAMED
File without changes
css/dist/{yoast-extensions-1402-rtl.css → yoast-extensions-1403-rtl.css} RENAMED
File without changes
css/dist/{yoast-extensions-1402.css → yoast-extensions-1403.css} RENAMED
File without changes
css/dist/{yst_plugin_tools-1402-rtl.css → yst_plugin_tools-1403-rtl.css} RENAMED
File without changes
css/dist/{yst_plugin_tools-1402.css → yst_plugin_tools-1403.css} RENAMED
File without changes
css/dist/{yst_seo_score-1402-rtl.css → yst_seo_score-1403-rtl.css} RENAMED
File without changes
css/dist/{yst_seo_score-1402.css → yst_seo_score-1403.css} RENAMED
File without changes
deprecated/frontend/breadcrumbs.php CHANGED
@@ -131,7 +131,10 @@ class WPSEO_Breadcrumbs {
131
  */
132
  private function render() {
133
  $presenter = new Breadcrumbs_Presenter();
134
- $presenter->presentation = $this->context_memoizer->for_current_page()->presentation;
 
 
 
135
  $presenter->replace_vars = $this->replace_vars;
136
  $presenter->helpers = $this->helpers;
137
 
131
  */
132
  private function render() {
133
  $presenter = new Breadcrumbs_Presenter();
134
+ $context = $this->context_memoizer->for_current_page();
135
+ /** This filter is documented in src/integrations/front-end-integration.php */
136
+ $presentation = \apply_filters( 'wpseo_frontend_presentation', $context->presentation, $context );
137
+ $presenter->presentation = $presentation;
138
  $presenter->replace_vars = $this->replace_vars;
139
  $presenter->helpers = $this->helpers;
140
 
deprecated/frontend/frontend.php CHANGED
@@ -108,13 +108,14 @@ class WPSEO_Frontend {
108
  public function canonical( $echo = true, $un_paged = false, $no_override = false ) {
109
  _deprecated_function( __METHOD__, 'WPSEO 14.0' );
110
 
111
- $context = $this->context_memoizer->for_current_page();
112
  if ( ! $echo ) {
113
- return $context->presentation->canonical;
114
  }
115
 
116
  $presenter = new Canonical_Presenter();
117
- $presenter->presentation = $context->presentation;
 
118
  $presenter->helpers = $this->helpers;
119
  $presenter->replace_vars = $this->replace_vars;
120
  echo $presenter->present();
@@ -128,9 +129,8 @@ class WPSEO_Frontend {
128
  public function get_robots() {
129
  _deprecated_function( __METHOD__, 'WPSEO 14.0' );
130
 
131
- $context = $this->context_memoizer->for_current_page();
132
-
133
- return $context->presentation->robots;
134
  }
135
 
136
  /**
@@ -139,9 +139,9 @@ class WPSEO_Frontend {
139
  public function robots() {
140
  _deprecated_function( __METHOD__, 'WPSEO 14.0' );
141
 
142
- $context = $this->context_memoizer->for_current_page();
143
- $presenter = new Robots_Presenter();
144
- $presenter->presentation = $context->presentation;
145
  $presenter->helpers = $this->helpers;
146
  $presenter->replace_vars = $this->replace_vars;
147
  echo $presenter->present();
@@ -158,9 +158,9 @@ class WPSEO_Frontend {
158
  public function robots_for_single_post( $robots, $post_id = 0 ) {
159
  _deprecated_function( __METHOD__, 'WPSEO 14.0' );
160
 
161
- $context = $this->context_memoizer->for_current_page();
162
 
163
- return $context->presentation->robots;
164
  }
165
 
166
  /**
@@ -173,10 +173,10 @@ class WPSEO_Frontend {
173
  private function get_title( $object = null ) {
174
  _deprecated_function( __METHOD__, 'WPSEO 14.0' );
175
 
176
- $context = $this->context_memoizer->for_current_page();
177
- $title = $context->presentation->title;
178
 
179
- return $this->replace_vars->replace( $title, $context->presentation->source );
180
  }
181
 
182
  /**
@@ -222,16 +222,16 @@ class WPSEO_Frontend {
222
  public function adjacent_rel_links() {
223
  _deprecated_function( __METHOD__, 'WPSEO 14.0' );
224
 
225
- $context = $this->context_memoizer->for_current_page();
226
 
227
  $rel_prev_presenter = new Rel_Prev_Presenter();
228
- $rel_prev_presenter->presentation = $context->presentation;
229
  $rel_prev_presenter->helpers = $this->helpers;
230
  $rel_prev_presenter->replace_vars = $this->replace_vars;
231
  echo $rel_prev_presenter->present();
232
 
233
  $rel_next_presenter = new Rel_Next_Presenter();
234
- $rel_next_presenter->presentation = $context->presentation;
235
  $rel_next_presenter->helpers = $this->helpers;
236
  $rel_next_presenter->replace_vars = $this->replace_vars;
237
  echo $rel_next_presenter->present();
@@ -247,16 +247,27 @@ class WPSEO_Frontend {
247
  public function metadesc( $echo = true ) {
248
  _deprecated_function( __METHOD__, 'WPSEO 14.0' );
249
 
250
- $context = $this->context_memoizer->for_current_page();
251
 
252
  if ( ! $echo ) {
253
- return $context->presentation->meta_description;
254
  }
255
 
256
  $presenter = new Meta_Description_Presenter();
257
- $presenter->presentation = $context->presentation;
258
  $presenter->helpers = $this->helpers;
259
  $presenter->replace_vars = $this->replace_vars;
260
  $presenter->present();
261
  }
 
 
 
 
 
 
 
 
 
 
 
262
  }
108
  public function canonical( $echo = true, $un_paged = false, $no_override = false ) {
109
  _deprecated_function( __METHOD__, 'WPSEO 14.0' );
110
 
111
+ $presentation = $this->get_current_page_presentation();
112
  if ( ! $echo ) {
113
+ return $presentation->canonical;
114
  }
115
 
116
  $presenter = new Canonical_Presenter();
117
+ /** This filter is documented in src/integrations/front-end-integration.php */
118
+ $presenter->presentation = $presentation;
119
  $presenter->helpers = $this->helpers;
120
  $presenter->replace_vars = $this->replace_vars;
121
  echo $presenter->present();
129
  public function get_robots() {
130
  _deprecated_function( __METHOD__, 'WPSEO 14.0' );
131
 
132
+ $presentation = $this->get_current_page_presentation();
133
+ return $presentation->robots;
 
134
  }
135
 
136
  /**
139
  public function robots() {
140
  _deprecated_function( __METHOD__, 'WPSEO 14.0' );
141
 
142
+ $presentation = $this->get_current_page_presentation();
143
+ $presenter = new Robots_Presenter();
144
+ $presenter->presentation = $presentation;
145
  $presenter->helpers = $this->helpers;
146
  $presenter->replace_vars = $this->replace_vars;
147
  echo $presenter->present();
158
  public function robots_for_single_post( $robots, $post_id = 0 ) {
159
  _deprecated_function( __METHOD__, 'WPSEO 14.0' );
160
 
161
+ $presentation = $this->get_current_page_presentation();
162
 
163
+ return $presentation->robots;
164
  }
165
 
166
  /**
173
  private function get_title( $object = null ) {
174
  _deprecated_function( __METHOD__, 'WPSEO 14.0' );
175
 
176
+ $presentation = $this->get_current_page_presentation();
177
+ $title = $presentation->title;
178
 
179
+ return $this->replace_vars->replace( $title, $presentation->source );
180
  }
181
 
182
  /**
222
  public function adjacent_rel_links() {
223
  _deprecated_function( __METHOD__, 'WPSEO 14.0' );
224
 
225
+ $presentation = $this->get_current_page_presentation();
226
 
227
  $rel_prev_presenter = new Rel_Prev_Presenter();
228
+ $rel_prev_presenter->presentation = $presentation;
229
  $rel_prev_presenter->helpers = $this->helpers;
230
  $rel_prev_presenter->replace_vars = $this->replace_vars;
231
  echo $rel_prev_presenter->present();
232
 
233
  $rel_next_presenter = new Rel_Next_Presenter();
234
+ $rel_next_presenter->presentation = $presentation;
235
  $rel_next_presenter->helpers = $this->helpers;
236
  $rel_next_presenter->replace_vars = $this->replace_vars;
237
  echo $rel_next_presenter->present();
247
  public function metadesc( $echo = true ) {
248
  _deprecated_function( __METHOD__, 'WPSEO 14.0' );
249
 
250
+ $presentation = $this->get_current_page_presentation();
251
 
252
  if ( ! $echo ) {
253
+ return $presentation->meta_description;
254
  }
255
 
256
  $presenter = new Meta_Description_Presenter();
257
+ $presenter->presentation = $presentation;
258
  $presenter->helpers = $this->helpers;
259
  $presenter->replace_vars = $this->replace_vars;
260
  $presenter->present();
261
  }
262
+
263
+ /**
264
+ * Returns the current page presentation.
265
+ *
266
+ * @return Indexable_Presentation The current page presentation.
267
+ */
268
+ private function get_current_page_presentation() {
269
+ $context = $this->context_memoizer->for_current_page();
270
+ /** This filter is documented in src/integrations/front-end-integration.php */
271
+ return \apply_filters( 'wpseo_frontend_presentation', $context->presentation, $context );
272
+ }
273
  }
inc/class-upgrade.php CHANGED
@@ -19,40 +19,41 @@ class WPSEO_Upgrade {
19
  WPSEO_Options::maybe_set_multisite_defaults( false );
20
 
21
  $routines = [
22
- '1.5.0' => 'upgrade_15',
23
- '2.0' => 'upgrade_20',
24
- '2.1' => 'upgrade_21',
25
- '2.2' => 'upgrade_22',
26
- '2.3' => 'upgrade_23',
27
- '3.0' => 'upgrade_30',
28
- '3.3' => 'upgrade_33',
29
- '3.6' => 'upgrade_36',
30
- '4.0' => 'upgrade_40',
31
- '4.4' => 'upgrade_44',
32
- '4.7' => 'upgrade_47',
33
- '4.9' => 'upgrade_49',
34
- '5.0' => 'upgrade_50',
35
- '5.1' => 'upgrade_50_51',
36
- '5.5' => 'upgrade_55',
37
- '5.6' => 'upgrade_56',
38
- '6.1' => 'upgrade_61',
39
- '6.3' => 'upgrade_63',
40
- '7.0-RC0' => 'upgrade_70',
41
- '7.1-RC0' => 'upgrade_71',
42
- '7.3-RC0' => 'upgrade_73',
43
- '7.4-RC0' => 'upgrade_74',
44
- '7.5.3' => 'upgrade_753',
45
- '7.7-RC0' => 'upgrade_77',
46
- '7.7.2-RC0' => 'upgrade_772',
47
- '9.0-RC0' => 'upgrade_90',
48
- '10.0-RC0' => 'upgrade_100',
49
- '11.1-RC0' => 'upgrade_111',
50
  /** Reset notifications because we removed the AMP Glue plugin notification */
51
- '12.1-RC0' => 'clean_all_notifications',
52
- '12.3-RC0' => 'upgrade_123',
53
- '12.4-RC0' => 'upgrade_124',
54
- '12.8-RC0' => 'upgrade_128',
55
- '13.2-RC0' => 'upgrade_132',
 
56
  ];
57
 
58
  array_walk( $routines, [ $this, 'run_upgrade_routine' ], $version );
@@ -728,6 +729,13 @@ class WPSEO_Upgrade {
728
  WPSEO_Capability_Manager_Factory::get()->add();
729
  }
730
 
 
 
 
 
 
 
 
731
  /**
732
  * Removes all notifications saved in the database under 'wp_yoast_notifications'.
733
  *
19
  WPSEO_Options::maybe_set_multisite_defaults( false );
20
 
21
  $routines = [
22
+ '1.5.0' => 'upgrade_15',
23
+ '2.0' => 'upgrade_20',
24
+ '2.1' => 'upgrade_21',
25
+ '2.2' => 'upgrade_22',
26
+ '2.3' => 'upgrade_23',
27
+ '3.0' => 'upgrade_30',
28
+ '3.3' => 'upgrade_33',
29
+ '3.6' => 'upgrade_36',
30
+ '4.0' => 'upgrade_40',
31
+ '4.4' => 'upgrade_44',
32
+ '4.7' => 'upgrade_47',
33
+ '4.9' => 'upgrade_49',
34
+ '5.0' => 'upgrade_50',
35
+ '5.1' => 'upgrade_50_51',
36
+ '5.5' => 'upgrade_55',
37
+ '5.6' => 'upgrade_56',
38
+ '6.1' => 'upgrade_61',
39
+ '6.3' => 'upgrade_63',
40
+ '7.0-RC0' => 'upgrade_70',
41
+ '7.1-RC0' => 'upgrade_71',
42
+ '7.3-RC0' => 'upgrade_73',
43
+ '7.4-RC0' => 'upgrade_74',
44
+ '7.5.3' => 'upgrade_753',
45
+ '7.7-RC0' => 'upgrade_77',
46
+ '7.7.2-RC0' => 'upgrade_772',
47
+ '9.0-RC0' => 'upgrade_90',
48
+ '10.0-RC0' => 'upgrade_100',
49
+ '11.1-RC0' => 'upgrade_111',
50
  /** Reset notifications because we removed the AMP Glue plugin notification */
51
+ '12.1-RC0' => 'clean_all_notifications',
52
+ '12.3-RC0' => 'upgrade_123',
53
+ '12.4-RC0' => 'upgrade_124',
54
+ '12.8-RC0' => 'upgrade_128',
55
+ '13.2-RC0' => 'upgrade_132',
56
+ '14.0.3-RC0' => 'upgrade_1403',
57
  ];
58
 
59
  array_walk( $routines, [ $this, 'run_upgrade_routine' ], $version );
729
  WPSEO_Capability_Manager_Factory::get()->add();
730
  }
731
 
732
+ /**
733
+ * Perform the 14.0.3 upgrade.
734
+ */
735
+ private function upgrade_1403() {
736
+ WPSEO_Options::set( 'ignore_indexation_warning', false );
737
+ }
738
+
739
  /**
740
  * Removes all notifications saved in the database under 'wp_yoast_notifications'.
741
  *
js/dist/{analysis-1402.js → analysis-1403.js} RENAMED
File without changes
js/dist/{babel-polyfill-1402.js → babel-polyfill-1403.js} RENAMED
File without changes
js/dist/{commons-1402.js → commons-1403.js} RENAMED
File without changes
js/dist/{components-1402.js → components-1403.js} RENAMED
File without changes
js/dist/{configuration-wizard-1402.js → configuration-wizard-1403.js} RENAMED
File without changes
js/dist/{help-scout-beacon-1402.js → help-scout-beacon-1403.js} RENAMED
File without changes
js/dist/{jed-1402.js → jed-1403.js} RENAMED
File without changes
js/dist/{redux-1402.js → redux-1403.js} RENAMED
File without changes
js/dist/{search-appearance-1402.js → search-appearance-1403.js} RENAMED
File without changes
js/dist/{styled-components-1402.js → styled-components-1403.js} RENAMED
File without changes
js/dist/{wp-seo-admin-1402.js → wp-seo-admin-1403.js} RENAMED
File without changes
js/dist/{wp-seo-admin-global-1402.js → wp-seo-admin-global-1403.js} RENAMED
File without changes
js/dist/{wp-seo-admin-gsc-1402.js → wp-seo-admin-gsc-1403.js} RENAMED
File without changes
js/dist/{wp-seo-admin-media-1402.js → wp-seo-admin-media-1403.js} RENAMED
File without changes
js/dist/{wp-seo-analysis-worker-1402.js → wp-seo-analysis-worker-1403.js} RENAMED
File without changes
js/dist/{wp-seo-api-1402.js → wp-seo-api-1403.js} RENAMED
File without changes
js/dist/{wp-seo-bulk-editor-1402.js → wp-seo-bulk-editor-1403.js} RENAMED
File without changes
js/dist/{wp-seo-dashboard-widget-1402.js → wp-seo-dashboard-widget-1403.js} RENAMED
File without changes
js/dist/{wp-seo-edit-page-1402.js → wp-seo-edit-page-1403.js} RENAMED
File without changes
js/dist/{wp-seo-featured-image-1402.js → wp-seo-featured-image-1403.js} RENAMED
File without changes
js/dist/{wp-seo-filter-explanation-1402.js → wp-seo-filter-explanation-1403.js} RENAMED
File without changes
js/dist/{wp-seo-indexation-1402.js → wp-seo-indexation-1403.js} RENAMED
File without changes
js/dist/{wp-seo-metabox-1402.js → wp-seo-metabox-1403.js} RENAMED
File without changes
js/dist/{wp-seo-metabox-category-1402.js → wp-seo-metabox-category-1403.js} RENAMED
File without changes
js/dist/{wp-seo-modal-1402.js → wp-seo-modal-1403.js} RENAMED
File without changes
js/dist/{wp-seo-network-admin-1402.js → wp-seo-network-admin-1403.js} RENAMED
File without changes
js/dist/{wp-seo-post-scraper-1402.js → wp-seo-post-scraper-1403.js} RENAMED
File without changes
js/dist/{wp-seo-quick-edit-handler-1402.js → wp-seo-quick-edit-handler-1403.js} RENAMED
File without changes
js/dist/{wp-seo-recalculate-1402.js → wp-seo-recalculate-1403.js} RENAMED
File without changes
js/dist/{wp-seo-reindex-links-1402.js → wp-seo-reindex-links-1403.js} RENAMED
File without changes
js/dist/{wp-seo-replacevar-plugin-1402.js → wp-seo-replacevar-plugin-1403.js} RENAMED
File without changes
js/dist/{wp-seo-shortcode-plugin-1402.js → wp-seo-shortcode-plugin-1403.js} RENAMED
File without changes
js/dist/{wp-seo-structured-data-blocks-1402.js → wp-seo-structured-data-blocks-1403.js} RENAMED
File without changes
js/dist/{wp-seo-term-scraper-1402.js → wp-seo-term-scraper-1403.js} RENAMED
File without changes
js/dist/{wp-seo-used-keywords-assessment-1402.js → wp-seo-used-keywords-assessment-1403.js} RENAMED
File without changes
languages/wordpress-seo-ro_RO.json CHANGED
@@ -1 +1 @@
1
- {"domain":"wordpress-seo","locale_data":{"wordpress-seo":{"":{"domain":"wordpress-seo","plural-forms":"nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2);","lang":"ro"},"Google preview":["Previzualizare Google"],"Has feedback":["Are impresii"],"Content optimization:":["Optimizare conținut:"],"%1$sFlesch Reading Ease%2$s: The copy scores %3$s in the test, which is considered %4$s to read. %5$s":["%1$sCât de ușor este citit (Flesch Reading Ease)%2$s: textul a primit punctajul %3$s la efectuarea testului, este considerat %4$s de citit. %5$s"],"%3$sImage alt attributes%5$s: Out of %2$d images on this page, %1$d have alt attributes with words from your keyphrase or synonyms. That's a bit much. %4$sOnly include the keyphrase or its synonyms when it really fits the image%5$s.":["%3$sAtribute alt imagini%5$s: din %2$d imagini existente în această pagină, %1$d au atribute alt care cu cuvinte din fraza cheie sau sinonimele ei. E un pic cam mult. %4$sInclude numai fraza cheie sau sinonimele ei când chiar se potrivesc cu imaginea%5$s."],"%1$sImage alt attributes%2$s: Good job!":["%1$sAtribute alt imagini%2$s: Foarte bine!"],"%3$sImage alt attributes%5$s: Out of %2$d images on this page, only %1$d has an alt attribute that reflects the topic of your text. %4$sAdd your keyphrase or synonyms to the alt tags of more relevant images%5$s!":["%3$sAtribute alt imagini%5$s: din %2$d imagini existente în această pagină, numai una are un atribut alt care reflectă subiectul textului. %4$sAdaugă fraza cheie sau sinonimele ei la tagurile alt pentru mai multe imagini relevante%5$s!","%3$sAtribute alt imagini%5$s: din %2$d imagini existente în această pagină, numai %1$d au atribute alt care reflectă subiectul textului. %4$sAdaugă fraza cheie sau sinonimele ei la tagurile alt pentru mai multe imagini relevante%5$s!","%3$sAtribute alt imagini%5$s: din %2$d imagini existente în această pagină, numai %1$d au atribute alt care reflectă subiectul textului. %4$sAdaugă fraza cheie sau sinonimele ei la tagurile alt pentru mai multe imagini relevante%5$s!"],"%1$sImage alt attributes%3$s: Images on this page do not have alt attributes that reflect the topic of your text. %2$sAdd your keyphrase or synonyms to the alt tags of relevant images%3$s!":["%1$sAtribute alt imagini%3$s: imaginile din această pagină nu au atribute alt care să reflecte subiectul textului. %2$sAdaugă fraza cheie sau sinonimele ei la tagurile alt ale imaginilor relevante%3$s!"],"%1$sImage alt attributes%3$s: Images on this page have alt attributes, but you have not set your keyphrase. %2$sFix that%3$s!":["%1$sAtribute alt imagini%3$s: imaginile din această pagină au atribute alt, dar nu ai setat o frază cheie. %2$sCorectează asta%3$s!"],"%1$sKeyphrase in subheading%2$s: %3$s of your higher-level subheadings reflects the topic of your copy. Good job!":["%1$sFrază cheie în subtitluri%2$s: unul dintre subtitlurile tale reflectă subiectul textului. Foarte bine!","%1$sFrază cheie în subtitluri%2$s: %3$s dintre subtitlurile tale reflectă subiectul textului. Foarte bine!","%1$sFrază cheie în subtitluri%2$s: %3$s dintre subtitlurile tale reflectă subiectul textului. Foarte bine!"],"%1$sKeyphrase in subheading%2$s: Your higher-level subheading reflects the topic of your copy. Good job!":["%1$sFrază cheie în subtitluri%2$s: subtitlul tău reflectă subiectul textului. Foarte bine!"],"%1$sKeyphrase in subheading%3$s: %2$sUse more keyphrases or synonyms in your higher-level subheadings%3$s!":["%1$sFrază cheie în subtitluri%3$s: %2$sfolosește mai multe fraze cheie sau sinonimele ei în subtitluri%3$s!"],"%1$sSingle title%3$s: H1s should only be used as your main title. Find all H1s in your text that aren't your main title and %2$schange them to a lower heading level%3$s!":["%1$sNumai un titlu%3$s: H1 ar trebui să fie folosit numai pentru titlul principal. Găsește toate subtitlurile H1 din text care nu sunt folosite ca titlu principal și %2$smodifică-le în subtitluri inferioare (H2, H3...)%3$s!"],"%1$sKeyphrase density%2$s: The focus keyphrase was found 0 times. That's less than the recommended minimum of %3$d times for a text of this length. %4$sFocus on your keyphrase%2$s!":["%1$sDensitate frază cheie%2$s: fraza cheie nu a fost găsită. Este sub minimul recomandat de %3$d ori pentru un text de această lungime. %4$sFolosește-o mai des%2$s!"],"%1$sKeyphrase density%2$s: The focus keyphrase was found %5$d time. That's less than the recommended minimum of %3$d times for a text of this length. %4$sFocus on your keyphrase%2$s!":["%1$sDensitate frază cheie%2$s: fraza cheie a fost găsită o singură dată. Este sub minimul recomandat de %3$d ori pentru un text de această lungime. %4$sFolosește-o mai des%2$s!","%1$sDensitate frază cheie%2$s: fraza cheie a fost găsită de %5$d ori. Este sub minimul recomandat de %3$d ori pentru un text de această lungime. %4$sFolosește-o mai des%2$s!","%1$sDensitate frază cheie%2$s: fraza cheie a fost găsită de %5$d de ori. Este sub minimul recomandat de %3$d de ori pentru un text de această lungime. %4$sFolosește-o mai des%2$s!"],"%1$sKeyphrase density%2$s: The focus keyphrase was found %3$d time. This is great!":["%1$sDensitate frază cheie%2$s: fraza cheie a fost găsită o singură dată. Foarte bine!","%1$sDensitate frază cheie%2$s: fraza cheie a fost găsită de %3$d ori. Foarte bine!","%1$sDensitate frază cheie%2$s: fraza cheie a fost găsită de %3$d de ori. Foarte bine!"],"%1$sKeyphrase density%2$s: The focus keyphrase was found %5$d time. That's more than the recommended maximum of %3$d times for a text of this length. %4$sDon't overoptimize%2$s!":["%1$sDensitate frază cheie%2$s: fraza cheie a fost găsită o singură dată. Este peste maximul recomandat de %3$d ori pentru un text de această lungime. %4$sO folosești de prea multe ori%2$s!","%1$sDensitate frază cheie%2$s: fraza cheie a fost găsită de %5$d ori. Este peste maximul recomandat de %3$d ori pentru un text de această lungime. %4$sO folosești de prea multe ori%2$s!","%1$sDensitate frază cheie%2$s: fraza cheie a fost găsită de %5$d de ori. Este peste maximul recomandat de %3$d de ori pentru un text de această lungime. %4$sO folosești de prea multe ori%2$s!"],"%1$sKeyphrase density%2$s: The focus keyphrase was found %5$d time. That's way more than the recommended maximum of %3$d times for a text of this length. %4$sDon't overoptimize%2$s!":["%1$sDensitate frază cheie%2$s: fraza cheie a fost găsită o singură dată. Este cu mult peste maximul recomandat de %3$d ori pentru un text de această lungime. %4$sO folosești de prea multe ori%2$s!","%1$sDensitate frază cheie%2$s: fraza cheie a fost găsită de %5$d ori. Este cu mult peste maximul recomandat de %3$d ori pentru un text de această lungime. %4$sO folosești de prea multe ori%2$s!","%1$sDensitate frază cheie%2$s: fraza cheie a fost găsită de %5$d de ori. Este cu mult peste maximul recomandat de %3$d de ori pentru un text de această lungime. %4$sO folosești de prea multe ori%2$s!"],"%1$sFunction words in keyphrase%3$s: Your keyphrase \"%4$s\" contains function words only. %2$sLearn more about what makes a good keyphrase.%3$s":["%1$sDeterminanți în fraza cheie%3$s: fraza ta cheie „%4$s” conține numai determinanți. %2$sAflă mai multe despre cum se alcătuiește o frază cheie bună.%3$s"],"%1$sKeyphrase length%3$s: %2$sSet a keyphrase in order to calculate your SEO score%3$s.":["%1$sLungime frază cheie%3$s: %2$sintrodu o frază cheie pentru a calcula punctajul SEO%3$s."],"%1$sKeyphrase in slug%2$s: More than half of your keyphrase appears in the slug. That's great!":["%1$sFrază cheie în descriptor%2$s: mai mult de jumătate din fraza ta cheie apare în descriptor. Foarte bine!"],"%1$sKeyphrase in slug%3$s: (Part of) your keyphrase does not appear in the slug. %2$sChange that%3$s!":["%1$sFrază cheie în descriptor%3$s: fraza ta cheie (sau o parte din ea) nu apare în descriptor. %2$sCorectează asta%3$s!"],"%1$sKeyphrase in slug%2$s: Great work!":["%1$sFrază cheie în descriptor%2$s: foarte bine!"],"%1$sKeyphrase in title%3$s: Not all the words from your keyphrase \"%4$s\" appear in the SEO title. %2$sTry to use the exact match of your keyphrase in the SEO title%3$s.":["%1$sFrază cheie în titlu%3$s: în titlul SEO nu apar toate cuvintele din fraza ta cheie „%4$s”. %2$sÎncearcă să folosești în titlul SEO chiar fraza cheie%3$s."],"%1$sKeyphrase in title%3$s: Does not contain the exact match. %2$sTry to write the exact match of your keyphrase in the SEO title%3$s.":["%1$sFrază cheie în titlu%3$s: titlul nu conține fraza cheie. %2$sÎncearcă să scrii în titlul SEO chiar fraza cheie%3$s."],"%1$sKeyphrase in title%3$s: The exact match of the keyphrase appears in the SEO title, but not at the beginning. %2$sTry to move it to the beginning%3$s.":["%1$sFrază cheie în titlu%3$s: fraza cheie apare în titlul SEO, dar nu este la începutul lui. %2$sÎncearcă să o muți la începutul titlului%3$s."],"%1$sKeyphrase in title%2$s: The exact match of the keyphrase appears at the beginning of the SEO title. Good job!":["%1$sFrază cheie în titlu%2$s: fraza cheie apare la începutul titlului SEO. Foarte bine!"],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sDistribuție frază cheie%2$s: foarte bine!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sDistribuție frază cheie%3$s: inegală. Unele părți ale textului nu conțin fraza cheie sau sinonimele ei. %2$sDistribuie fraza cheie uniform%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sDistribuție frază cheie%3$s: inegală. Părți mari de text nu conțin fraza cheie sau sinonimele ei. %2$sDistribuie fraza cheie uniform%3$s."],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sDistribuție frază cheie%3$s: %2$sinclude fraza cheie sau sinonimele ei în text ca să putem verifica distribuția ei (lor)%3$s."],"%4$sPreviously used keyphrase%6$s: You've used this keyphrase %1$s%2$d times before%3$s. %5$sDo not use your keyphrase more than once%6$s.":["%4$sFrază cheie folosită anterior%6$s: ai folosit această frază cheie de %1$s%2$d ori mai înainte%3$s. %5$sFolosește o frază cheie numai o singură dată%6$s."],"%3$sPreviously used keyphrase%5$s: You've used this keyphrase %1$sonce before%2$s. %4$sDo not use your keyphrase more than once%5$s.":["%3$sFrază cheie folosită anterior%5$s: ai folosit această frază cheie %1$saltădată, mai înainte%2$s. %4$sFolosește o frază cheie numai o singură dată%5$s."],"%1$sPreviously used keyphrase%2$s: You've not used this keyphrase before, very good.":["%1$sFrază cheie folosită anterior%2$s: nu ai mai folosit această frază cheie, foarte bine."],"%1$sSlug stopwords%3$s: The slug for this page contains a stop word. %2$sRemove it%3$s!":["%1$sCuvinte stop în descriptor%3$s: descriptorul acestei pagini conține un cuvânt stop. %2$sÎnlătură-l%3$s!","%1$sCuvinte stop în descriptor%3$s: descriptorul acestei pagini conține cuvinte stop. %2$sÎnlătură-le%3$s!","%1$sCuvinte stop în descriptor%3$s: descriptorul acestei pagini conține cuvinte stop. %2$sÎnlătură-le%3$s!"],"%1$sSlug too long%3$s: the slug for this page is a bit long. %2$sShorten it%3$s!":["%1$sDescriptor prea lung%3$s: descriptorul acestei pagini este un pic prea lung. %2$sScurtează-l%3$s!"],"%1$sImage alt attributes%3$s: No images appear on this page. %2$sAdd some%3$s!":["%1$sAtribute alt imagini%3$s: nu apare nicio imagine în această pagină. %2$sAdaugă cel puțin una%3$s!"],"%1$sLink keyphrase%3$s: You're linking to another page with the words you want this page to rank for. %2$sDon't do that%3$s!":["%1$sLegătură frază cheie%3$s: ești legat la o altă pagină cu cuvintele frazei cheie pe care vrei să o folosești pentru această pagină. %2$sNu face asta%3$s!"],"This is far below the recommended minimum of %5$d word. %3$sAdd more content%4$s.":["Este cu mult sub minimul recomandat de %5$d cuvânt. %3$sAdaugă mai mult conținut%4$s.","Este cu mult sub minimul recomandat de %5$d cuvinte. %3$sAdaugă mai mult conținut%4$s.","Este cu mult sub minimul recomandat de %5$d de cuvinte. %3$sAdaugă mai mult conținut%4$s."],"This is below the recommended minimum of %5$d word. %3$sAdd more content%4$s.":["Este sub minimul recomandat de %5$d cuvânt. %3$sAdaugă mai mult conținut%4$s.","Este sub minimul recomandat de %5$d cuvinte. %3$sAdaugă mai mult conținut%4$s.","Este sub minimul recomandat de %5$d de cuvinte. %3$sAdaugă mai mult conținut%4$s."],"%2$sText length%4$s: The text contains %1$d word.":["%2$sLungime text%4$s: textul conține un cuvânt.","%2$sLungime text%4$s: textul conține %1$d cuvinte.","%2$sLungime text%4$s: textul conține %1$d de cuvinte."],"%2$sText length%3$s: The text contains %1$d word. Good job!":["%2$sLungime text%3$s: textul conține un cuvânt. Foarte bine!","%2$sLungime text%3$s: textul conține %1$d cuvinte. Foarte bine!","%2$sLungime text%3$s: textul conține %1$d de cuvinte. Foarte bine!"],"%1$sKeyphrase in subheading%3$s: More than 75%% of your higher-level subheadings reflect the topic of your copy. That's too much. %2$sDon't over-optimize%3$s!":["%1$sFrază cheie în subtitluri%3$s: mai mult de 75%% dintre subtitlurile tale reflectă subiectul textului. E prea mult. %2$sNu optimiza în exces%3$s!"],"%1$sSEO title width%3$s: %2$sPlease create an SEO title%3$s.":["%1$sLungime titlu SEO%3$s: %2$ste rog crează un titlu SEO%3$s."],"%1$sSEO title width%3$s: The SEO title is wider than the viewable limit. %2$sTry to make it shorter%3$s.":["%1$sLungime titlu SEO%3$s: titlul SEO mai mare decât limita vizibilă. %2$sÎncearcă să-l scurtezi%3$s."],"%1$sSEO title width%2$s: Good job!":["%1$sLungime titlu SEO%2$s: foarte bine!"],"%1$sSEO title width%3$s: The SEO title is too short. %2$sUse the space to add keyphrase variations or create compelling call-to-action copy%3$s.":["%1$sLungime titlu SEO%3$s: titlul SEO este prea scurt. %2$sFolosește întreg spațiul pentru a adăuga variante de cuvinte cheie sau pentru a crea un apel la acțiune convingător%3$s."],"%1$sOutbound links%2$s: There are both nofollowed and normal outbound links on this page. Good job!":["%1$sLegături externe%2$s: în această pagină sunt legături externe nofollow și normale. Foarte bine!"],"%1$sOutbound links%2$s: Good job!":["%1$sLegături externe%2$s: foarte bine!"],"%1$sOutbound links%3$s: All outbound links on this page are nofollowed. %2$sAdd some normal links%3$s.":["%1$sLegături externe%3$s: în această pagină toate legăturile externe sunt nofollow. %2$sAdaugă și legături normale%3$s."],"%1$sOutbound links%3$s: No outbound links appear in this page. %2$sAdd some%3$s!":["%1$sLegături externe%3$s: în această pagină nu apare nicio legătură externă. %2$sAdaugă câteva%3$s!"],"%1$sMeta description length%2$s: Well done!":["%1$sLungime descriere meta%2$s: foarte bună!"],"%1$sMeta description length%3$s: The meta description is over %4$d characters. To ensure the entire description will be visible, %2$syou should reduce the length%3$s!":["%1$sLungime descriere meta%3$s: descrierea meta are mai mult de %4$d de caractere. Pentru a te asigura că va fi vizibilă în întregime, %2$sar trebui să-i reduci lungimea%3$s!"],"%1$sMeta description length%3$s: The meta description is too short (under %4$d characters). Up to %5$d characters are available. %2$sUse the space%3$s!":["%1$sLungime descriere meta%3$s: descrierea meta este prea scurtă (are mai puțin de %4$d de caractere). Sunt disponibile până la %5$d de caractere. %2$sFolosește acest spațiu%3$s!"],"%1$sMeta description length%3$s: No meta description has been specified. Search engines will display copy from the page instead. %2$sMake sure to write one%3$s!":["%1$sLungime descriere meta%3$s: nu a fost specificată nicio descriere meta. În locul ei, motoarele de căutare vor afișa un text din pagină. %2$sAsigură-te că scrii una%3$s!"],"%1$sKeyphrase in meta description%2$s: The meta description has been specified, but it does not contain the keyphrase. %3$sFix that%4$s!":["%1$sFrază cheie în descrierea meta%2$s: descrierea meta a fost specificată, dar nu conține fraza cheie. %3$sCorectează asta%4$s!"],"%1$sKeyphrase in meta description%2$s: The meta description contains the keyphrase %3$s times, which is over the advised maximum of 2 times. %4$sLimit that%5$s!":["%1$sFrază cheie în descrierea meta%2$s: descrierea meta conține de %3$s ori fraza cheie, este peste maximul recomandat, de 2 ori. %4$sÎncadrează-te%5$s!"],"%1$sKeyphrase in meta description%2$s: Keyphrase or synonym appear in the meta description. Well done!":["%1$sFrază cheie în descrierea meta%2$s: descrierea meta conține fraza cheie sau sinonimele ei. Foarte bine!"],"%3$sKeyphrase length%5$s: The keyphrase is %1$d words long. That's way more than the recommended maximum of %2$d words. %4$sMake it shorter%5$s!":["%3$sLungime frază cheie%5$s: fraza cheie are %1$d cuvinte. Este cu mult mai mare decât maximul recomandat de %2$d cuvinte. %4$sScurtează fraza%5$s!"],"%3$sKeyphrase length%5$s: The keyphrase is %1$d words long. That's more than the recommended maximum of %2$d words. %4$sMake it shorter%5$s!":["%3$sLungime frază cheie%5$s: fraza cheie are %1$d cuvinte. Este mai mare decât maximul recomandat de %2$d cuvinte. %4$sScurtează fraza%5$s!"],"%1$sKeyphrase length%2$s: Good job!":["%1$sLungime frază cheie%2$s: foarte bine!"],"%1$sKeyphrase length%3$s: No focus keyphrase was set for this page. %2$sSet a keyphrase in order to calculate your SEO score%3$s.":["%1$sLungime frază cheie%3$s: nu ai stabilit nicio frază cheie pentru această pagină. %2$sIntrodu o frază cheie pentru a calcula punctajul SEO%3$s."],"%1$sKeyphrase in introduction%3$s: Your keyphrase or its synonyms do not appear in the first paragraph. %2$sMake sure the topic is clear immediately%3$s.":["%1$sFrază cheie în introducere%3$s: fraza cheie sau sinonimele ei nu apar în primul paragraf. %2$sAsigură-te că apar în introducere%3$s."],"%1$sKeyphrase in introduction%3$s:Your keyphrase or its synonyms appear in the first paragraph of the copy, but not within one sentence. %2$sFix that%3$s!":["%1$sFrază cheie în introducere%3$s: fraza cheie sau sinonimele ei apar în primul paragraf al textului, dar cuvintele nu sunt în aceeași propoziție. %2$sCorectează asta%3$s!"],"%1$sKeyphrase in introduction%2$s: Well done!":["%1$sFrază cheie în introducere%2$s: foarte bine!"],"%1$sInternal links%2$s: There are both nofollowed and normal internal links on this page. Good job!":["%1$sLegături interne%2$s: în această pagină sunt legături interne nofollow și normale. Foarte bine!"],"%1$sInternal links%2$s: You have enough internal links. Good job!":["%1$sLegături interne%2$s: ai suficiente legături interne. Foarte bine!"],"%1$sInternal links%3$s: The internal links in this page are all nofollowed. %2$sAdd some good internal links%3$s.":["%1$sLegături interne%3$s: în această pagină legăturile interne sunt nofollow. %2$sAdaugă și legături interne normale%3$s."],"%1$sInternal links%3$s: No internal links appear in this page, %2$smake sure to add some%3$s!":["%1$sLegături interne%3$s: în această pagină nu apare nicio legătură internă, %2$sasigură-te că adaugi câteva%3$s!"],"%1$sTransition words%2$s: Well done!":["%1$sCuvinte de legătură%2$s: foarte bine!"],"%1$sTransition words%2$s: Only %3$s of the sentences contain transition words, which is not enough. %4$sUse more of them%2$s.":["%1$sCuvinte de legătură%2$s: numai %3$s dintre propoziții conțin cuvinte de legătură, nu este suficient. %4$sFolosește mai multe%2$s."],"%1$sTransition words%2$s: None of the sentences contain transition words. %3$sUse some%2$s.":["%1$sCuvinte de legătură%2$s: niciuna dintre propoziții nu conține cuvinte de legătură. %3$sFolosește câteva%2$s."],"%1$sNot enough content%2$s: %3$sPlease add some content to enable a good analysis%2$s.":["%1$sConținut insuficient%2$s: %3$ste rog adaugă mai mult conținut pentru a permite o analiză completă%2$s."],"%1$sSubheading distribution%2$s: You are not using any subheadings, but your text is short enough and probably doesn't need them.":["%1$sDistribuție subtitluri%2$s: nu folosești niciun subtitlu, dar textul este destul de scurt și probabil subtitlurile nu sunt necesare."],"%1$sSubheading distribution%2$s: You are not using any subheadings, although your text is rather long. %3$sTry and add some subheadings%2$s.":["%1$sDistribuție subtitluri%2$s: nu folosești niciun subtitlu, cu toate că textul este destul de lung. %3$sÎncearcă să adaugi câteva subtitluri%2$s."],"%1$sSubheading distribution%2$s: %3$d section of your text is longer than %4$d words and is not separated by any subheadings. %5$sAdd subheadings to improve readability%2$s.":["%1$sDistribuție subtitluri%2$s: o secțiune a textului are mai mult de %4$d de cuvinte și nu este separată de niciun subtitlu. %5$sAdaugă subtitluri pentru a îmbunătăți lizibilitatea%2$s.","%1$sDistribuție subtitluri%2$s: %3$d secțiuni ale textului au mai mult de %4$d de cuvinte și nu sunt separate de niciun subtitlu. %5$sAdaugă subtitluri pentru a îmbunătăți lizibilitatea%2$s.","%1$sDistribuție subtitluri%2$s: %3$d de secțiuni ale textului au mai mult de %4$d de cuvinte și nu sunt separate de niciun subtitlu. %5$sAdaugă subtitluri pentru a îmbunătăți lizibilitatea%2$s."],"%1$sSubheading distribution%2$s: Great job!":["%1$sDistribuție subtitluri%2$s: foarte bine!"],"%1$sSentence length%2$s: %3$s of the sentences contain more than %4$s words, which is more than the recommended maximum of %5$s. %6$sTry to shorten the sentences%2$s.":["%1$sLungime propoziție%2$s: %3$s dintre propoziții conțin mai mult de %4$s cuvinte, este mai mult decât maximul recomandat de %5$s. %6$sÎncearcă să le scurtezi%2$s."],"%1$sSentence length%2$s: Great!":["%1$sLungime propoziție%2$s: bună!"],"%1$sConsecutive sentences%2$s: There is enough variety in your sentences. That's great!":["%1$sPropoziții consecutive%2$s: propozițiile sunt destul de diversificate. Foarte bine!"],"%1$sConsecutive sentences%2$s: The text contains %3$d consecutive sentences starting with the same word. %5$sTry to mix things up%2$s!":["%1$sPropoziții consecutive%2$s: textul conține %3$d propoziții consecutive care încep cu același cuvânt. %5$sÎncearcă să combini cuvintele%2$s!","%1$sPropoziții consecutive%2$s: textul conține %4$d situații în care %3$d sau mai multe propoziții consecutive încep cu același cuvânt. %5$sÎncearcă să combini cuvintele%2$s!","%1$sPropoziții consecutive%2$s: textul conține %4$d de situații în care %3$d sau mai multe propoziții consecutive încep cu același cuvânt. %5$sÎncearcă să combini cuvintele%2$s!"],"%1$sPassive voice%2$s: %3$s of the sentences contain passive voice, which is more than the recommended maximum of %4$s. %5$sTry to use their active counterparts%2$s.":["%1$sDiateză pasivă%2$s: %3$s dintre propoziții folosesc diateza pasivă, este mai mare decât maximul recomandat de %4$s. %5$sÎncearcă să folosești în schimb diateza activă%2$s."],"%1$sPassive voice%2$s: You're using enough active voice. That's great!":["%1$sDiateză pasivă%2$s: folosești suficient diateza activă. Foarte bine!"],"%1$sParagraph length%2$s: %3$d of the paragraphs contains more than the recommended maximum of %4$d words. %5$sShorten your paragraphs%2$s!":["%1$sLungime paragraf%2$s: un paragraf este mai mare decât maximul recomandat de %4$d de cuvinte. %5$sScurtează paragraful%2$s!","%1$sLungime paragraf%2$s: %3$d paragrafe sunt mai mari decât maximul recomandat de %4$d de cuvinte. %5$sScurtează paragrafele%2$s!","%1$sLungime paragraf%2$s: %3$d de paragrafe sunt mai mari decât maximul recomandat de %4$d de cuvinte. %5$sScurtează paragrafele%2$s!"],"%1$sParagraph length%2$s: None of the paragraphs are too long. Great job!":["%1$sLungime paragraf%2$s: niciun paragraf nu este prea lung. Foarte bine!"],"Good job!":["Foarte bine!"],"%1$sFlesch Reading Ease%2$s: The copy scores %3$s in the test, which is considered %4$s to read. %5$s%6$s%7$s":["%1$sCât de ușor este citit (Flesch Reading Ease)%2$s: textul a primit punctajul %3$s la efectuarea testului, este considerat %4$s de citit. %5$s%6$s%7$s"],"Scroll to see the preview content.":["Derulează pentru a vedea conținutul previzualizării."],"An error occurred in the '%1$s' assessment":["A apărut o eroare în evaluarea '%1$s'"],"%1$s of the words contain %2$sover %3$s syllables%4$s, which is more than the recommended maximum of %5$s.":["%1$s din cuvinte conțin %2$speste %3$s silabe%4$s, care este mai mult decât recomandarea maximă de %5$s."],"%1$s of the words contain %2$sover %3$s syllables%4$s, which is less than or equal to the recommended maximum of %5$s.":["%1$s din cuvinte conțin %2$speste %3$s silabe%4$s, care este mai puțin sau egal decât recomandarea maximă de %5$s."],"This is slightly below the recommended minimum of %5$d word. %3$sAdd a bit more copy%4$s.":["Este cu puțin sub minimul recomandat de %5$d cuvânt. %3$sMai adaugă puțin text%4$s.","Este cu puțin sub minimul recomandat de %5$d cuvinte. %3$sMai adaugă puțin text%4$s.","Este cu puțin sub minimul recomandat de %5$d de cuvinte. %3$sMai adaugă puțin text%4$s."],"The meta description contains %1$d sentence %2$sover %3$s words%4$s. Try to shorten this sentence.":["Descrierea meta conține %1$d propoziție %2$scu peste %3$s de cuvinte%4$s. Încearcă să scurtezi această propoziție.","Descrierea meta conține %1$d propoziții %2$scu peste %3$s de cuvinte%4$s. Încearcă să scurtezi aceste propoziții.","Descrierea meta conține %1$d de propoziții %2$scu peste %3$s de cuvinte%4$s. Încearcă să scurtezi aceste propoziții."],"The meta description contains no sentences %1$sover %2$s words%3$s.":["Descrierea meta conține nicio propoziție %1$s cu peste %2$s de cuvinte%3$s."],"Mobile preview":["Previzualizare pe mobil"],"Desktop preview":["Previzualizare desktop"],"Please provide an SEO title by editing the snippet below.":["Te rog furnizează un titlu SEO prin editarea fragmentului de mai jos."],"Meta description preview:":["Previzualizare descriere meta:"],"Slug preview:":["Previzualizare descriptor:"],"SEO title preview:":["Previzualizare titlu SEO:"],"Close snippet editor":["Închide editor fragment"],"Slug":["Descriptor"],"Remove marks in the text":["Înlătură marcaje în text"],"Mark this result in the text":["Marchează acest rezultat în text"],"Marks are disabled in current view":["Marcajele sunt dezactivate în vizualizarea curentă"],"Good SEO score":["Punctaj SEO bun"],"OK SEO score":["Punctaj SEO OK"],"Feedback":["Impresii"],"ok":["OK"],"Please provide a meta description by editing the snippet below.":["Te rog furnizează o descriere meta prin editarea fragmentului de mai jos."],"Edit snippet":["Editează fragmentul"],"You can click on each element in the preview to jump to the Snippet Editor.":["Poți da clic pe fiecare element din previzualizare pentru a sări la editor fragment."],"SEO title":["Titlu SEO"],"Needs improvement":["Necesită îmbunătățire"],"Good":["bun"],"very difficult":["foarte dificil"],"Try to make shorter sentences, using less difficult words to improve readability":["Pentru a îmbunătăți lizibilitatea, încearcă să faci propoziții mai scurte, folosind cuvinte mai puțin dificile."],"difficult":["dificil"],"Try to make shorter sentences to improve readability":["Pentru a îmbunătăți lizibilitatea, încearcă să faci propoziții mai scurte."],"fairly difficult":["destul de dificil"],"OK":["OK"],"fairly easy":["destul de ușor"],"easy":["ușor"],"very easy":["foarte ușor"],"Meta description":["Descriere meta"]}}}
1
+ {"domain":"wordpress-seo","locale_data":{"wordpress-seo":{"":{"domain":"wordpress-seo","plural-forms":"nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2);","lang":"ro"},"Google preview":["Previzualizare Google"],"Has feedback":["Are impresii"],"Content optimization:":["Optimizare conținut:"],"%1$sFlesch Reading Ease%2$s: The copy scores %3$s in the test, which is considered %4$s to read. %5$s":["%1$sCât de ușor este citit (Flesch Reading Ease)%2$s: textul a primit punctajul %3$s la efectuarea testului, este considerat %4$s de citit. %5$s"],"%3$sImage alt attributes%5$s: Out of %2$d images on this page, %1$d have alt attributes with words from your keyphrase or synonyms. That's a bit much. %4$sOnly include the keyphrase or its synonyms when it really fits the image%5$s.":["%3$sAtribute alt imagini%5$s: din %2$d imagini existente în această pagină, %1$d au atribute alt care cu cuvinte din fraza cheie sau sinonimele ei. E un pic cam mult. %4$sInclude numai fraza cheie sau sinonimele ei când chiar se potrivesc cu imaginea%5$s."],"%1$sImage alt attributes%2$s: Good job!":["%1$sAtribute alt imagini%2$s: Foarte bine!"],"%3$sImage alt attributes%5$s: Out of %2$d images on this page, only %1$d has an alt attribute that reflects the topic of your text. %4$sAdd your keyphrase or synonyms to the alt tags of more relevant images%5$s!":["%3$sAtribute alt imagini%5$s: din %2$d imagini existente în această pagină, numai una are un atribut alt care reflectă subiectul textului. %4$sAdaugă fraza cheie sau sinonimele ei la tagurile alt pentru mai multe imagini relevante%5$s!","%3$sAtribute alt imagini%5$s: din %2$d imagini existente în această pagină, numai %1$d au atribute alt care reflectă subiectul textului. %4$sAdaugă fraza cheie sau sinonimele ei la tagurile alt pentru mai multe imagini relevante%5$s!","%3$sAtribute alt imagini%5$s: din %2$d imagini existente în această pagină, numai %1$d au atribute alt care reflectă subiectul textului. %4$sAdaugă fraza cheie sau sinonimele ei la tagurile alt pentru mai multe imagini relevante%5$s!"],"%1$sImage alt attributes%3$s: Images on this page do not have alt attributes that reflect the topic of your text. %2$sAdd your keyphrase or synonyms to the alt tags of relevant images%3$s!":["%1$sAtribute alt imagini%3$s: imaginile din această pagină nu au atribute alt care să reflecte subiectul textului. %2$sAdaugă fraza cheie sau sinonimele ei la tagurile alt ale imaginilor relevante%3$s!"],"%1$sImage alt attributes%3$s: Images on this page have alt attributes, but you have not set your keyphrase. %2$sFix that%3$s!":["%1$sAtribute alt imagini%3$s: imaginile din această pagină au atribute alt, dar nu ai setat o frază cheie. %2$sCorectează asta%3$s!"],"%1$sKeyphrase in subheading%2$s: %3$s of your higher-level subheadings reflects the topic of your copy. Good job!":["%1$sFrază cheie în subtitluri%2$s: unul dintre subtitlurile tale reflectă subiectul textului. Foarte bine!","%1$sFrază cheie în subtitluri%2$s: %3$s dintre subtitlurile tale reflectă subiectul textului. Foarte bine!","%1$sFrază cheie în subtitluri%2$s: %3$s dintre subtitlurile tale reflectă subiectul textului. Foarte bine!"],"%1$sKeyphrase in subheading%2$s: Your higher-level subheading reflects the topic of your copy. Good job!":["%1$sFrază cheie în subtitluri%2$s: subtitlul tău reflectă subiectul textului. Foarte bine!"],"%1$sKeyphrase in subheading%3$s: %2$sUse more keyphrases or synonyms in your higher-level subheadings%3$s!":["%1$sFrază cheie în subtitluri%3$s: %2$sfolosește mai multe fraze cheie sau sinonimele ei în subtitluri%3$s!"],"%1$sSingle title%3$s: H1s should only be used as your main title. Find all H1s in your text that aren't your main title and %2$schange them to a lower heading level%3$s!":["%1$sNumai un titlu%3$s: H1 ar trebui să fie folosit numai pentru titlul principal. Găsește toate subtitlurile H1 din text care nu sunt folosite ca titlu principal și %2$smodifică-le în subtitluri inferioare (H2, H3...)%3$s!"],"%1$sKeyphrase density%2$s: The focus keyphrase was found 0 times. That's less than the recommended minimum of %3$d times for a text of this length. %4$sFocus on your keyphrase%2$s!":["%1$sDensitate frază cheie%2$s: fraza cheie nu a fost găsită. Este sub minimul recomandat de %3$d ori pentru un text de această lungime. %4$sFolosește-o mai des%2$s!"],"%1$sKeyphrase density%2$s: The focus keyphrase was found %5$d time. That's less than the recommended minimum of %3$d times for a text of this length. %4$sFocus on your keyphrase%2$s!":["%1$sDensitate frază cheie%2$s: fraza cheie a fost găsită o singură dată. Este sub minimul recomandat de %3$d ori pentru un text de această lungime. %4$sFolosește-o mai des%2$s!","%1$sDensitate frază cheie%2$s: fraza cheie a fost găsită de %5$d ori. Este sub minimul recomandat de %3$d ori pentru un text de această lungime. %4$sFolosește-o mai des%2$s!","%1$sDensitate frază cheie%2$s: fraza cheie a fost găsită de %5$d de ori. Este sub minimul recomandat de %3$d de ori pentru un text de această lungime. %4$sFolosește-o mai des%2$s!"],"%1$sKeyphrase density%2$s: The focus keyphrase was found %3$d time. This is great!":["%1$sDensitate frază cheie%2$s: fraza cheie a fost găsită o singură dată. Foarte bine!","%1$sDensitate frază cheie%2$s: fraza cheie a fost găsită de %3$d ori. Foarte bine!","%1$sDensitate frază cheie%2$s: fraza cheie a fost găsită de %3$d de ori. Foarte bine!"],"%1$sKeyphrase density%2$s: The focus keyphrase was found %5$d time. That's more than the recommended maximum of %3$d times for a text of this length. %4$sDon't overoptimize%2$s!":["%1$sDensitate frază cheie%2$s: fraza cheie a fost găsită o singură dată. Este peste maximul recomandat de %3$d ori pentru un text de această lungime. %4$sO folosești de prea multe ori%2$s!","%1$sDensitate frază cheie%2$s: fraza cheie a fost găsită de %5$d ori. Este peste maximul recomandat de %3$d ori pentru un text de această lungime. %4$sO folosești de prea multe ori%2$s!","%1$sDensitate frază cheie%2$s: fraza cheie a fost găsită de %5$d de ori. Este peste maximul recomandat de %3$d de ori pentru un text de această lungime. %4$sO folosești de prea multe ori%2$s!"],"%1$sKeyphrase density%2$s: The focus keyphrase was found %5$d time. That's way more than the recommended maximum of %3$d times for a text of this length. %4$sDon't overoptimize%2$s!":["%1$sDensitate frază cheie%2$s: fraza cheie a fost găsită o singură dată. Este cu mult peste maximul recomandat de %3$d ori pentru un text de această lungime. %4$sO folosești de prea multe ori%2$s!","%1$sDensitate frază cheie%2$s: fraza cheie a fost găsită de %5$d ori. Este cu mult peste maximul recomandat de %3$d ori pentru un text de această lungime. %4$sO folosești de prea multe ori%2$s!","%1$sDensitate frază cheie%2$s: fraza cheie a fost găsită de %5$d de ori. Este cu mult peste maximul recomandat de %3$d de ori pentru un text de această lungime. %4$sO folosești de prea multe ori%2$s!"],"%1$sFunction words in keyphrase%3$s: Your keyphrase \"%4$s\" contains function words only. %2$sLearn more about what makes a good keyphrase.%3$s":["%1$sDeterminanți în fraza cheie%3$s: fraza ta cheie „%4$s” conține numai determinanți. %2$sAflă mai multe despre cum se alcătuiește o frază cheie bună.%3$s"],"%1$sKeyphrase length%3$s: %2$sSet a keyphrase in order to calculate your SEO score%3$s.":["%1$sLungime frază cheie%3$s: %2$sintrodu o frază cheie pentru a calcula punctajul SEO%3$s."],"%1$sKeyphrase in slug%2$s: More than half of your keyphrase appears in the slug. That's great!":["%1$sFrază cheie în descriptor%2$s: mai mult de jumătate din fraza ta cheie apare în descriptor. Foarte bine!"],"%1$sKeyphrase in slug%3$s: (Part of) your keyphrase does not appear in the slug. %2$sChange that%3$s!":["%1$sFrază cheie în descriptor%3$s: fraza ta cheie (sau o parte din ea) nu apare în descriptor. %2$sCorectează asta%3$s!"],"%1$sKeyphrase in slug%2$s: Great work!":["%1$sFrază cheie în descriptor%2$s: foarte bine!"],"%1$sKeyphrase in title%3$s: Not all the words from your keyphrase \"%4$s\" appear in the SEO title. %2$sTry to use the exact match of your keyphrase in the SEO title%3$s.":["%1$sFrază cheie în titlu%3$s: în titlul SEO nu apar toate cuvintele din fraza ta cheie „%4$s”. %2$sÎncearcă să folosești în titlul SEO chiar fraza cheie%3$s."],"%1$sKeyphrase in title%3$s: Does not contain the exact match. %2$sTry to write the exact match of your keyphrase in the SEO title%3$s.":["%1$sFrază cheie în titlu%3$s: titlul nu conține fraza cheie. %2$sÎncearcă să scrii în titlul SEO chiar fraza cheie%3$s."],"%1$sKeyphrase in title%3$s: The exact match of the keyphrase appears in the SEO title, but not at the beginning. %2$sTry to move it to the beginning%3$s.":["%1$sFrază cheie în titlu%3$s: fraza cheie apare în titlul SEO, dar nu este la începutul lui. %2$sÎncearcă să o muți la începutul titlului%3$s."],"%1$sKeyphrase in title%2$s: The exact match of the keyphrase appears at the beginning of the SEO title. Good job!":["%1$sFrază cheie în titlu%2$s: fraza cheie apare la începutul titlului SEO. Foarte bine!"],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sDistribuție frază cheie%2$s: foarte bine!"],"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sDistribuție frază cheie%3$s: inegală. Unele părți ale textului nu conțin fraza cheie sau sinonimele ei. %2$sDistribuie fraza cheie uniform%3$s."],"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.":["%1$sDistribuție frază cheie%3$s: inegală. Părți mari de text nu conțin fraza cheie sau sinonimele ei. %2$sDistribuie fraza cheie uniform%3$s."],"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s.":["%1$sDistribuție frază cheie%3$s: %2$sinclude fraza cheie sau sinonimele ei în text ca să putem verifica distribuția ei (lor)%3$s."],"%4$sPreviously used keyphrase%6$s: You've used this keyphrase %1$s%2$d times before%3$s. %5$sDo not use your keyphrase more than once%6$s.":["%4$sFrază cheie folosită anterior%6$s: ai folosit această frază cheie de %1$s%2$d ori mai înainte%3$s. %5$sFolosește o frază cheie numai o singură dată%6$s."],"%3$sPreviously used keyphrase%5$s: You've used this keyphrase %1$sonce before%2$s. %4$sDo not use your keyphrase more than once%5$s.":["%3$sFrază cheie folosită anterior%5$s: ai folosit această frază cheie %1$saltădată, mai înainte%2$s. %4$sFolosește o frază cheie numai o singură dată%5$s."],"%1$sPreviously used keyphrase%2$s: You've not used this keyphrase before, very good.":["%1$sFrază cheie folosită anterior%2$s: nu ai mai folosit această frază cheie, foarte bine."],"%1$sSlug stopwords%3$s: The slug for this page contains a stop word. %2$sRemove it%3$s!":["%1$sCuvinte stop în descriptor%3$s: descriptorul acestei pagini conține un cuvânt stop. %2$sÎnlătură-l%3$s!","%1$sCuvinte stop în descriptor%3$s: descriptorul acestei pagini conține cuvinte stop. %2$sÎnlătură-le%3$s!","%1$sCuvinte stop în descriptor%3$s: descriptorul acestei pagini conține cuvinte stop. %2$sÎnlătură-le%3$s!"],"%1$sSlug too long%3$s: the slug for this page is a bit long. %2$sShorten it%3$s!":["%1$sDescriptor prea lung%3$s: descriptorul acestei pagini este un pic prea lung. %2$sScurtează-l%3$s!"],"%1$sImage alt attributes%3$s: No images appear on this page. %2$sAdd some%3$s!":["%1$sAtribute alt imagini%3$s: nu apare nicio imagine în această pagină. %2$sAdaugă cel puțin una%3$s!"],"%1$sLink keyphrase%3$s: You're linking to another page with the words you want this page to rank for. %2$sDon't do that%3$s!":["%1$sLegătură frază cheie%3$s: ești legat la o altă pagină cu cuvintele frazei cheie pe care vrei să o folosești pentru această pagină. %2$sNu face asta%3$s!"],"This is far below the recommended minimum of %5$d word. %3$sAdd more content%4$s.":["Este cu mult sub minimul recomandat de %5$d cuvânt. %3$sAdaugă mai mult conținut%4$s.","Este cu mult sub minimul recomandat de %5$d cuvinte. %3$sAdaugă mai mult conținut%4$s.","Este cu mult sub minimul recomandat de %5$d de cuvinte. %3$sAdaugă mai mult conținut%4$s."],"This is below the recommended minimum of %5$d word. %3$sAdd more content%4$s.":["Este sub minimul recomandat de %5$d cuvânt. %3$sAdaugă mai mult conținut%4$s.","Este sub minimul recomandat de %5$d cuvinte. %3$sAdaugă mai mult conținut%4$s.","Este sub minimul recomandat de %5$d de cuvinte. %3$sAdaugă mai mult conținut%4$s."],"%2$sText length%4$s: The text contains %1$d word.":["%2$sLungime text%4$s: textul conține un cuvânt.","%2$sLungime text%4$s: textul conține %1$d cuvinte.","%2$sLungime text%4$s: textul conține %1$d de cuvinte."],"%2$sText length%3$s: The text contains %1$d word. Good job!":["%2$sLungime text%3$s: textul conține un cuvânt. Foarte bine!","%2$sLungime text%3$s: textul conține %1$d cuvinte. Foarte bine!","%2$sLungime text%3$s: textul conține %1$d de cuvinte. Foarte bine!"],"%1$sKeyphrase in subheading%3$s: More than 75%% of your higher-level subheadings reflect the topic of your copy. That's too much. %2$sDon't over-optimize%3$s!":["%1$sFrază cheie în subtitluri%3$s: mai mult de 75%% dintre subtitlurile tale reflectă subiectul textului. E prea mult. %2$sNu optimiza în exces%3$s!"],"%1$sSEO title width%3$s: %2$sPlease create an SEO title%3$s.":["%1$sLungime titlu SEO%3$s: %2$ste rog crează un titlu SEO%3$s."],"%1$sSEO title width%3$s: The SEO title is wider than the viewable limit. %2$sTry to make it shorter%3$s.":["%1$sLungime titlu SEO%3$s: titlul SEO mai mare decât limita vizibilă. %2$sÎncearcă să-l scurtezi%3$s."],"%1$sSEO title width%2$s: Good job!":["%1$sLungime titlu SEO%2$s: foarte bine!"],"%1$sSEO title width%3$s: The SEO title is too short. %2$sUse the space to add keyphrase variations or create compelling call-to-action copy%3$s.":["%1$sLungime titlu SEO%3$s: titlul SEO este prea scurt. %2$sFolosește întreg spațiul pentru a adăuga variante de cuvinte cheie sau pentru a crea un apel la acțiune convingător%3$s."],"%1$sOutbound links%2$s: There are both nofollowed and normal outbound links on this page. Good job!":["%1$sLegături externe%2$s: în această pagină sunt legături externe fără urmărire și normale. Foarte bine!"],"%1$sOutbound links%2$s: Good job!":["%1$sLegături externe%2$s: foarte bine!"],"%1$sOutbound links%3$s: All outbound links on this page are nofollowed. %2$sAdd some normal links%3$s.":["%1$sLegături externe%3$s: în această pagină toate legăturile externe sunt fără urmărire. %2$sAdaugă și legături normale%3$s."],"%1$sOutbound links%3$s: No outbound links appear in this page. %2$sAdd some%3$s!":["%1$sLegături externe%3$s: în această pagină nu apare nicio legătură externă. %2$sAdaugă câteva%3$s!"],"%1$sMeta description length%2$s: Well done!":["%1$sLungime descriere meta%2$s: foarte bună!"],"%1$sMeta description length%3$s: The meta description is over %4$d characters. To ensure the entire description will be visible, %2$syou should reduce the length%3$s!":["%1$sLungime descriere meta%3$s: descrierea meta are mai mult de %4$d de caractere. Pentru a te asigura că va fi vizibilă în întregime, %2$sar trebui să-i reduci lungimea%3$s!"],"%1$sMeta description length%3$s: The meta description is too short (under %4$d characters). Up to %5$d characters are available. %2$sUse the space%3$s!":["%1$sLungime descriere meta%3$s: descrierea meta este prea scurtă (are mai puțin de %4$d de caractere). Sunt disponibile până la %5$d de caractere. %2$sFolosește acest spațiu%3$s!"],"%1$sMeta description length%3$s: No meta description has been specified. Search engines will display copy from the page instead. %2$sMake sure to write one%3$s!":["%1$sLungime descriere meta%3$s: nu a fost specificată nicio descriere meta. În locul ei, motoarele de căutare vor afișa un text din pagină. %2$sAsigură-te că scrii una%3$s!"],"%1$sKeyphrase in meta description%2$s: The meta description has been specified, but it does not contain the keyphrase. %3$sFix that%4$s!":["%1$sFrază cheie în descrierea meta%2$s: descrierea meta a fost specificată, dar nu conține fraza cheie. %3$sCorectează asta%4$s!"],"%1$sKeyphrase in meta description%2$s: The meta description contains the keyphrase %3$s times, which is over the advised maximum of 2 times. %4$sLimit that%5$s!":["%1$sFrază cheie în descrierea meta%2$s: descrierea meta conține de %3$s ori fraza cheie, este peste maximul recomandat, de 2 ori. %4$sÎncadrează-te%5$s!"],"%1$sKeyphrase in meta description%2$s: Keyphrase or synonym appear in the meta description. Well done!":["%1$sFrază cheie în descrierea meta%2$s: descrierea meta conține fraza cheie sau sinonimele ei. Foarte bine!"],"%3$sKeyphrase length%5$s: The keyphrase is %1$d words long. That's way more than the recommended maximum of %2$d words. %4$sMake it shorter%5$s!":["%3$sLungime frază cheie%5$s: fraza cheie are %1$d cuvinte. Este cu mult mai mare decât maximul recomandat de %2$d cuvinte. %4$sScurtează fraza%5$s!"],"%3$sKeyphrase length%5$s: The keyphrase is %1$d words long. That's more than the recommended maximum of %2$d words. %4$sMake it shorter%5$s!":["%3$sLungime frază cheie%5$s: fraza cheie are %1$d cuvinte. Este mai mare decât maximul recomandat de %2$d cuvinte. %4$sScurtează fraza%5$s!"],"%1$sKeyphrase length%2$s: Good job!":["%1$sLungime frază cheie%2$s: foarte bine!"],"%1$sKeyphrase length%3$s: No focus keyphrase was set for this page. %2$sSet a keyphrase in order to calculate your SEO score%3$s.":["%1$sLungime frază cheie%3$s: nu ai stabilit nicio frază cheie pentru această pagină. %2$sIntrodu o frază cheie pentru a calcula punctajul SEO%3$s."],"%1$sKeyphrase in introduction%3$s: Your keyphrase or its synonyms do not appear in the first paragraph. %2$sMake sure the topic is clear immediately%3$s.":["%1$sFrază cheie în introducere%3$s: fraza cheie sau sinonimele ei nu apar în primul paragraf. %2$sAsigură-te că apar în introducere%3$s."],"%1$sKeyphrase in introduction%3$s:Your keyphrase or its synonyms appear in the first paragraph of the copy, but not within one sentence. %2$sFix that%3$s!":["%1$sFrază cheie în introducere%3$s: fraza cheie sau sinonimele ei apar în primul paragraf al textului, dar cuvintele nu sunt în aceeași propoziție. %2$sCorectează asta%3$s!"],"%1$sKeyphrase in introduction%2$s: Well done!":["%1$sFrază cheie în introducere%2$s: foarte bine!"],"%1$sInternal links%2$s: There are both nofollowed and normal internal links on this page. Good job!":["%1$sLegături interne%2$s: în această pagină sunt legături interne fără urmărire și normale. Foarte bine!"],"%1$sInternal links%2$s: You have enough internal links. Good job!":["%1$sLegături interne%2$s: ai suficiente legături interne. Foarte bine!"],"%1$sInternal links%3$s: The internal links in this page are all nofollowed. %2$sAdd some good internal links%3$s.":["%1$sLegături interne%3$s: în această pagină toate legăturile interne sunt fără urmărire. %2$sAdaugă și legături interne normale%3$s."],"%1$sInternal links%3$s: No internal links appear in this page, %2$smake sure to add some%3$s!":["%1$sLegături interne%3$s: în această pagină nu apare nicio legătură internă, %2$sasigură-te că adaugi câteva%3$s!"],"%1$sTransition words%2$s: Well done!":["%1$sCuvinte de legătură%2$s: foarte bine!"],"%1$sTransition words%2$s: Only %3$s of the sentences contain transition words, which is not enough. %4$sUse more of them%2$s.":["%1$sCuvinte de legătură%2$s: numai %3$s dintre propoziții conțin cuvinte de legătură, nu este suficient. %4$sFolosește mai multe%2$s."],"%1$sTransition words%2$s: None of the sentences contain transition words. %3$sUse some%2$s.":["%1$sCuvinte de legătură%2$s: niciuna dintre propoziții nu conține cuvinte de legătură. %3$sFolosește câteva%2$s."],"%1$sNot enough content%2$s: %3$sPlease add some content to enable a good analysis%2$s.":["%1$sConținut insuficient%2$s: %3$ste rog adaugă mai mult conținut pentru a permite o analiză completă%2$s."],"%1$sSubheading distribution%2$s: You are not using any subheadings, but your text is short enough and probably doesn't need them.":["%1$sDistribuție subtitluri%2$s: nu folosești niciun subtitlu, dar textul este destul de scurt și probabil subtitlurile nu sunt necesare."],"%1$sSubheading distribution%2$s: You are not using any subheadings, although your text is rather long. %3$sTry and add some subheadings%2$s.":["%1$sDistribuție subtitluri%2$s: nu folosești niciun subtitlu, cu toate că textul este destul de lung. %3$sÎncearcă să adaugi câteva subtitluri%2$s."],"%1$sSubheading distribution%2$s: %3$d section of your text is longer than %4$d words and is not separated by any subheadings. %5$sAdd subheadings to improve readability%2$s.":["%1$sDistribuție subtitluri%2$s: o secțiune a textului are mai mult de %4$d de cuvinte și nu este separată de niciun subtitlu. %5$sAdaugă subtitluri pentru a îmbunătăți lizibilitatea%2$s.","%1$sDistribuție subtitluri%2$s: %3$d secțiuni ale textului au mai mult de %4$d de cuvinte și nu sunt separate de niciun subtitlu. %5$sAdaugă subtitluri pentru a îmbunătăți lizibilitatea%2$s.","%1$sDistribuție subtitluri%2$s: %3$d de secțiuni ale textului au mai mult de %4$d de cuvinte și nu sunt separate de niciun subtitlu. %5$sAdaugă subtitluri pentru a îmbunătăți lizibilitatea%2$s."],"%1$sSubheading distribution%2$s: Great job!":["%1$sDistribuție subtitluri%2$s: foarte bine!"],"%1$sSentence length%2$s: %3$s of the sentences contain more than %4$s words, which is more than the recommended maximum of %5$s. %6$sTry to shorten the sentences%2$s.":["%1$sLungime propoziție%2$s: %3$s dintre propoziții conțin mai mult de %4$s cuvinte, este mai mult decât maximul recomandat de %5$s. %6$sÎncearcă să le scurtezi%2$s."],"%1$sSentence length%2$s: Great!":["%1$sLungime propoziție%2$s: bună!"],"%1$sConsecutive sentences%2$s: There is enough variety in your sentences. That's great!":["%1$sPropoziții consecutive%2$s: propozițiile sunt destul de diversificate. Foarte bine!"],"%1$sConsecutive sentences%2$s: The text contains %3$d consecutive sentences starting with the same word. %5$sTry to mix things up%2$s!":["%1$sPropoziții consecutive%2$s: textul conține %3$d propoziții consecutive care încep cu același cuvânt. %5$sÎncearcă să combini cuvintele%2$s!","%1$sPropoziții consecutive%2$s: textul conține %4$d situații în care %3$d sau mai multe propoziții consecutive încep cu același cuvânt. %5$sÎncearcă să combini cuvintele%2$s!","%1$sPropoziții consecutive%2$s: textul conține %4$d de situații în care %3$d sau mai multe propoziții consecutive încep cu același cuvânt. %5$sÎncearcă să combini cuvintele%2$s!"],"%1$sPassive voice%2$s: %3$s of the sentences contain passive voice, which is more than the recommended maximum of %4$s. %5$sTry to use their active counterparts%2$s.":["%1$sDiateză pasivă%2$s: %3$s dintre propoziții folosesc diateza pasivă, este mai mare decât maximul recomandat de %4$s. %5$sÎncearcă să folosești în schimb diateza activă%2$s."],"%1$sPassive voice%2$s: You're using enough active voice. That's great!":["%1$sDiateză pasivă%2$s: folosești suficient diateza activă. Foarte bine!"],"%1$sParagraph length%2$s: %3$d of the paragraphs contains more than the recommended maximum of %4$d words. %5$sShorten your paragraphs%2$s!":["%1$sLungime paragraf%2$s: un paragraf este mai mare decât maximul recomandat de %4$d de cuvinte. %5$sScurtează paragraful%2$s!","%1$sLungime paragraf%2$s: %3$d paragrafe sunt mai mari decât maximul recomandat de %4$d de cuvinte. %5$sScurtează paragrafele%2$s!","%1$sLungime paragraf%2$s: %3$d de paragrafe sunt mai mari decât maximul recomandat de %4$d de cuvinte. %5$sScurtează paragrafele%2$s!"],"%1$sParagraph length%2$s: None of the paragraphs are too long. Great job!":["%1$sLungime paragraf%2$s: niciun paragraf nu este prea lung. Foarte bine!"],"Good job!":["Foarte bine!"],"%1$sFlesch Reading Ease%2$s: The copy scores %3$s in the test, which is considered %4$s to read. %5$s%6$s%7$s":["%1$sCât de ușor este citit (Flesch Reading Ease)%2$s: textul a primit punctajul %3$s la efectuarea testului, este considerat %4$s de citit. %5$s%6$s%7$s"],"Scroll to see the preview content.":["Derulează pentru a vedea conținutul previzualizării."],"An error occurred in the '%1$s' assessment":["A apărut o eroare în evaluarea '%1$s'"],"%1$s of the words contain %2$sover %3$s syllables%4$s, which is more than the recommended maximum of %5$s.":["%1$s din cuvinte conțin %2$speste %3$s silabe%4$s, care este mai mult decât recomandarea maximă de %5$s."],"%1$s of the words contain %2$sover %3$s syllables%4$s, which is less than or equal to the recommended maximum of %5$s.":["%1$s din cuvinte conțin %2$speste %3$s silabe%4$s, care este mai puțin sau egal decât recomandarea maximă de %5$s."],"This is slightly below the recommended minimum of %5$d word. %3$sAdd a bit more copy%4$s.":["Este cu puțin sub minimul recomandat de %5$d cuvânt. %3$sMai adaugă puțin text%4$s.","Este cu puțin sub minimul recomandat de %5$d cuvinte. %3$sMai adaugă puțin text%4$s.","Este cu puțin sub minimul recomandat de %5$d de cuvinte. %3$sMai adaugă puțin text%4$s."],"The meta description contains %1$d sentence %2$sover %3$s words%4$s. Try to shorten this sentence.":["Descrierea meta conține %1$d propoziție %2$scu peste %3$s de cuvinte%4$s. Încearcă să scurtezi această propoziție.","Descrierea meta conține %1$d propoziții %2$scu peste %3$s de cuvinte%4$s. Încearcă să scurtezi aceste propoziții.","Descrierea meta conține %1$d de propoziții %2$scu peste %3$s de cuvinte%4$s. Încearcă să scurtezi aceste propoziții."],"The meta description contains no sentences %1$sover %2$s words%3$s.":["Descrierea meta conține nicio propoziție %1$s cu peste %2$s de cuvinte%3$s."],"Mobile preview":["Previzualizare pe mobil"],"Desktop preview":["Previzualizare desktop"],"Please provide an SEO title by editing the snippet below.":["Te rog furnizează un titlu SEO prin editarea fragmentului de mai jos."],"Meta description preview:":["Previzualizare descriere meta:"],"Slug preview:":["Previzualizare descriptor:"],"SEO title preview:":["Previzualizare titlu SEO:"],"Close snippet editor":["Închide editor fragment"],"Slug":["Descriptor"],"Remove marks in the text":["Înlătură marcaje în text"],"Mark this result in the text":["Marchează acest rezultat în text"],"Marks are disabled in current view":["Marcajele sunt dezactivate în vizualizarea curentă"],"Good SEO score":["Punctaj SEO bun"],"OK SEO score":["Punctaj SEO OK"],"Feedback":["Impresii"],"ok":["OK"],"Please provide a meta description by editing the snippet below.":["Te rog furnizează o descriere meta prin editarea fragmentului de mai jos."],"Edit snippet":["Editează fragmentul"],"You can click on each element in the preview to jump to the Snippet Editor.":["Poți da clic pe fiecare element din previzualizare pentru a sări la editor fragment."],"SEO title":["Titlu SEO"],"Needs improvement":["Necesită îmbunătățire"],"Good":["bun"],"very difficult":["foarte dificil"],"Try to make shorter sentences, using less difficult words to improve readability":["Pentru a îmbunătăți lizibilitatea, încearcă să faci propoziții mai scurte, folosind cuvinte mai puțin dificile."],"difficult":["dificil"],"Try to make shorter sentences to improve readability":["Pentru a îmbunătăți lizibilitatea, încearcă să faci propoziții mai scurte."],"fairly difficult":["destul de dificil"],"OK":["OK"],"fairly easy":["destul de ușor"],"easy":["ușor"],"very easy":["foarte ușor"],"Meta description":["Descriere meta"]}}}
languages/wordpress-seojs-ro_RO.json CHANGED
@@ -1 +1 @@
1
- {"domain":"wordpress-seo","locale_data":{"wordpress-seo":{"":{"domain":"wordpress-seo","plural-forms":"nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2);","lang":"ro"},"Google preview":["Previzualizare Google"],"When you click OK we will open our HelpScout beacon where you can find answers to your questions. This beacon will load our support data and also potentially set cookies.":["Când dai clic pe OK, vom deschide îndrumarul nostru HelpScout unde poți găsi răspunsuri la întrebările tale. Acest îndrumar va încărca datele noastre pentru suport și poate seta și cookie-uri."],"Schema":["Schema"],"Truly optimize your site for a local audience with our %s plugin! Optimized address details, opening hours, store locator and pickup option!":["Îți optimizezi cu adevărat situl pentru un public local cu modulul nostru %s! Detalii despre adresă și programul de funcționare optimizate și opțiuni pentru localizarea magazinului și preluarea comenzilor!"],"Serving local customers?":["Ai clienți locali?"],"Get the %s plugin now":["Ia modul %s acum"],"You can edit the details shown in meta data, like the social profiles, the name and the description of this user on their %1$s profile page.":["Poți edita detaliile afișate în metadate, cum ar fi profilurile sociale, numele și descrierea unui utilizator, pe pagina de profil %1$s."],"Select a user...":["Selectează un utilizator..."],"Name:":["Nume:"],"You have selected the user %1$s as the person this site represents. Their user profile information will now be used in search results. %2$sUpdate their profile to make sure the information is correct.%3$s":["Ai selectat utilizatorul %1$s drept persoana pe care acest sit o reprezintă. Informațiile despre profilul utilizatorului vor fi folosite acum în rezultatele de căutare. %2$sActualizează profilul utilizatorului pentru a te asigura că informațiile sunt corecte.%3$s"],"Error: Please select a user below to make your site's meta data complete.":["Eroare: te rog selectează un utilizator de mai jos pentru a completa metadatele sitului."],"New step added":["A fost adăugat un pas nou"],"New question added":["A fost adăugată o întrebare nouă"],"Did you know %s also analyzes the different word forms of your keyphrase, like plurals and past tenses?":["Știai că %s analizează și alte forme ale cuvintelor frazei cheie, cum ar fi pluralul și participiul trecut?"],"Help on choosing the perfect focus keyphrase":["Ajutor pentru alegerea frazei cheie perfecte"],"Would you like to add a related keyphrase?":["Vrei să adaugi o frază cheie similară?"],"Go %s!":["Fă %s!"],"Rank better with synonyms & related keyphrases":["Te clasezi mai sus cu fraze cheie sinonime și similare"],"Add related keyphrase":["Adaugă fraze cheie similare"],"Get %s":["Ia %s"],"Focus keyphrase":["Frază cheie"],"Learn more about the readability analysis":["Află mai multe despre analiza lizibilității"],"Describe the duration of the instruction:":["Descrie durata instruirii:"],"Optional. Customize how you want to describe the duration of the instruction":["Opțional. Personalizează cum vrei să descrii durata instruirii"],"%s, %s and %s":["%s, %s și %s"],"%s and %s":["%s și %s"],"%d minute":["1 minut","%d minute","%d de minute"],"%d hour":["O oră","%d ore","%d de ore"],"%d day":["O zi","%d zile","%d de zile"],"Enter a step title":["Introdu un titlu pentru pas"],"Optional. This can give you better control over the styling of the steps.":["Opțional. Acest lucru îți poate oferi un control mai bun asupra stilului pașilor."],"CSS class(es) to apply to the steps":["Clasă (clase) CSS de aplicat la pași"],"minutes":["minute"],"hours":["ore"],"days":["zile"],"Create a How-to guide in an SEO-friendly way. You can only use one How-to block per post.":["Creează un ghid de sfaturi practice într-o manieră prietenoasă pentru SEO. Poți folosi numai un singur bloc Sfaturi practice pentru fiecare articol."],"List your Frequently Asked Questions in an SEO-friendly way. You can only use one FAQ block per post.":["Afișează-ți întrebările frecvente într-o manieră prietenoasă pentru SEO. Poți folosi numai un singur bloc Întrebările frecvente pentru fiecare articol."],"Copy error":["Eroare text"],"An error occurred loading the %s primary taxonomy picker.":["A apărut o eroare la încărcarea selectorului taxonomiei principale %s."],"Time needed:":["Timp necesar:"],"Move question down":["Mută întrebarea în jos"],"Move question up":["Mută întrebarea în sus"],"Insert question":["Inserează întrebarea"],"Delete question":["Șterge întrebarea"],"Enter the answer to the question":["Introdu răspunsul la întrebare"],"Enter a question":["Introdu o întrebare"],"Add question":["Adaugă o întrebare"],"Frequently Asked Questions":["Întrebări frecvente"],"Great news: you can, with %s!":["Vești bune: poți, cu %s!"],"Select the primary %s":["Selectează %s principal"],"Mark as cornerstone content":["Fă-l conținut fundamental"],"Move step down":["Mută pasul în jos"],"Move step up":["Mută pasul în sus"],"Insert step":["Inserează pas"],"Delete step":["Șterge pasul"],"Add image":["Adaugă imagine"],"Enter a step description":["Introdu o descriere pentru pas"],"Enter a description":["Introdu o descriere"],"Unordered list":["Listă neordonată"],"Showing step items as an ordered list.":["Afișez elementele pasului ca listă ordonată."],"Showing step items as an unordered list":["Afișez elementele pasului ca listă neordonată."],"Add step":["Adaugă pas"],"Delete total time":["Șterge timpul total"],"Add total time":["Adaugă timp total"],"How to":["Sfaturi practice"],"How-to":["Sfaturi practice"],"Analysis results":["Rezultate analiză"],"Enter a focus keyphrase to calculate the SEO score":["Introdu o frază cheie pentru a calcula punctajul SEO"],"Learn more about Cornerstone Content.":["Află mai multe despre conținutul fundamental."],"Cornerstone content should be the most important and extensive articles on your site.":["Conținutul fundamental ar trebui să fie cele mai importante și mai ample articole de pe situl tău."],"Add synonyms":["Adaugă sinonime"],"Would you like to add keyphrase synonyms?":["Vrei să adaugi sinonime ale frazei cheie?"],"Current year":["Anul curent"],"Page":["Pagină"],"Tagline":["Slogan"],"Modify your meta description by editing it right here":["Modifică-ți descrierea meta editând-o chiar aici"],"ID":["ID"],"Separator":["Separator"],"Search phrase":["Frază de căutare"],"Term description":["Descriere termen"],"Tag description":["Descriere etichetă"],"Category description":["Descriere categorie"],"Primary category":["Categorie principală"],"Category":["Categorie"],"Excerpt only":["Numai rezumat"],"Excerpt":["Rezumat"],"Site title":["Titlu sit"],"Parent title":["Titlu părinte"],"Date":["Dată"],"24/7 email support":["Suport prin email non-stop (24/7)"],"SEO analysis":["Analiză SEO"],"Other benefits of %s for you:":["Alte avantaje ale %s pentru tine:"],"Cornerstone content":["Conținut fundamental"],"Superfast internal linking suggestions":["Sugestii de legare internă ultrarapidă"],"Great news: you can, with %1$s!":["Vești bune: poți, cu %1$s!"],"1 year free support and updates included!":["Sunt incluse suport și actualizări gratuite pentru un an!"],"%1$sSocial media preview%2$s: Facebook & Twitter":["%1$sPrevizualizare media socială%2$s: Facebook și Twitter"],"%1$sNo more dead links%2$s: easy redirect manager":["%1$sNicio legătură moartă%2$s: manager de redirecționări fără niciun efort"],"No ads!":["Fără anunțuri!"],"Please provide a meta description by editing the snippet below.":["Te rog furnizează o descriere meta prin editarea fragmentului de mai jos."],"The name of the person":["Numele persoanei"],"Readability analysis":["Analiză lizibilitate"],"Open":["Deschide"],"Title":["Titlu"],"Close":["Închide"],"FAQ":["Întrebări frecvente"],"Settings":["Setări"]}}}
1
+ {"domain":"wordpress-seo","locale_data":{"wordpress-seo":{"":{"domain":"wordpress-seo","plural-forms":"nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2);","lang":"ro"},"Google preview":["Previzualizare Google"],"When you click OK we will open our HelpScout beacon where you can find answers to your questions. This beacon will load our support data and also potentially set cookies.":["Când dai clic pe OK, vom deschide îndrumarul nostru HelpScout unde poți găsi răspunsuri la întrebările tale. Acest îndrumar va încărca datele noastre pentru suport și poate seta și cookie-uri."],"Schema":["Schema"],"Truly optimize your site for a local audience with our %s plugin! Optimized address details, opening hours, store locator and pickup option!":["Îți optimizezi cu adevărat situl pentru un public local cu modulul nostru %s! Detalii despre adresă și programul de funcționare optimizate și opțiuni pentru localizarea magazinului și preluarea comenzilor!"],"Serving local customers?":["Ai clienți locali?"],"Get the %s plugin now":["Ia modul %s acum"],"You can edit the details shown in meta data, like the social profiles, the name and the description of this user on their %1$s profile page.":["Poți edita detaliile afișate în metadate, cum ar fi profilurile sociale, numele și descrierea unui utilizator, pe pagina de profil %1$s."],"Select a user...":["Selectează un utilizator..."],"Name:":["Nume:"],"You have selected the user %1$s as the person this site represents. Their user profile information will now be used in search results. %2$sUpdate their profile to make sure the information is correct.%3$s":["Ai selectat utilizatorul %1$s drept persoana pe care acest sit o reprezintă. Acum vor fi folosite în rezultatele de căutare informațiile din profilul utilizatorului. %2$sActualizează profilul utilizatorului pentru a te asigura că informațiile sunt corecte.%3$s"],"Error: Please select a user below to make your site's meta data complete.":["Eroare: te rog selectează un utilizator de mai jos pentru a completa metadatele sitului."],"New step added":["A fost adăugat un pas nou"],"New question added":["A fost adăugată o întrebare nouă"],"Did you know %s also analyzes the different word forms of your keyphrase, like plurals and past tenses?":["Știai că %s analizează și alte forme ale cuvintelor frazei cheie, cum ar fi pluralul și participiul trecut?"],"Help on choosing the perfect focus keyphrase":["Ajutor pentru alegerea frazei cheie perfecte"],"Would you like to add a related keyphrase?":["Vrei să adaugi o frază cheie similară?"],"Go %s!":["Fă %s!"],"Rank better with synonyms & related keyphrases":["Te clasezi mai sus cu fraze cheie sinonime și similare"],"Add related keyphrase":["Adaugă fraze cheie similare"],"Get %s":["Ia %s"],"Focus keyphrase":["Frază cheie"],"Learn more about the readability analysis":["Află mai multe despre analiza lizibilității"],"Describe the duration of the instruction:":["Descrie durata instruirii:"],"Optional. Customize how you want to describe the duration of the instruction":["Opțional. Personalizează cum vrei să descrii durata instruirii"],"%s, %s and %s":["%s, %s și %s"],"%s and %s":["%s și %s"],"%d minute":["1 minut","%d minute","%d de minute"],"%d hour":["O oră","%d ore","%d de ore"],"%d day":["O zi","%d zile","%d de zile"],"Enter a step title":["Introdu un titlu pentru pas"],"Optional. This can give you better control over the styling of the steps.":["Opțional. Acest lucru îți poate oferi un control mai bun asupra stilului pașilor."],"CSS class(es) to apply to the steps":["Clasă (clase) CSS de aplicat la pași"],"minutes":["minute"],"hours":["ore"],"days":["zile"],"Create a How-to guide in an SEO-friendly way. You can only use one How-to block per post.":["Creează un ghid de sfaturi practice într-o manieră prietenoasă pentru SEO. Poți folosi numai un singur bloc Sfaturi practice pentru fiecare articol."],"List your Frequently Asked Questions in an SEO-friendly way. You can only use one FAQ block per post.":["Afișează-ți întrebările frecvente într-o manieră prietenoasă pentru SEO. Poți folosi numai un singur bloc Întrebările frecvente pentru fiecare articol."],"Copy error":["Eroare text"],"An error occurred loading the %s primary taxonomy picker.":["A apărut o eroare la încărcarea selectorului taxonomiei principale %s."],"Time needed:":["Timp necesar:"],"Move question down":["Mută întrebarea în jos"],"Move question up":["Mută întrebarea în sus"],"Insert question":["Inserează întrebarea"],"Delete question":["Șterge întrebarea"],"Enter the answer to the question":["Introdu răspunsul la întrebare"],"Enter a question":["Introdu o întrebare"],"Add question":["Adaugă o întrebare"],"Frequently Asked Questions":["Întrebări frecvente"],"Great news: you can, with %s!":["Vești bune: poți, cu %s!"],"Select the primary %s":["Selectează %s principal"],"Mark as cornerstone content":["Fă-l conținut fundamental"],"Move step down":["Mută pasul în jos"],"Move step up":["Mută pasul în sus"],"Insert step":["Inserează pas"],"Delete step":["Șterge pasul"],"Add image":["Adaugă imagine"],"Enter a step description":["Introdu o descriere pentru pas"],"Enter a description":["Introdu o descriere"],"Unordered list":["Listă neordonată"],"Showing step items as an ordered list.":["Afișez elementele pasului ca listă ordonată."],"Showing step items as an unordered list":["Afișez elementele pasului ca listă neordonată."],"Add step":["Adaugă pas"],"Delete total time":["Șterge timpul total"],"Add total time":["Adaugă timp total"],"How to":["Sfaturi practice"],"How-to":["Sfaturi practice"],"Analysis results":["Rezultate analiză"],"Enter a focus keyphrase to calculate the SEO score":["Introdu o frază cheie pentru a calcula punctajul SEO"],"Learn more about Cornerstone Content.":["Află mai multe despre conținutul fundamental."],"Cornerstone content should be the most important and extensive articles on your site.":["Conținutul fundamental ar trebui să fie cele mai importante și mai ample articole de pe situl tău."],"Add synonyms":["Adaugă sinonime"],"Would you like to add keyphrase synonyms?":["Vrei să adaugi sinonime ale frazei cheie?"],"Current year":["Anul curent"],"Page":["Pagină"],"Tagline":["Slogan"],"Modify your meta description by editing it right here":["Modifică-ți descrierea meta editând-o chiar aici"],"ID":["ID"],"Separator":["Separator"],"Search phrase":["Frază de căutare"],"Term description":["Descriere termen"],"Tag description":["Descriere etichetă"],"Category description":["Descriere categorie"],"Primary category":["Categorie principală"],"Category":["Categorie"],"Excerpt only":["Numai rezumat"],"Excerpt":["Rezumat"],"Site title":["Titlu sit"],"Parent title":["Titlu părinte"],"Date":["Dată"],"24/7 email support":["Suport prin email non-stop (24/7)"],"SEO analysis":["Analiză SEO"],"Other benefits of %s for you:":["Alte avantaje ale %s pentru tine:"],"Cornerstone content":["Conținut fundamental"],"Superfast internal linking suggestions":["Sugestii de legare internă ultrarapidă"],"Great news: you can, with %1$s!":["Vești bune: poți, cu %1$s!"],"1 year free support and updates included!":["Sunt incluse suport și actualizări gratuite pentru un an!"],"%1$sSocial media preview%2$s: Facebook & Twitter":["%1$sPrevizualizare media socială%2$s: Facebook și Twitter"],"%1$sNo more dead links%2$s: easy redirect manager":["%1$sNicio legătură moartă%2$s: manager de redirecționări fără niciun efort"],"No ads!":["Fără anunțuri!"],"Please provide a meta description by editing the snippet below.":["Te rog furnizează o descriere meta prin editarea fragmentului de mai jos."],"The name of the person":["Numele persoanei"],"Readability analysis":["Analiză lizibilitate"],"Open":["Deschide"],"Title":["Titlu"],"Close":["Închide"],"FAQ":["Întrebări frecvente"],"Settings":["Setări"]}}}
lib/orm.php CHANGED
@@ -223,12 +223,11 @@ class ORM implements \ArrayAccess {
223
  * Factory method, return an instance of this class bound to the supplied
224
  * table name.
225
  *
226
- * A repeat of content in parent::for_table, so that created class is
227
- * ORMWrapper, not ORM.
228
  *
229
- * @param string $table_name Table name. The table to create instance for.
230
  *
231
- * @return ORM Instance of the ORM wrapper.
232
  */
233
  public static function for_table( $table_name ) {
234
  return new static( $table_name, [] );
223
  * Factory method, return an instance of this class bound to the supplied
224
  * table name.
225
  *
226
+ * A repeat of content in parent::for_table, so that created class is ORM.
 
227
  *
228
+ * @param string $table_name The table to create instance for.
229
  *
230
+ * @return ORM Instance of the ORM.
231
  */
232
  public static function for_table( $table_name ) {
233
  return new static( $table_name, [] );
lib/ruckusing-adapter.php CHANGED
@@ -62,6 +62,7 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
62
  * @var boolean
63
  */
64
  private $_in_trx = false;
 
65
  /**
66
  * Creates an instance of Ruckusing_Adapter.
67
  *
@@ -72,6 +73,7 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
72
  public function __construct( $config ) {
73
  $this->set_dsn( $config );
74
  }
 
75
  /**
76
  * Get the current db name
77
  *
@@ -79,8 +81,10 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
79
  */
80
  public function get_database_name() {
81
  global $wpdb;
 
82
  return $wpdb->dbname;
83
  }
 
84
  /**
85
  * Check support for migrations
86
  *
@@ -89,15 +93,43 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
89
  public function supports_migrations() {
90
  return true;
91
  }
 
92
  /**
93
  * Get the column native types
94
  *
95
  * @return array
96
  */
97
  public function native_database_types() {
98
- $types = [ 'primary_key' => [ 'name' => 'integer', 'limit' => 11, 'null' => false ], 'string' => [ 'name' => 'varchar', 'limit' => 255 ], 'text' => [ 'name' => 'text' ], 'tinytext' => [ 'name' => 'tinytext' ], 'mediumtext' => [ 'name' => 'mediumtext' ], 'integer' => [ 'name' => 'int', 'limit' => 11 ], 'tinyinteger' => [ 'name' => 'tinyint' ], 'smallinteger' => [ 'name' => 'smallint' ], 'mediuminteger' => [ 'name' => 'mediumint' ], 'biginteger' => [ 'name' => 'bigint' ], 'float' => [ 'name' => 'float' ], 'decimal' => [ 'name' => 'decimal', 'scale' => 0, 'precision' => 10 ], 'datetime' => [ 'name' => 'datetime' ], 'timestamp' => [ 'name' => 'timestamp' ], 'time' => [ 'name' => 'time' ], 'date' => [ 'name' => 'date' ], 'binary' => [ 'name' => 'blob' ], 'tinybinary' => [ 'name' => 'tinyblob' ], 'mediumbinary' => [ 'name' => 'mediumblob' ], 'longbinary' => [ 'name' => 'longblob' ], 'boolean' => [ 'name' => 'tinyint', 'limit' => 1 ], 'enum' => [ 'name' => 'enum', 'values' => [] ], 'uuid' => [ 'name' => 'char', 'limit' => 36 ], 'char' => [ 'name' => 'char' ] ];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
99
  return $types;
100
  }
 
101
  /**
102
  * Create the schema table, if necessary
103
  */
@@ -109,6 +141,7 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
109
  $this->add_index( $this->get_schema_version_table_name(), 'version', [ 'unique' => true ] );
110
  }
111
  }
 
112
  /**
113
  * Start Transaction
114
  */
@@ -117,6 +150,7 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
117
  $this->beginTransaction();
118
  }
119
  }
 
120
  /**
121
  * Commit Transaction
122
  */
@@ -125,6 +159,7 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
125
  $this->commit();
126
  }
127
  }
 
128
  /**
129
  * Rollback Transaction
130
  */
@@ -133,15 +168,18 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
133
  $this->rollback();
134
  }
135
  }
 
136
  /**
137
  * Quote a table name string
138
  *
139
  * @param string $str table name.
 
140
  * @return string
141
  */
142
  public function quote_table( $str ) {
143
  return '`' . $str . '`';
144
  }
 
145
  /**
146
  * Column definition
147
  *
@@ -153,9 +191,11 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
153
  */
154
  public function column_definition( $column_name, $type, $options = null ) {
155
  $col = new Ruckusing_Adapter_ColumnDefinition( $this, $column_name, $type, $options );
 
156
  return $col->__toString();
157
  }
158
  // -------- DATABASE LEVEL OPERATIONS
 
159
  /**
160
  * Check if a db exists
161
  *
@@ -164,7 +204,7 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
164
  * @return boolean
165
  */
166
  public function database_exists( $db ) {
167
- $ddl = 'SHOW DATABASES';
168
  $result = $this->select_all( $ddl );
169
  if ( \count( $result ) == 0 ) {
170
  return false;
@@ -174,8 +214,10 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
174
  return true;
175
  }
176
  }
 
177
  return false;
178
  }
 
179
  /**
180
  * Create a database
181
  *
@@ -187,10 +229,12 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
187
  if ( $this->database_exists( $db ) ) {
188
  return false;
189
  }
190
- $ddl = \sprintf( 'CREATE DATABASE %s', $this->identifier( $db ) );
191
  $result = $this->query( $ddl );
 
192
  return $result === true;
193
  }
 
194
  /**
195
  * Drop a database
196
  *
@@ -202,10 +246,12 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
202
  if ( ! $this->database_exists( $db ) ) {
203
  return false;
204
  }
205
- $ddl = \sprintf( 'DROP DATABASE IF EXISTS %s', $this->identifier( $db ) );
206
  $result = $this->query( $ddl );
 
207
  return $result === true;
208
  }
 
209
  /**
210
  * Dump the complete schema of the DB. This is really just all of the
211
  * CREATE TABLE statements for all of the tables in the DB.
@@ -224,7 +270,7 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
224
  if ( $tbl == 'schema_info' ) {
225
  continue;
226
  }
227
- $stmt = \sprintf( 'SHOW CREATE TABLE %s', $this->identifier( $tbl ) );
228
  $result = $this->query( $stmt );
229
  if ( \is_array( $result ) && \count( $result ) == 1 ) {
230
  $row = $result[0];
@@ -238,8 +284,10 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
238
  }
239
  }
240
  $data = $final . $views;
 
241
  return \file_put_contents( $output_file, $data, \LOCK_EX );
242
  }
 
243
  /**
244
  * Check if a table exists
245
  *
@@ -249,9 +297,23 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
249
  * @return boolean
250
  */
251
  public function table_exists( $tbl, $reload_tables = false ) {
252
- $this->load_tables( $reload_tables );
253
- return \array_key_exists( $tbl, $this->_tables );
 
 
 
 
 
 
 
 
 
 
 
 
 
254
  }
 
255
  /**
256
  * Wrapper to execute a query
257
  *
@@ -262,24 +324,26 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
262
  public function execute( $query ) {
263
  return $this->query( $query );
264
  }
 
265
  /**
266
  * Execute a query
267
  *
268
  * @param string $query query to run
269
  *
270
- * @throws Ruckusing_Exception
271
  * @return boolean
 
272
  */
273
  public function query( $query ) {
274
  global $wpdb;
275
 
276
  $query_type = $this->determine_query_type( $query );
277
- $data = [];
278
  if ( $query_type == SQL_SELECT || $query_type == SQL_SHOW ) {
279
  $data = $wpdb->get_results( $query, ARRAY_A );
280
  if ( $this->isError( $data ) ) {
281
  throw new Ruckusing_Exception( \sprintf( "Error executing 'query' with:\n%s\n\nReason: %s\n\n", $query, $wpdb->last_error ), Ruckusing_Exception::QUERY_ERROR );
282
  }
 
283
  return $data;
284
  } else {
285
  // INSERT, DELETE, etc...
@@ -290,30 +354,34 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
290
  if ( $query_type == SQL_INSERT ) {
291
  return $wpdb->insert_id;
292
  }
 
293
  return true;
294
  }
295
  }
 
296
  /**
297
  * Execute several queries
298
  *
299
  * @param string $queries queries to run
300
  *
301
- * @throws Ruckusing_Exception
302
  * @return boolean
 
303
  */
304
  public function multi_query( $queries ) {
305
  if ( \defined( 'YOAST_ENVIRONMENT' ) && YOAST_ENVIRONMENT !== 'production' ) {
306
  throw new Ruckusing_Exception( 'WPDB does not support multi_query.', Ruckusing_Exception::QUERY_ERROR );
307
  }
 
308
  return false;
309
  }
 
310
  /**
311
  * Select one
312
  *
313
  * @param string $query query to run
314
  *
315
- * @throws Ruckusing_Exception
316
  * @return array
 
317
  */
318
  public function select_one( $query ) {
319
  global $wpdb;
@@ -324,11 +392,13 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
324
  if ( $this->isError( $res ) ) {
325
  throw new Ruckusing_Exception( \sprintf( "Error executing 'query' with:\n%s\n\nReason: %s\n\n", $query, $wpdb->last_error ), Ruckusing_Exception::QUERY_ERROR );
326
  }
 
327
  return $wpdb->last_result;
328
  } else {
329
  throw new Ruckusing_Exception( "Query for select_one() is not one of SELECT or SHOW: {$query}", Ruckusing_Exception::QUERY_ERROR );
330
  }
331
  }
 
332
  /**
333
  * Select all
334
  *
@@ -339,6 +409,7 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
339
  public function select_all( $query ) {
340
  return $this->query( $query );
341
  }
 
342
  /**
343
  * Use this method for non-SELECT queries
344
  * Or anything where you dont necessarily expect a result string, e.g. DROPs, CREATEs, etc.
@@ -349,8 +420,10 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
349
  */
350
  public function execute_ddl( $ddl ) {
351
  $result = $this->query( $ddl );
 
352
  return true;
353
  }
 
354
  /**
355
  * Drop table
356
  *
@@ -359,20 +432,24 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
359
  * @return boolean
360
  */
361
  public function drop_table( $tbl ) {
362
- $ddl = \sprintf( 'DROP TABLE IF EXISTS %s', $this->identifier( $tbl ) );
363
  $result = $this->query( $ddl );
 
364
  return true;
365
  }
 
366
  /**
367
  * Create table
368
  *
369
  * @param string $table_name the table name
370
- * @param array $options the options
 
371
  * @return bool|Ruckusing_Adapter_MySQL_TableDefinition
372
  */
373
  public function create_table( $table_name, $options = [] ) {
374
  return new Ruckusing_Adapter_MySQL_TableDefinition( $this, $table_name, $options );
375
  }
 
376
  /**
377
  * Escape a string for mysql
378
  *
@@ -382,8 +459,10 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
382
  */
383
  public function quote_string( $str ) {
384
  global $wpdb;
 
385
  return $wpdb->_escape( $str );
386
  }
 
387
  /**
388
  * Quote a string
389
  *
@@ -394,6 +473,7 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
394
  public function identifier( $str ) {
395
  return '`' . $str . '`';
396
  }
 
397
  /**
398
  * Quote a string
399
  *
@@ -405,14 +485,15 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
405
  public function quote( $value, $column = null ) {
406
  return $this->quote_string( $value );
407
  }
 
408
  /**
409
  * Rename a table
410
  *
411
- * @param string $name the current table name
412
  * @param string $new_name the new table name
413
  *
414
- * @throws Ruckusing_Exception
415
  * @return boolean
 
416
  */
417
  public function rename_table( $name, $new_name ) {
418
  if ( empty( $name ) ) {
@@ -422,19 +503,21 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
422
  throw new Ruckusing_Exception( 'Missing new column name parameter', Ruckusing_Exception::INVALID_ARGUMENT );
423
  }
424
  $sql = \sprintf( 'RENAME TABLE %s TO %s', $this->identifier( $name ), $this->identifier( $new_name ) );
 
425
  return $this->execute_ddl( $sql );
426
  }
427
  // create_table
 
428
  /**
429
  * Add a column
430
  *
431
- * @param string $table_name the table name
432
  * @param string $column_name the column name
433
- * @param string $type the column type
434
- * @param array $options column options
435
  *
436
- * @throws Ruckusing_Exception
437
  * @return boolean
 
438
  */
439
  public function add_column( $table_name, $column_name, $type, $options = [] ) {
440
  if ( empty( $table_name ) ) {
@@ -458,9 +541,11 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
458
  }
459
  $sql = \sprintf( 'ALTER TABLE %s ADD `%s` %s', $this->identifier( $table_name ), $column_name, $this->type_to_sql( $type, $options ) );
460
  $sql .= $this->add_column_options( $type, $options );
 
461
  return $this->execute_ddl( $sql );
462
  }
463
  // add_column
 
464
  /**
465
  * Drop a column
466
  *
@@ -471,18 +556,20 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
471
  */
472
  public function remove_column( $table_name, $column_name ) {
473
  $sql = \sprintf( 'ALTER TABLE %s DROP COLUMN %s', $this->identifier( $table_name ), $this->identifier( $column_name ) );
 
474
  return $this->execute_ddl( $sql );
475
  }
476
  // remove_column
 
477
  /**
478
  * Rename a column
479
  *
480
- * @param string $table_name the table name
481
- * @param string $column_name the column name
482
  * @param string $new_column_name the new column name
483
  *
484
- * @throws Ruckusing_Exception
485
  * @return boolean
 
486
  */
487
  public function rename_column( $table_name, $column_name, $new_column_name ) {
488
  if ( empty( $table_name ) ) {
@@ -494,23 +581,25 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
494
  if ( empty( $new_column_name ) ) {
495
  throw new Ruckusing_Exception( 'Missing new column name parameter', Ruckusing_Exception::INVALID_ARGUMENT );
496
  }
497
- $column_info = $this->column_info( $table_name, $column_name );
498
  $current_type = $column_info['type'];
499
- $sql = \sprintf( 'ALTER TABLE %s CHANGE %s %s %s', $this->identifier( $table_name ), $this->identifier( $column_name ), $this->identifier( $new_column_name ), $current_type );
500
- $sql .= $this->add_column_options( $current_type, $column_info );
 
501
  return $this->execute_ddl( $sql );
502
  }
503
  // rename_column
 
504
  /**
505
  * Change a column
506
  *
507
- * @param string $table_name the table name
508
  * @param string $column_name the column name
509
- * @param string $type the column type
510
- * @param array $options column options
511
  *
512
- * @throws Ruckusing_Exception
513
  * @return boolean
 
514
  */
515
  public function change_column( $table_name, $column_name, $type, $options = [] ) {
516
  if ( empty( $table_name ) ) {
@@ -535,17 +624,19 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
535
  }
536
  $sql = \sprintf( 'ALTER TABLE `%s` CHANGE `%s` `%s` %s', $table_name, $column_name, $column_name, $this->type_to_sql( $type, $options ) );
537
  $sql .= $this->add_column_options( $type, $options );
 
538
  return $this->execute_ddl( $sql );
539
  }
540
  // change_column
 
541
  /**
542
  * Get a column info
543
  *
544
- * @param string $table the table name
545
  * @param string $column the column name
546
  *
547
- * @throws Ruckusing_Exception
548
  * @return array
 
549
  */
550
  public function column_info( $table, $column ) {
551
  if ( empty( $table ) ) {
@@ -555,26 +646,28 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
555
  throw new Ruckusing_Exception( 'Missing original column name parameter', Ruckusing_Exception::INVALID_ARGUMENT );
556
  }
557
  try {
558
- $sql = \sprintf( "SHOW FULL COLUMNS FROM %s LIKE '%s'", $this->identifier( $table ), $column );
559
  $result = $this->select_one( $sql );
560
  if ( \is_array( $result ) ) {
561
  // lowercase key names
562
  $result = \array_change_key_case( $result, \CASE_LOWER );
563
  }
 
564
  return $result;
565
- } catch (\Exception $e) {
566
  return null;
567
  }
568
  }
 
569
  /**
570
  * Add an index
571
  *
572
- * @param string $table_name the table name
573
  * @param string $column_name the column name
574
- * @param array $options index options
575
  *
576
- * @throws Ruckusing_Exception
577
  * @return boolean
 
578
  */
579
  public function add_index( $table_name, $column_name, $options = [] ) {
580
  if ( empty( $table_name ) ) {
@@ -612,17 +705,19 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
612
  $cols[] = $this->identifier( $name );
613
  }
614
  $sql = \sprintf( 'CREATE %sINDEX %s ON %s(%s)', $unique ? 'UNIQUE ' : '', $this->identifier( $index_name ), $this->identifier( $table_name ), \join( ', ', $cols ) );
 
615
  return $this->execute_ddl( $sql );
616
  }
 
617
  /**
618
  * Drop an index
619
  *
620
- * @param string $table_name the table name
621
  * @param string $column_name the column name
622
- * @param array $options index options
623
  *
624
- * @throws Ruckusing_Exception
625
  * @return boolean
 
626
  */
627
  public function remove_index( $table_name, $column_name, $options = [] ) {
628
  if ( empty( $table_name ) ) {
@@ -638,8 +733,10 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
638
  $index_name = Ruckusing_Util_Naming::index_name( $table_name, $column_name );
639
  }
640
  $sql = \sprintf( 'DROP INDEX %s ON %s', $this->identifier( $index_name ), $this->identifier( $table_name ) );
 
641
  return $this->execute_ddl( $sql );
642
  }
 
643
  /**
644
  * Add timestamps
645
  *
@@ -660,9 +757,15 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
660
  throw new Ruckusing_Exception( 'Missing updated at column name parameter', Ruckusing_Exception::INVALID_ARGUMENT );
661
  }
662
  $created_at = $this->add_column( $table_name, $created_column_name, 'datetime' );
663
- $updated_at = $this->add_column( $table_name, $updated_column_name, 'timestamp', [ 'null' => false, 'default' => 'CURRENT_TIMESTAMP', 'extra' => 'ON UPDATE CURRENT_TIMESTAMP' ] );
 
 
 
 
 
664
  return $created_at && $updated_at;
665
  }
 
666
  /**
667
  * Remove timestamps
668
  *
@@ -684,17 +787,19 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
684
  }
685
  $updated_at = $this->remove_column( $table_name, $created_column_name );
686
  $created_at = $this->remove_column( $table_name, $updated_column_name );
 
687
  return $created_at && $updated_at;
688
  }
 
689
  /**
690
  * Check an index
691
  *
692
- * @param string $table_name the table name
693
  * @param string $column_name the column name
694
- * @param array $options index options
695
  *
696
- * @throws Ruckusing_Exception
697
  * @return boolean
 
698
  */
699
  public function has_index( $table_name, $column_name, $options = [] ) {
700
  if ( empty( $table_name ) ) {
@@ -715,8 +820,10 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
715
  return true;
716
  }
717
  }
 
718
  return false;
719
  }
 
720
  /**
721
  * Return all indexes of a table
722
  *
@@ -725,8 +832,8 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
725
  * @return array
726
  */
727
  public function indexes( $table_name ) {
728
- $sql = \sprintf( 'SHOW KEYS FROM %s', $this->identifier( $table_name ) );
729
- $result = $this->select_all( $sql );
730
  $indexes = [];
731
  $cur_idx = null;
732
  foreach ( $result as $row ) {
@@ -734,11 +841,13 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
734
  if ( $row['Key_name'] == 'PRIMARY' ) {
735
  continue;
736
  }
737
- $cur_idx = $row['Key_name'];
738
  $indexes[] = [ 'name' => $row['Key_name'], 'unique' => (int) $row['Non_unique'] == 0 ? true : false ];
739
  }
 
740
  return $indexes;
741
  }
 
742
  /**
743
  * Convert type to sql
744
  * $limit = null, $precision = null, $scale = null
@@ -746,8 +855,8 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
746
  * @param string $type the native type
747
  * @param array $options
748
  *
749
- * @throws Ruckusing_Exception
750
  * @return string
 
751
  */
752
  public function type_to_sql( $type, $options = [] ) {
753
  $natives = $this->native_database_types();
@@ -764,9 +873,9 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
764
  }
765
  throw new Ruckusing_Exception( $error, Ruckusing_Exception::INVALID_ARGUMENT );
766
  }
767
- $scale = null;
768
  $precision = null;
769
- $limit = null;
770
  if ( isset( $options['precision'] ) ) {
771
  $precision = $options['precision'];
772
  }
@@ -831,7 +940,10 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
831
  if ( empty( $values ) ) {
832
  throw new Ruckusing_Exception( 'Error adding enum column: there must be at least one value defined', Ruckusing_Exception::INVALID_ARGUMENT );
833
  } else {
834
- $column_type_sql .= \sprintf( "('%s')", \implode( "','", \array_map( [ $this, 'quote_string' ], $values ) ) );
 
 
 
835
  }
836
  }
837
  // not a decimal column
@@ -841,16 +953,18 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
841
  if ( $limit ) {
842
  $column_type_sql .= \sprintf( '(%d)', $limit );
843
  }
 
844
  return $column_type_sql;
845
  }
 
846
  /**
847
  * Add column options
848
  *
849
  * @param string $type the native type
850
  * @param array $options
851
  *
852
- * @throws Ruckusing_Exception
853
  * @return string
 
854
  */
855
  public function add_column_options( $type, $options ) {
856
  $sql = '';
@@ -884,7 +998,7 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
884
  $default_format = "'%s'";
885
  }
886
  $default_value = \sprintf( $default_format, $options['default'] );
887
- $sql .= \sprintf( ' DEFAULT %s', $default_value );
888
  }
889
  if ( \array_key_exists( 'null', $options ) ) {
890
  if ( $options['null'] === false || $options['null'] === 'NO' ) {
@@ -902,8 +1016,10 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
902
  if ( \array_key_exists( 'after', $options ) ) {
903
  $sql .= \sprintf( ' AFTER %s', $this->identifier( $options['after'] ) );
904
  }
 
905
  return $sql;
906
  }
 
907
  /**
908
  * Set current version
909
  *
@@ -913,8 +1029,10 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
913
  */
914
  public function set_current_version( $version ) {
915
  $sql = \sprintf( "INSERT INTO %s (version) VALUES ('%s')", $this->get_schema_version_table_name(), $version );
 
916
  return $this->execute_ddl( $sql );
917
  }
 
918
  /**
919
  * remove a version
920
  *
@@ -924,8 +1042,10 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
924
  */
925
  public function remove_version( $version ) {
926
  $sql = \sprintf( "DELETE FROM %s WHERE version = '%s'", $this->get_schema_version_table_name(), $version );
 
927
  return $this->execute_ddl( $sql );
928
  }
 
929
  /**
930
  * Return a message displaying the current version
931
  *
@@ -947,6 +1067,7 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
947
  private function isError( $o ) {
948
  return $o === false;
949
  }
 
950
  /**
951
  * Initialize an array of table names
952
  *
@@ -959,17 +1080,18 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
959
  $this->_tables = [];
960
  // clear existing structure
961
  $query = 'SHOW TABLES';
962
- $res = $wpdb->get_results( $query, \ARRAY_N );
963
  // check for errors
964
  if ( $this->isError( $res ) ) {
965
  throw new Ruckusing_Exception( \sprintf( "Error executing 'query' with:\n%s\n\nReason: %s\n\n", $query, $wpdb->last_error ), Ruckusing_Exception::QUERY_ERROR );
966
  }
967
  foreach ( $res as $row ) {
968
- $table = $row[0];
969
  $this->_tables[ $table ] = true;
970
  }
971
  }
972
  }
 
973
  /**
974
  * Check query type
975
  *
@@ -1007,20 +1129,24 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
1007
  return SQL_UNKNOWN_QUERY_TYPE;
1008
  }
1009
  }
 
1010
  /**
1011
  * Check query type
1012
  *
1013
  * @param $query_type
1014
- * @internal param string $query query to run
1015
  *
1016
  * @return boolean
 
 
1017
  */
1018
  private function is_select( $query_type ) {
1019
  if ( $query_type == SQL_SELECT ) {
1020
  return true;
1021
  }
 
1022
  return false;
1023
  }
 
1024
  /**
1025
  * Detect whether or not the string represents a function call and if so
1026
  * do not wrap it in single-quotes, otherwise do wrap in single quotes.
@@ -1031,12 +1157,13 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
1031
  */
1032
  private function is_sql_method_call( $str ) {
1033
  $str = \trim( $str );
1034
- if ( \substr( $str, -2, 2 ) == '()' ) {
1035
  return true;
1036
  } else {
1037
  return false;
1038
  }
1039
  }
 
1040
  /**
1041
  * Check if in transaction
1042
  *
@@ -1045,6 +1172,7 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
1045
  private function inTransaction() {
1046
  return $this->_in_trx;
1047
  }
 
1048
  /**
1049
  * Start transaction
1050
  */
@@ -1057,6 +1185,7 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
1057
  $wpdb->query( 'START TRANSACTION' );
1058
  $this->_in_trx = true;
1059
  }
 
1060
  /**
1061
  * Commit a transaction
1062
  */
@@ -1069,6 +1198,7 @@ class Ruckusing_Adapter extends Ruckusing_Adapter_MySQL_Base implements Ruckusin
1069
  $wpdb->query( 'COMMIT' );
1070
  $this->_in_trx = false;
1071
  }
 
1072
  /**
1073
  * Rollback a transaction
1074
  */
62
  * @var boolean
63
  */
64
  private $_in_trx = false;
65
+
66
  /**
67
  * Creates an instance of Ruckusing_Adapter.
68
  *
73
  public function __construct( $config ) {
74
  $this->set_dsn( $config );
75
  }
76
+
77
  /**
78
  * Get the current db name
79
  *
81
  */
82
  public function get_database_name() {
83
  global $wpdb;
84
+
85
  return $wpdb->dbname;
86
  }
87
+
88
  /**
89
  * Check support for migrations
90
  *
93
  public function supports_migrations() {
94
  return true;
95
  }
96
+
97
  /**
98
  * Get the column native types
99
  *
100
  * @return array
101
  */
102
  public function native_database_types() {
103
+ $types = [
104
+ 'primary_key' => [ 'name' => 'integer', 'limit' => 11, 'null' => false ],
105
+ 'string' => [ 'name' => 'varchar', 'limit' => 255 ],
106
+ 'text' => [ 'name' => 'text' ],
107
+ 'tinytext' => [ 'name' => 'tinytext' ],
108
+ 'mediumtext' => [ 'name' => 'mediumtext' ],
109
+ 'integer' => [ 'name' => 'int', 'limit' => 11 ],
110
+ 'tinyinteger' => [ 'name' => 'tinyint' ],
111
+ 'smallinteger' => [ 'name' => 'smallint' ],
112
+ 'mediuminteger' => [ 'name' => 'mediumint' ],
113
+ 'biginteger' => [ 'name' => 'bigint' ],
114
+ 'float' => [ 'name' => 'float' ],
115
+ 'decimal' => [ 'name' => 'decimal', 'scale' => 0, 'precision' => 10 ],
116
+ 'datetime' => [ 'name' => 'datetime' ],
117
+ 'timestamp' => [ 'name' => 'timestamp' ],
118
+ 'time' => [ 'name' => 'time' ],
119
+ 'date' => [ 'name' => 'date' ],
120
+ 'binary' => [ 'name' => 'blob' ],
121
+ 'tinybinary' => [ 'name' => 'tinyblob' ],
122
+ 'mediumbinary' => [ 'name' => 'mediumblob' ],
123
+ 'longbinary' => [ 'name' => 'longblob' ],
124
+ 'boolean' => [ 'name' => 'tinyint', 'limit' => 1 ],
125
+ 'enum' => [ 'name' => 'enum', 'values' => [] ],
126
+ 'uuid' => [ 'name' => 'char', 'limit' => 36 ],
127
+ 'char' => [ 'name' => 'char' ]
128
+ ];
129
+
130
  return $types;
131
  }
132
+
133
  /**
134
  * Create the schema table, if necessary
135
  */
141
  $this->add_index( $this->get_schema_version_table_name(), 'version', [ 'unique' => true ] );
142
  }
143
  }
144
+
145
  /**
146
  * Start Transaction
147
  */
150
  $this->beginTransaction();
151
  }
152
  }
153
+
154
  /**
155
  * Commit Transaction
156
  */
159
  $this->commit();
160
  }
161
  }
162
+
163
  /**
164
  * Rollback Transaction
165
  */
168
  $this->rollback();
169
  }
170
  }
171
+
172
  /**
173
  * Quote a table name string
174
  *
175
  * @param string $str table name.
176
+ *
177
  * @return string
178
  */
179
  public function quote_table( $str ) {
180
  return '`' . $str . '`';
181
  }
182
+
183
  /**
184
  * Column definition
185
  *
191
  */
192
  public function column_definition( $column_name, $type, $options = null ) {
193
  $col = new Ruckusing_Adapter_ColumnDefinition( $this, $column_name, $type, $options );
194
+
195
  return $col->__toString();
196
  }
197
  // -------- DATABASE LEVEL OPERATIONS
198
+
199
  /**
200
  * Check if a db exists
201
  *
204
  * @return boolean
205
  */
206
  public function database_exists( $db ) {
207
+ $ddl = 'SHOW DATABASES';
208
  $result = $this->select_all( $ddl );
209
  if ( \count( $result ) == 0 ) {
210
  return false;
214
  return true;
215
  }
216
  }
217
+
218
  return false;
219
  }
220
+
221
  /**
222
  * Create a database
223
  *
229
  if ( $this->database_exists( $db ) ) {
230
  return false;
231
  }
232
+ $ddl = \sprintf( 'CREATE DATABASE %s', $this->identifier( $db ) );
233
  $result = $this->query( $ddl );
234
+
235
  return $result === true;
236
  }
237
+
238
  /**
239
  * Drop a database
240
  *
246
  if ( ! $this->database_exists( $db ) ) {
247
  return false;
248
  }
249
+ $ddl = \sprintf( 'DROP DATABASE IF EXISTS %s', $this->identifier( $db ) );
250
  $result = $this->query( $ddl );
251
+
252
  return $result === true;
253
  }
254
+
255
  /**
256
  * Dump the complete schema of the DB. This is really just all of the
257
  * CREATE TABLE statements for all of the tables in the DB.
270
  if ( $tbl == 'schema_info' ) {
271
  continue;
272
  }
273
+ $stmt = \sprintf( 'SHOW CREATE TABLE %s', $this->identifier( $tbl ) );
274
  $result = $this->query( $stmt );
275
  if ( \is_array( $result ) && \count( $result ) == 1 ) {
276
  $row = $result[0];
284
  }
285
  }
286
  $data = $final . $views;
287
+
288
  return \file_put_contents( $output_file, $data, \LOCK_EX );
289
  }
290
+
291
  /**
292
  * Check if a table exists
293
  *
297
  * @return boolean
298
  */
299
  public function table_exists( $tbl, $reload_tables = false ) {
300
+ global $wpdb;
301
+
302
+ // We need last error to be clear so we can check against it easily.
303
+ $previous_last_error = $wpdb->last_error;
304
+ $previous_suppress_errors = $wpdb->suppress_errors;
305
+ $wpdb->last_error = '';
306
+ $wpdb->suppress_errors = true;
307
+
308
+ $result = $wpdb->query( "SELECT * FROM $tbl LIMIT 1" );
309
+
310
+ // Restore the last error, as this is not truly an error and we don't want to alarm people.
311
+ $wpdb->last_error = $previous_last_error;
312
+ $wpdb->suppress_errors = $previous_suppress_errors;
313
+
314
+ return $result !== false;
315
  }
316
+
317
  /**
318
  * Wrapper to execute a query
319
  *
324
  public function execute( $query ) {
325
  return $this->query( $query );
326
  }
327
+
328
  /**
329
  * Execute a query
330
  *
331
  * @param string $query query to run
332
  *
 
333
  * @return boolean
334
+ * @throws Ruckusing_Exception
335
  */
336
  public function query( $query ) {
337
  global $wpdb;
338
 
339
  $query_type = $this->determine_query_type( $query );
340
+ $data = [];
341
  if ( $query_type == SQL_SELECT || $query_type == SQL_SHOW ) {
342
  $data = $wpdb->get_results( $query, ARRAY_A );
343
  if ( $this->isError( $data ) ) {
344
  throw new Ruckusing_Exception( \sprintf( "Error executing 'query' with:\n%s\n\nReason: %s\n\n", $query, $wpdb->last_error ), Ruckusing_Exception::QUERY_ERROR );
345
  }
346
+
347
  return $data;
348
  } else {
349
  // INSERT, DELETE, etc...
354
  if ( $query_type == SQL_INSERT ) {
355
  return $wpdb->insert_id;
356
  }
357
+
358
  return true;
359
  }
360
  }
361
+
362
  /**
363
  * Execute several queries
364
  *
365
  * @param string $queries queries to run
366
  *
 
367
  * @return boolean
368
+ * @throws Ruckusing_Exception
369
  */
370
  public function multi_query( $queries ) {
371
  if ( \defined( 'YOAST_ENVIRONMENT' ) && YOAST_ENVIRONMENT !== 'production' ) {
372
  throw new Ruckusing_Exception( 'WPDB does not support multi_query.', Ruckusing_Exception::QUERY_ERROR );
373
  }
374
+
375
  return false;
376
  }
377
+
378
  /**
379
  * Select one
380
  *
381
  * @param string $query query to run
382
  *
 
383
  * @return array
384
+ * @throws Ruckusing_Exception
385
  */
386
  public function select_one( $query ) {
387
  global $wpdb;
392
  if ( $this->isError( $res ) ) {
393
  throw new Ruckusing_Exception( \sprintf( "Error executing 'query' with:\n%s\n\nReason: %s\n\n", $query, $wpdb->last_error ), Ruckusing_Exception::QUERY_ERROR );
394
  }
395
+
396
  return $wpdb->last_result;
397
  } else {
398
  throw new Ruckusing_Exception( "Query for select_one() is not one of SELECT or SHOW: {$query}", Ruckusing_Exception::QUERY_ERROR );
399
  }
400
  }
401
+
402
  /**
403
  * Select all
404
  *
409
  public function select_all( $query ) {
410
  return $this->query( $query );
411
  }
412
+
413
  /**
414
  * Use this method for non-SELECT queries
415
  * Or anything where you dont necessarily expect a result string, e.g. DROPs, CREATEs, etc.
420
  */
421
  public function execute_ddl( $ddl ) {
422
  $result = $this->query( $ddl );
423
+
424
  return true;
425
  }
426
+
427
  /**
428
  * Drop table
429
  *
432
  * @return boolean
433
  */
434
  public function drop_table( $tbl ) {
435
+ $ddl = \sprintf( 'DROP TABLE IF EXISTS %s', $this->identifier( $tbl ) );
436
  $result = $this->query( $ddl );
437
+
438
  return true;
439
  }
440
+
441
  /**
442
  * Create table
443
  *
444
  * @param string $table_name the table name
445
+ * @param array $options the options
446
+ *
447
  * @return bool|Ruckusing_Adapter_MySQL_TableDefinition
448
  */
449
  public function create_table( $table_name, $options = [] ) {
450
  return new Ruckusing_Adapter_MySQL_TableDefinition( $this, $table_name, $options );
451
  }
452
+
453
  /**
454
  * Escape a string for mysql
455
  *
459
  */
460
  public function quote_string( $str ) {
461
  global $wpdb;
462
+
463
  return $wpdb->_escape( $str );
464
  }
465
+
466
  /**
467
  * Quote a string
468
  *
473
  public function identifier( $str ) {
474
  return '`' . $str . '`';
475
  }
476
+
477
  /**
478
  * Quote a string
479
  *
485
  public function quote( $value, $column = null ) {
486
  return $this->quote_string( $value );
487
  }
488
+
489
  /**
490
  * Rename a table
491
  *
492
+ * @param string $name the current table name
493
  * @param string $new_name the new table name
494
  *
 
495
  * @return boolean
496
+ * @throws Ruckusing_Exception
497
  */
498
  public function rename_table( $name, $new_name ) {
499
  if ( empty( $name ) ) {
503
  throw new Ruckusing_Exception( 'Missing new column name parameter', Ruckusing_Exception::INVALID_ARGUMENT );
504
  }
505
  $sql = \sprintf( 'RENAME TABLE %s TO %s', $this->identifier( $name ), $this->identifier( $new_name ) );
506
+
507
  return $this->execute_ddl( $sql );
508
  }
509
  // create_table
510
+
511
  /**
512
  * Add a column
513
  *
514
+ * @param string $table_name the table name
515
  * @param string $column_name the column name
516
+ * @param string $type the column type
517
+ * @param array $options column options
518
  *
 
519
  * @return boolean
520
+ * @throws Ruckusing_Exception
521
  */
522
  public function add_column( $table_name, $column_name, $type, $options = [] ) {
523
  if ( empty( $table_name ) ) {
541
  }
542
  $sql = \sprintf( 'ALTER TABLE %s ADD `%s` %s', $this->identifier( $table_name ), $column_name, $this->type_to_sql( $type, $options ) );
543
  $sql .= $this->add_column_options( $type, $options );
544
+
545
  return $this->execute_ddl( $sql );
546
  }
547
  // add_column
548
+
549
  /**
550
  * Drop a column
551
  *
556
  */
557
  public function remove_column( $table_name, $column_name ) {
558
  $sql = \sprintf( 'ALTER TABLE %s DROP COLUMN %s', $this->identifier( $table_name ), $this->identifier( $column_name ) );
559
+
560
  return $this->execute_ddl( $sql );
561
  }
562
  // remove_column
563
+
564
  /**
565
  * Rename a column
566
  *
567
+ * @param string $table_name the table name
568
+ * @param string $column_name the column name
569
  * @param string $new_column_name the new column name
570
  *
 
571
  * @return boolean
572
+ * @throws Ruckusing_Exception
573
  */
574
  public function rename_column( $table_name, $column_name, $new_column_name ) {
575
  if ( empty( $table_name ) ) {
581
  if ( empty( $new_column_name ) ) {
582
  throw new Ruckusing_Exception( 'Missing new column name parameter', Ruckusing_Exception::INVALID_ARGUMENT );
583
  }
584
+ $column_info = $this->column_info( $table_name, $column_name );
585
  $current_type = $column_info['type'];
586
+ $sql = \sprintf( 'ALTER TABLE %s CHANGE %s %s %s', $this->identifier( $table_name ), $this->identifier( $column_name ), $this->identifier( $new_column_name ), $current_type );
587
+ $sql .= $this->add_column_options( $current_type, $column_info );
588
+
589
  return $this->execute_ddl( $sql );
590
  }
591
  // rename_column
592
+
593
  /**
594
  * Change a column
595
  *
596
+ * @param string $table_name the table name
597
  * @param string $column_name the column name
598
+ * @param string $type the column type
599
+ * @param array $options column options
600
  *
 
601
  * @return boolean
602
+ * @throws Ruckusing_Exception
603
  */
604
  public function change_column( $table_name, $column_name, $type, $options = [] ) {
605
  if ( empty( $table_name ) ) {
624
  }
625
  $sql = \sprintf( 'ALTER TABLE `%s` CHANGE `%s` `%s` %s', $table_name, $column_name, $column_name, $this->type_to_sql( $type, $options ) );
626
  $sql .= $this->add_column_options( $type, $options );
627
+
628
  return $this->execute_ddl( $sql );
629
  }
630
  // change_column
631
+
632
  /**
633
  * Get a column info
634
  *
635
+ * @param string $table the table name
636
  * @param string $column the column name
637
  *
 
638
  * @return array
639
+ * @throws Ruckusing_Exception
640
  */
641
  public function column_info( $table, $column ) {
642
  if ( empty( $table ) ) {
646
  throw new Ruckusing_Exception( 'Missing original column name parameter', Ruckusing_Exception::INVALID_ARGUMENT );
647
  }
648
  try {
649
+ $sql = \sprintf( "SHOW FULL COLUMNS FROM %s LIKE '%s'", $this->identifier( $table ), $column );
650
  $result = $this->select_one( $sql );
651
  if ( \is_array( $result ) ) {
652
  // lowercase key names
653
  $result = \array_change_key_case( $result, \CASE_LOWER );
654
  }
655
+
656
  return $result;
657
+ } catch ( \Exception $e ) {
658
  return null;
659
  }
660
  }
661
+
662
  /**
663
  * Add an index
664
  *
665
+ * @param string $table_name the table name
666
  * @param string $column_name the column name
667
+ * @param array $options index options
668
  *
 
669
  * @return boolean
670
+ * @throws Ruckusing_Exception
671
  */
672
  public function add_index( $table_name, $column_name, $options = [] ) {
673
  if ( empty( $table_name ) ) {
705
  $cols[] = $this->identifier( $name );
706
  }
707
  $sql = \sprintf( 'CREATE %sINDEX %s ON %s(%s)', $unique ? 'UNIQUE ' : '', $this->identifier( $index_name ), $this->identifier( $table_name ), \join( ', ', $cols ) );
708
+
709
  return $this->execute_ddl( $sql );
710
  }
711
+
712
  /**
713
  * Drop an index
714
  *
715
+ * @param string $table_name the table name
716
  * @param string $column_name the column name
717
+ * @param array $options index options
718
  *
 
719
  * @return boolean
720
+ * @throws Ruckusing_Exception
721
  */
722
  public function remove_index( $table_name, $column_name, $options = [] ) {
723
  if ( empty( $table_name ) ) {
733
  $index_name = Ruckusing_Util_Naming::index_name( $table_name, $column_name );
734
  }
735
  $sql = \sprintf( 'DROP INDEX %s ON %s', $this->identifier( $index_name ), $this->identifier( $table_name ) );
736
+
737
  return $this->execute_ddl( $sql );
738
  }
739
+
740
  /**
741
  * Add timestamps
742
  *
757
  throw new Ruckusing_Exception( 'Missing updated at column name parameter', Ruckusing_Exception::INVALID_ARGUMENT );
758
  }
759
  $created_at = $this->add_column( $table_name, $created_column_name, 'datetime' );
760
+ $updated_at = $this->add_column( $table_name, $updated_column_name, 'timestamp', [
761
+ 'null' => false,
762
+ 'default' => 'CURRENT_TIMESTAMP',
763
+ 'extra' => 'ON UPDATE CURRENT_TIMESTAMP'
764
+ ] );
765
+
766
  return $created_at && $updated_at;
767
  }
768
+
769
  /**
770
  * Remove timestamps
771
  *
787
  }
788
  $updated_at = $this->remove_column( $table_name, $created_column_name );
789
  $created_at = $this->remove_column( $table_name, $updated_column_name );
790
+
791
  return $created_at && $updated_at;
792
  }
793
+
794
  /**
795
  * Check an index
796
  *
797
+ * @param string $table_name the table name
798
  * @param string $column_name the column name
799
+ * @param array $options index options
800
  *
 
801
  * @return boolean
802
+ * @throws Ruckusing_Exception
803
  */
804
  public function has_index( $table_name, $column_name, $options = [] ) {
805
  if ( empty( $table_name ) ) {
820
  return true;
821
  }
822
  }
823
+
824
  return false;
825
  }
826
+
827
  /**
828
  * Return all indexes of a table
829
  *
832
  * @return array
833
  */
834
  public function indexes( $table_name ) {
835
+ $sql = \sprintf( 'SHOW KEYS FROM %s', $this->identifier( $table_name ) );
836
+ $result = $this->select_all( $sql );
837
  $indexes = [];
838
  $cur_idx = null;
839
  foreach ( $result as $row ) {
841
  if ( $row['Key_name'] == 'PRIMARY' ) {
842
  continue;
843
  }
844
+ $cur_idx = $row['Key_name'];
845
  $indexes[] = [ 'name' => $row['Key_name'], 'unique' => (int) $row['Non_unique'] == 0 ? true : false ];
846
  }
847
+
848
  return $indexes;
849
  }
850
+
851
  /**
852
  * Convert type to sql
853
  * $limit = null, $precision = null, $scale = null
855
  * @param string $type the native type
856
  * @param array $options
857
  *
 
858
  * @return string
859
+ * @throws Ruckusing_Exception
860
  */
861
  public function type_to_sql( $type, $options = [] ) {
862
  $natives = $this->native_database_types();
873
  }
874
  throw new Ruckusing_Exception( $error, Ruckusing_Exception::INVALID_ARGUMENT );
875
  }
876
+ $scale = null;
877
  $precision = null;
878
+ $limit = null;
879
  if ( isset( $options['precision'] ) ) {
880
  $precision = $options['precision'];
881
  }
940
  if ( empty( $values ) ) {
941
  throw new Ruckusing_Exception( 'Error adding enum column: there must be at least one value defined', Ruckusing_Exception::INVALID_ARGUMENT );
942
  } else {
943
+ $column_type_sql .= \sprintf( "('%s')", \implode( "','", \array_map( [
944
+ $this,
945
+ 'quote_string'
946
+ ], $values ) ) );
947
  }
948
  }
949
  // not a decimal column
953
  if ( $limit ) {
954
  $column_type_sql .= \sprintf( '(%d)', $limit );
955
  }
956
+
957
  return $column_type_sql;
958
  }
959
+
960
  /**
961
  * Add column options
962
  *
963
  * @param string $type the native type
964
  * @param array $options
965
  *
 
966
  * @return string
967
+ * @throws Ruckusing_Exception
968
  */
969
  public function add_column_options( $type, $options ) {
970
  $sql = '';
998
  $default_format = "'%s'";
999
  }
1000
  $default_value = \sprintf( $default_format, $options['default'] );
1001
+ $sql .= \sprintf( ' DEFAULT %s', $default_value );
1002
  }
1003
  if ( \array_key_exists( 'null', $options ) ) {
1004
  if ( $options['null'] === false || $options['null'] === 'NO' ) {
1016
  if ( \array_key_exists( 'after', $options ) ) {
1017
  $sql .= \sprintf( ' AFTER %s', $this->identifier( $options['after'] ) );
1018
  }
1019
+
1020
  return $sql;
1021
  }
1022
+
1023
  /**
1024
  * Set current version
1025
  *
1029
  */
1030
  public function set_current_version( $version ) {
1031
  $sql = \sprintf( "INSERT INTO %s (version) VALUES ('%s')", $this->get_schema_version_table_name(), $version );
1032
+
1033
  return $this->execute_ddl( $sql );
1034
  }
1035
+
1036
  /**
1037
  * remove a version
1038
  *
1042
  */
1043
  public function remove_version( $version ) {
1044
  $sql = \sprintf( "DELETE FROM %s WHERE version = '%s'", $this->get_schema_version_table_name(), $version );
1045
+
1046
  return $this->execute_ddl( $sql );
1047
  }
1048
+
1049
  /**
1050
  * Return a message displaying the current version
1051
  *
1067
  private function isError( $o ) {
1068
  return $o === false;
1069
  }
1070
+
1071
  /**
1072
  * Initialize an array of table names
1073
  *
1080
  $this->_tables = [];
1081
  // clear existing structure
1082
  $query = 'SHOW TABLES';
1083
+ $res = $wpdb->get_results( $query, \ARRAY_N );
1084
  // check for errors
1085
  if ( $this->isError( $res ) ) {
1086
  throw new Ruckusing_Exception( \sprintf( "Error executing 'query' with:\n%s\n\nReason: %s\n\n", $query, $wpdb->last_error ), Ruckusing_Exception::QUERY_ERROR );
1087
  }
1088
  foreach ( $res as $row ) {
1089
+ $table = $row[0];
1090
  $this->_tables[ $table ] = true;
1091
  }
1092
  }
1093
  }
1094
+
1095
  /**
1096
  * Check query type
1097
  *
1129
  return SQL_UNKNOWN_QUERY_TYPE;
1130
  }
1131
  }
1132
+
1133
  /**
1134
  * Check query type
1135
  *
1136
  * @param $query_type
 
1137
  *
1138
  * @return boolean
1139
+ * @internal param string $query query to run
1140
+ *
1141
  */
1142
  private function is_select( $query_type ) {
1143
  if ( $query_type == SQL_SELECT ) {
1144
  return true;
1145
  }
1146
+
1147
  return false;
1148
  }
1149
+
1150
  /**
1151
  * Detect whether or not the string represents a function call and if so
1152
  * do not wrap it in single-quotes, otherwise do wrap in single quotes.
1157
  */
1158
  private function is_sql_method_call( $str ) {
1159
  $str = \trim( $str );
1160
+ if ( \substr( $str, - 2, 2 ) == '()' ) {
1161
  return true;
1162
  } else {
1163
  return false;
1164
  }
1165
  }
1166
+
1167
  /**
1168
  * Check if in transaction
1169
  *
1172
  private function inTransaction() {
1173
  return $this->_in_trx;
1174
  }
1175
+
1176
  /**
1177
  * Start transaction
1178
  */
1185
  $wpdb->query( 'START TRANSACTION' );
1186
  $this->_in_trx = true;
1187
  }
1188
+
1189
  /**
1190
  * Commit a transaction
1191
  */
1198
  $wpdb->query( 'COMMIT' );
1199
  $this->_in_trx = false;
1200
  }
1201
+
1202
  /**
1203
  * Rollback a transaction
1204
  */
readme.txt CHANGED
@@ -6,7 +6,7 @@ License URI: http://www.gnu.org/licenses/gpl.html
6
  Tags: SEO, XML sitemap, Content analysis, Readability
7
  Requires at least: 5.3
8
  Tested up to: 5.4
9
- Stable tag: 14.0.2
10
  Requires PHP: 5.6.20
11
 
12
  Improve your WordPress SEO: Write better content and have a fully optimized WordPress site using the Yoast SEO plugin.
@@ -209,6 +209,24 @@ Your question has most likely been answered on our knowledge base: [kb.yoast.com
209
 
210
  == Changelog ==
211
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
212
  = 14.0.2 =
213
  Release Date: April 29th, 2020
214
 
6
  Tags: SEO, XML sitemap, Content analysis, Readability
7
  Requires at least: 5.3
8
  Tested up to: 5.4
9
+ Stable tag: 14.0.3
10
  Requires PHP: 5.6.20
11
 
12
  Improve your WordPress SEO: Write better content and have a fully optimized WordPress site using the Yoast SEO plugin.
209
 
210
  == Changelog ==
211
 
212
+ = 14.0.3 =
213
+ Release Date: April 30th, 2020
214
+
215
+ Bugfixes:
216
+
217
+ * Fixes a bug where running the migrations could cause fatal errors on sites where plugins are installed remotely. Some remote plugin installers don't remove files that are removed in an update. Since our migration runner goes through all migrations on the server, this could lead to fatal errors.
218
+ * Fixes a bug where the `pre_get_document_title filter` could be skipped when other plugins were using this filter as well.
219
+ * Fixes a bug where an error would be thrown when the name of an indexable table had been converted to a different case.
220
+ * Fixes a bug where a taxonomy parent would not be present in the breadcrumbs even though it was set in the breadcrumbs settings.
221
+
222
+ Enhancements:
223
+
224
+ * Adds a missing index to the new indexables table. Props to [@pagelypete](https://github.com/pagelypete).
225
+
226
+ Other:
227
+
228
+ * Adds the wpseo_frontend_presentation filter that can be used by third-party plugins to easily alter all our meta output with 1 single filter.
229
+
230
  = 14.0.2 =
231
  Release Date: April 29th, 2020
232
 
{migrations → src/config/migrations}/20171228151840_WpYoastIndexable.php RENAMED
File without changes
{migrations → src/config/migrations}/20171228151841_WpYoastPrimaryTerm.php RENAMED
File without changes
{migrations → src/config/migrations}/20190529075038_WpYoastDropIndexableMetaTableIfExists.php RENAMED
File without changes
{migrations → src/config/migrations}/20191011111109_WpYoastIndexableHierarchy.php RENAMED
File without changes
{migrations → src/config/migrations}/20200408101900_AddCollationToTables.php RENAMED
File without changes
{migrations → src/config/migrations}/20200420073606_AddColumnsToIndexables.php RENAMED
File without changes
{migrations → src/config/migrations}/20200428123747_BreadcrumbTitleAndHierarchyReset.php RENAMED
File without changes
{migrations → src/config/migrations}/20200428194858_ExpandIndexableColumnLengths.php RENAMED
File without changes
{migrations → src/config/migrations}/20200429105310_TruncateIndexableTables.php RENAMED
File without changes
src/config/migrations/20200430075614_AddIndexableObjectIdAndTypeIndex.php ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Yoast SEO Plugin File.
4
+ *
5
+ * @package WPSEO\Migrations
6
+ */
7
+
8
+ use Yoast\WP\Lib\Model;
9
+ use YoastSEO_Vendor\Ruckusing_Migration_Base;
10
+
11
+ /**
12
+ * AddIndexableObjectIdAndTypeIndex
13
+ */
14
+ class AddIndexableObjectIdAndTypeIndex extends Ruckusing_Migration_Base {
15
+
16
+ /**
17
+ * Migration up.
18
+ */
19
+ public function up() {
20
+ $this->add_index(
21
+ $this->get_table_name(),
22
+ [
23
+ 'object_id',
24
+ 'object_type',
25
+ ],
26
+ [
27
+ 'name' => 'object_id_and_type',
28
+ ]
29
+ );
30
+ }
31
+
32
+ /**
33
+ * Migration down.
34
+ */
35
+ public function down() {
36
+ $this->remove_index(
37
+ $this->get_table_name(),
38
+ [
39
+ 'object_id',
40
+ 'object_type',
41
+ ],
42
+ [
43
+ 'name' => 'object_id_and_type',
44
+ ]
45
+ );
46
+ }
47
+
48
+ /**
49
+ * Retrieves the table name to use for storing indexables.
50
+ *
51
+ * @return string The table name to use.
52
+ */
53
+ protected function get_table_name() {
54
+ return Model::get_table_name( 'Indexable' );
55
+ }
56
+ }
{migrations → src/config/migrations}/ruckusing/lib/Ruckusing/Adapter/why RENAMED
File without changes
{migrations → src/config/migrations}/ruckusing/lib/Task/why RENAMED
File without changes
src/config/ruckusing-framework.php CHANGED
@@ -119,7 +119,7 @@ class Ruckusing_Framework {
119
  */
120
  public function maybe_set_constant() {
121
  $constant_name = $this->dependency_management->prefixed_available() ? \YOAST_VENDOR_NS_PREFIX . '\RUCKUSING_BASE' : 'RUCKUSING_BASE';
122
- $constant_value = \WPSEO_PATH . 'migrations' . \DIRECTORY_SEPARATOR . 'ruckusing';
123
 
124
  if ( \defined( $constant_name ) ) {
125
  return \constant( $constant_name ) === $constant_value;
119
  */
120
  public function maybe_set_constant() {
121
  $constant_name = $this->dependency_management->prefixed_available() ? \YOAST_VENDOR_NS_PREFIX . '\RUCKUSING_BASE' : 'RUCKUSING_BASE';