Yoast SEO - Version 14.0.4

Version Description

Release Date: April 30th, 2020

Bugfixes:

  • Fixes a bug where robots meta values defaulted to 0 instead of null because of a bug in WPDB. This could result in incorrect values for noindex, nofollow , noarchive, noimageindex and/or nosnippet. In order to purge the wrong data, we need to truncate our tables again. This means you will have to go through the indexing process again. Were very sorry. For sites with more than 10,000 posts, we advise using the WP CLI command to do the indexation on the server.
Download this release

Release Info

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

Code changes from version 14.0.3 to 14.0.4

Files changed (90) hide show
  1. css/dist/{admin-global-1403-rtl.css → admin-global-1404-rtl.css} +0 -0
  2. css/dist/{admin-global-1403.css → admin-global-1404.css} +0 -0
  3. css/dist/{adminbar-1403-rtl.css → adminbar-1404-rtl.css} +0 -0
  4. css/dist/{adminbar-1403.css → adminbar-1404.css} +0 -0
  5. css/dist/{alerts-1403-rtl.css → alerts-1404-rtl.css} +0 -0
  6. css/dist/{alerts-1403.css → alerts-1404.css} +0 -0
  7. css/dist/{dashboard-1403-rtl.css → dashboard-1404-rtl.css} +0 -0
  8. css/dist/{dashboard-1403.css → dashboard-1404.css} +0 -0
  9. css/dist/{edit-page-1403-rtl.css → edit-page-1404-rtl.css} +0 -0
  10. css/dist/{edit-page-1403.css → edit-page-1404.css} +0 -0
  11. css/dist/{featured-image-1403-rtl.css → featured-image-1404-rtl.css} +0 -0
  12. css/dist/{featured-image-1403.css → featured-image-1404.css} +0 -0
  13. css/dist/{filter-explanation-1403-rtl.css → filter-explanation-1404-rtl.css} +0 -0
  14. css/dist/{filter-explanation-1403.css → filter-explanation-1404.css} +0 -0
  15. css/dist/{inside-editor-1403-rtl.css → inside-editor-1404-rtl.css} +0 -0
  16. css/dist/{inside-editor-1403.css → inside-editor-1404.css} +0 -0
  17. css/dist/{metabox-1403-rtl.css → metabox-1404-rtl.css} +0 -0
  18. css/dist/{metabox-1403.css → metabox-1404.css} +0 -0
  19. css/dist/{metabox-primary-category-1403-rtl.css → metabox-primary-category-1404-rtl.css} +0 -0
  20. css/dist/{metabox-primary-category-1403.css → metabox-primary-category-1404.css} +0 -0
  21. css/dist/{monorepo-1403-rtl.css → monorepo-1404-rtl.css} +0 -0
  22. css/dist/{monorepo-1403.css → monorepo-1404.css} +0 -0
  23. css/dist/{search-appearance-1403-rtl.css → search-appearance-1404-rtl.css} +0 -0
  24. css/dist/{search-appearance-1403.css → search-appearance-1404.css} +0 -0
  25. css/dist/{structured-data-blocks-1403-rtl.css → structured-data-blocks-1404-rtl.css} +0 -0
  26. css/dist/{structured-data-blocks-1403.css → structured-data-blocks-1404.css} +0 -0
  27. css/dist/{toggle-switch-1403-rtl.css → toggle-switch-1404-rtl.css} +0 -0
  28. css/dist/{toggle-switch-1403.css → toggle-switch-1404.css} +0 -0
  29. css/dist/{wpseo-dismissible-1403-rtl.css → wpseo-dismissible-1404-rtl.css} +0 -0
  30. css/dist/{wpseo-dismissible-1403.css → wpseo-dismissible-1404.css} +0 -0
  31. css/dist/{yoast-components-1403-rtl.css → yoast-components-1404-rtl.css} +0 -0
  32. css/dist/{yoast-components-1403.css → yoast-components-1404.css} +0 -0
  33. css/dist/{yoast-extensions-1403-rtl.css → yoast-extensions-1404-rtl.css} +0 -0
  34. css/dist/{yoast-extensions-1403.css → yoast-extensions-1404.css} +0 -0
  35. css/dist/{yst_plugin_tools-1403-rtl.css → yst_plugin_tools-1404-rtl.css} +0 -0
  36. css/dist/{yst_plugin_tools-1403.css → yst_plugin_tools-1404.css} +0 -0
  37. css/dist/{yst_seo_score-1403-rtl.css → yst_seo_score-1404-rtl.css} +0 -0
  38. css/dist/{yst_seo_score-1403.css → yst_seo_score-1404.css} +0 -0
  39. inc/class-upgrade.php +9 -2
  40. inc/options/class-wpseo-option-wpseo.php +6 -1
  41. js/dist/{analysis-1403.js → analysis-1404.js} +0 -0
  42. js/dist/{babel-polyfill-1403.js → babel-polyfill-1404.js} +0 -0
  43. js/dist/{commons-1403.js → commons-1404.js} +0 -0
  44. js/dist/{components-1403.js → components-1404.js} +0 -0
  45. js/dist/{configuration-wizard-1403.js → configuration-wizard-1404.js} +0 -0
  46. js/dist/{help-scout-beacon-1403.js → help-scout-beacon-1404.js} +0 -0
  47. js/dist/{jed-1403.js → jed-1404.js} +0 -0
  48. js/dist/{redux-1403.js → redux-1404.js} +0 -0
  49. js/dist/{search-appearance-1403.js → search-appearance-1404.js} +0 -0
  50. js/dist/{styled-components-1403.js → styled-components-1404.js} +0 -0
  51. js/dist/{wp-seo-admin-1403.js → wp-seo-admin-1404.js} +0 -0
  52. js/dist/{wp-seo-admin-global-1403.js → wp-seo-admin-global-1404.js} +0 -0
  53. js/dist/{wp-seo-admin-gsc-1403.js → wp-seo-admin-gsc-1404.js} +0 -0
  54. js/dist/{wp-seo-admin-media-1403.js → wp-seo-admin-media-1404.js} +0 -0
  55. js/dist/{wp-seo-analysis-worker-1403.js → wp-seo-analysis-worker-1404.js} +0 -0
  56. js/dist/{wp-seo-api-1403.js → wp-seo-api-1404.js} +0 -0
  57. js/dist/{wp-seo-bulk-editor-1403.js → wp-seo-bulk-editor-1404.js} +0 -0
  58. js/dist/{wp-seo-dashboard-widget-1403.js → wp-seo-dashboard-widget-1404.js} +0 -0
  59. js/dist/{wp-seo-edit-page-1403.js → wp-seo-edit-page-1404.js} +0 -0
  60. js/dist/{wp-seo-featured-image-1403.js → wp-seo-featured-image-1404.js} +0 -0
  61. js/dist/{wp-seo-filter-explanation-1403.js → wp-seo-filter-explanation-1404.js} +0 -0
  62. js/dist/{wp-seo-indexation-1403.js → wp-seo-indexation-1404.js} +0 -0
  63. js/dist/{wp-seo-metabox-1403.js → wp-seo-metabox-1404.js} +0 -0
  64. js/dist/{wp-seo-metabox-category-1403.js → wp-seo-metabox-category-1404.js} +0 -0
  65. js/dist/{wp-seo-modal-1403.js → wp-seo-modal-1404.js} +0 -0
  66. js/dist/{wp-seo-network-admin-1403.js → wp-seo-network-admin-1404.js} +0 -0
  67. js/dist/{wp-seo-post-scraper-1403.js → wp-seo-post-scraper-1404.js} +0 -0
  68. js/dist/{wp-seo-quick-edit-handler-1403.js → wp-seo-quick-edit-handler-1404.js} +0 -0
  69. js/dist/{wp-seo-recalculate-1403.js → wp-seo-recalculate-1404.js} +0 -0
  70. js/dist/{wp-seo-reindex-links-1403.js → wp-seo-reindex-links-1404.js} +0 -0
  71. js/dist/{wp-seo-replacevar-plugin-1403.js → wp-seo-replacevar-plugin-1404.js} +0 -0
  72. js/dist/{wp-seo-shortcode-plugin-1403.js → wp-seo-shortcode-plugin-1404.js} +0 -0
  73. js/dist/{wp-seo-structured-data-blocks-1403.js → wp-seo-structured-data-blocks-1404.js} +0 -0
  74. js/dist/{wp-seo-term-scraper-1403.js → wp-seo-term-scraper-1404.js} +0 -0
  75. js/dist/{wp-seo-used-keywords-assessment-1403.js → wp-seo-used-keywords-assessment-1404.js} +0 -0
  76. languages/wordpress-seo-ja.json +1 -1
  77. languages/wordpress-seo-pl_PL.json +1 -1
  78. languages/wordpress-seojs-ja.json +1 -1
  79. languages/yoast-components-ja.json +1 -1
  80. lib/orm.php +7 -4
  81. readme.txt +8 -1
  82. src/config/migrations/20200430150130_ClearIndexableTables.php +48 -0
  83. vendor/autoload.php +1 -1
  84. vendor/composer/ClassLoader.php +4 -4
  85. vendor/composer/autoload_classmap.php +6 -0
  86. vendor/composer/autoload_real.php +7 -4
  87. vendor/composer/autoload_static.php +10 -4
  88. vendor_prefixed/j4mie/idiorm/idiorm.php +2415 -0
  89. wp-seo-main.php +1 -1
  90. wp-seo.php +1 -1
css/dist/{admin-global-1403-rtl.css → admin-global-1404-rtl.css} RENAMED
File without changes
css/dist/{admin-global-1403.css → admin-global-1404.css} RENAMED
File without changes
css/dist/{adminbar-1403-rtl.css → adminbar-1404-rtl.css} RENAMED
File without changes
css/dist/{adminbar-1403.css → adminbar-1404.css} RENAMED
File without changes
css/dist/{alerts-1403-rtl.css → alerts-1404-rtl.css} RENAMED
File without changes
css/dist/{alerts-1403.css → alerts-1404.css} RENAMED
File without changes
css/dist/{dashboard-1403-rtl.css → dashboard-1404-rtl.css} RENAMED
File without changes
css/dist/{dashboard-1403.css → dashboard-1404.css} RENAMED
File without changes
css/dist/{edit-page-1403-rtl.css → edit-page-1404-rtl.css} RENAMED
File without changes
css/dist/{edit-page-1403.css → edit-page-1404.css} RENAMED
File without changes
css/dist/{featured-image-1403-rtl.css → featured-image-1404-rtl.css} RENAMED
File without changes
css/dist/{featured-image-1403.css → featured-image-1404.css} RENAMED
File without changes
css/dist/{filter-explanation-1403-rtl.css → filter-explanation-1404-rtl.css} RENAMED
File without changes
css/dist/{filter-explanation-1403.css → filter-explanation-1404.css} RENAMED
File without changes
css/dist/{inside-editor-1403-rtl.css → inside-editor-1404-rtl.css} RENAMED
File without changes
css/dist/{inside-editor-1403.css → inside-editor-1404.css} RENAMED
File without changes
css/dist/{metabox-1403-rtl.css → metabox-1404-rtl.css} RENAMED
File without changes
css/dist/{metabox-1403.css → metabox-1404.css} RENAMED
File without changes
css/dist/{metabox-primary-category-1403-rtl.css → metabox-primary-category-1404-rtl.css} RENAMED
File without changes
css/dist/{metabox-primary-category-1403.css → metabox-primary-category-1404.css} RENAMED
File without changes
css/dist/{monorepo-1403-rtl.css → monorepo-1404-rtl.css} RENAMED
File without changes
css/dist/{monorepo-1403.css → monorepo-1404.css} RENAMED
File without changes
css/dist/{search-appearance-1403-rtl.css → search-appearance-1404-rtl.css} RENAMED
File without changes
css/dist/{search-appearance-1403.css → search-appearance-1404.css} RENAMED
File without changes
css/dist/{structured-data-blocks-1403-rtl.css → structured-data-blocks-1404-rtl.css} RENAMED
File without changes
css/dist/{structured-data-blocks-1403.css → structured-data-blocks-1404.css} RENAMED
File without changes
css/dist/{toggle-switch-1403-rtl.css → toggle-switch-1404-rtl.css} RENAMED
File without changes
css/dist/{toggle-switch-1403.css → toggle-switch-1404.css} RENAMED
File without changes
css/dist/{wpseo-dismissible-1403-rtl.css → wpseo-dismissible-1404-rtl.css} RENAMED
File without changes
css/dist/{wpseo-dismissible-1403.css → wpseo-dismissible-1404.css} RENAMED
File without changes
css/dist/{yoast-components-1403-rtl.css → yoast-components-1404-rtl.css} RENAMED
File without changes
css/dist/{yoast-components-1403.css → yoast-components-1404.css} RENAMED
File without changes
css/dist/{yoast-extensions-1403-rtl.css → yoast-extensions-1404-rtl.css} RENAMED
File without changes
css/dist/{yoast-extensions-1403.css → yoast-extensions-1404.css} RENAMED
File without changes
css/dist/{yst_plugin_tools-1403-rtl.css → yst_plugin_tools-1404-rtl.css} RENAMED
File without changes
css/dist/{yst_plugin_tools-1403.css → yst_plugin_tools-1404.css} RENAMED
File without changes
css/dist/{yst_seo_score-1403-rtl.css → yst_seo_score-1404-rtl.css} RENAMED
File without changes
css/dist/{yst_seo_score-1403.css → yst_seo_score-1404.css} RENAMED
File without changes
inc/class-upgrade.php CHANGED
@@ -78,7 +78,7 @@ class WPSEO_Upgrade {
78
  */
79
  do_action( 'wpseo_run_upgrade', $version );
80
 
81
- $this->finish_up();
82
  }
83
 
84
  /**
@@ -109,8 +109,15 @@ class WPSEO_Upgrade {
109
 
110
  /**
111
  * Runs the needed cleanup after an update, setting the DB version to latest version, flushing caches etc.
 
 
 
 
112
  */
113
- protected function finish_up() {
 
 
 
114
  WPSEO_Options::set( 'version', WPSEO_VERSION );
115
 
116
  // Just flush rewrites, always, to at least make them work after an upgrade.
78
  */
79
  do_action( 'wpseo_run_upgrade', $version );
80
 
81
+ $this->finish_up( $version );
82
  }
83
 
84
  /**
109
 
110
  /**
111
  * Runs the needed cleanup after an update, setting the DB version to latest version, flushing caches etc.
112
+ *
113
+ * @param string $previous_version The previous version.
114
+ *
115
+ * @return void
116
  */
117
+ protected function finish_up( $previous_version = null ) {
118
+ if ( $previous_version ) {
119
+ WPSEO_Options::set( 'previous_version', $previous_version );
120
+ }
121
  WPSEO_Options::set( 'version', WPSEO_VERSION );
122
 
123
  // Just flush rewrites, always, to at least make them work after an upgrade.
inc/options/class-wpseo-option-wpseo.php CHANGED
@@ -30,7 +30,7 @@ class WPSEO_Option_Wpseo extends WPSEO_Option {
30
  'ignore_indexation_warning' => false,
31
  // Non-form field, should only be set via validation routine.
32
  'version' => '', // Leave default as empty to ensure activation/upgrade works.
33
-
34
  // Form fields.
35
  'disableadvanced_meta' => true,
36
  'enable_headless_rest_endpoints' => true,
@@ -230,6 +230,11 @@ class WPSEO_Option_Wpseo extends WPSEO_Option {
230
  case 'version':
231
  $clean[ $key ] = WPSEO_VERSION;
232
  break;
 
 
 
 
 
233
 
234
  /* Verification strings. */
235
  case 'baiduverify':
30
  'ignore_indexation_warning' => false,
31
  // Non-form field, should only be set via validation routine.
32
  'version' => '', // Leave default as empty to ensure activation/upgrade works.
33
+ 'previous_version' => '',
34
  // Form fields.
35
  'disableadvanced_meta' => true,
36
  'enable_headless_rest_endpoints' => true,
230
  case 'version':
231
  $clean[ $key ] = WPSEO_VERSION;
232
  break;
233
+ case 'previous_version':
234
+ if ( isset( $dirty[ $key ] ) ) {
235
+ $clean[ $key ] = $dirty[ $key ];
236
+ }
237
+ break;
238
 
239
  /* Verification strings. */
240
  case 'baiduverify':
js/dist/{analysis-1403.js → analysis-1404.js} RENAMED
File without changes
js/dist/{babel-polyfill-1403.js → babel-polyfill-1404.js} RENAMED
File without changes
js/dist/{commons-1403.js → commons-1404.js} RENAMED
File without changes
js/dist/{components-1403.js → components-1404.js} RENAMED
File without changes
js/dist/{configuration-wizard-1403.js → configuration-wizard-1404.js} RENAMED
File without changes
js/dist/{help-scout-beacon-1403.js → help-scout-beacon-1404.js} RENAMED
File without changes
js/dist/{jed-1403.js → jed-1404.js} RENAMED
File without changes
js/dist/{redux-1403.js → redux-1404.js} RENAMED
File without changes
js/dist/{search-appearance-1403.js → search-appearance-1404.js} RENAMED
File without changes
js/dist/{styled-components-1403.js → styled-components-1404.js} RENAMED
File without changes
js/dist/{wp-seo-admin-1403.js → wp-seo-admin-1404.js} RENAMED
File without changes
js/dist/{wp-seo-admin-global-1403.js → wp-seo-admin-global-1404.js} RENAMED
File without changes
js/dist/{wp-seo-admin-gsc-1403.js → wp-seo-admin-gsc-1404.js} RENAMED
File without changes
js/dist/{wp-seo-admin-media-1403.js → wp-seo-admin-media-1404.js} RENAMED
File without changes
js/dist/{wp-seo-analysis-worker-1403.js → wp-seo-analysis-worker-1404.js} RENAMED
File without changes
js/dist/{wp-seo-api-1403.js → wp-seo-api-1404.js} RENAMED
File without changes
js/dist/{wp-seo-bulk-editor-1403.js → wp-seo-bulk-editor-1404.js} RENAMED
File without changes
js/dist/{wp-seo-dashboard-widget-1403.js → wp-seo-dashboard-widget-1404.js} RENAMED
File without changes
js/dist/{wp-seo-edit-page-1403.js → wp-seo-edit-page-1404.js} RENAMED
File without changes
js/dist/{wp-seo-featured-image-1403.js → wp-seo-featured-image-1404.js} RENAMED
File without changes
js/dist/{wp-seo-filter-explanation-1403.js → wp-seo-filter-explanation-1404.js} RENAMED
File without changes
js/dist/{wp-seo-indexation-1403.js → wp-seo-indexation-1404.js} RENAMED
File without changes
js/dist/{wp-seo-metabox-1403.js → wp-seo-metabox-1404.js} RENAMED
File without changes
js/dist/{wp-seo-metabox-category-1403.js → wp-seo-metabox-category-1404.js} RENAMED
File without changes
js/dist/{wp-seo-modal-1403.js → wp-seo-modal-1404.js} RENAMED
File without changes
js/dist/{wp-seo-network-admin-1403.js → wp-seo-network-admin-1404.js} RENAMED
File without changes
js/dist/{wp-seo-post-scraper-1403.js → wp-seo-post-scraper-1404.js} RENAMED
File without changes
js/dist/{wp-seo-quick-edit-handler-1403.js → wp-seo-quick-edit-handler-1404.js} RENAMED
File without changes
js/dist/{wp-seo-recalculate-1403.js → wp-seo-recalculate-1404.js} RENAMED
File without changes
js/dist/{wp-seo-reindex-links-1403.js → wp-seo-reindex-links-1404.js} RENAMED
File without changes
js/dist/{wp-seo-replacevar-plugin-1403.js → wp-seo-replacevar-plugin-1404.js} RENAMED
File without changes
js/dist/{wp-seo-shortcode-plugin-1403.js → wp-seo-shortcode-plugin-1404.js} RENAMED
File without changes
js/dist/{wp-seo-structured-data-blocks-1403.js → wp-seo-structured-data-blocks-1404.js} RENAMED
File without changes
js/dist/{wp-seo-term-scraper-1403.js → wp-seo-term-scraper-1404.js} RENAMED
File without changes
js/dist/{wp-seo-used-keywords-assessment-1403.js → wp-seo-used-keywords-assessment-1404.js} RENAMED
File without changes
languages/wordpress-seo-ja.json CHANGED
@@ -1 +1 @@
1
- {"domain":"wordpress-seo","locale_data":{"wordpress-seo":{"":{"domain":"wordpress-seo","plural-forms":"nplurals=1; plural=0;","lang":"ja_JP"},"Google preview":["Google プレビュー"],"Has feedback":["フィードバックあり"],"Content optimization:":["コンテンツ最適化:"],"%1$sFlesch Reading Ease%2$s: The copy scores %3$s in the test, which is considered %4$s to read. %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$s画像の alt 属性%5$s: ページ内の画像%2$d枚中%1$d枚の alt 属性でキーフレーズまたは同義語を含んでいます。これはやや多すぎます。%4$s本当に適切な画像にのみキーフレーズまたは同義語を含めましょう%5$s。"],"%1$sImage alt attributes%2$s: Good job!":["%1$s画像の alt 属性%2$s: いいですね !"],"%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$s画像の alt 属性%5$s: ページ内の画像%2$d枚中%1$d枚しか alt 属性がありません。これは本文の話題に影響します。%4$s適切な画像の alt 属性にキーフレーズまたは同義語を追加しましょう%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$s画像の alt 属性%3$s: ページ内の画像に alt 属性がありません。これは本文の話題に影響します。%2$s適切な画像の alt 属性にキーフレーズまたは同義語を追加しましょう%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$s画像の alt 属性%3$s: ページ内の画像に alt 属性がありますが、キーフレーズが含まれていません。%2$s修正しましょう%3$s !"],"%1$sKeyphrase in subheading%2$s: %3$s of your higher-level subheadings reflects the topic of your copy. Good job!":["%1$s小見出し内キーフレーズ%2$s: 上位レベル小見出しのうち%3$s個が文章のトピックを反映しています。いいですね !"],"%1$sKeyphrase in subheading%2$s: Your higher-level subheading reflects the topic of your copy. Good job!":["%1$s小見出し内キーフレーズ%2$s: 上位レベル小見出しが文章のトピックを反映しています。いいですね !"],"%1$sKeyphrase in subheading%3$s: %2$sUse more keyphrases or synonyms in your higher-level subheadings%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$s単一タイトル%3$s: H1はメインのタイトルにのみ使用します。テキスト中にある、すべてのメインタイトルではない H1 を探し、%2$s下位レベルの見出しに変更してください%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$sキーフレーズ密度%2$s: フォーカスキーフレーズが0回見つかりました。文字数に対するおすすめの最低数%3$d回に足りません。%4$sキーフレーズにフォーカスしましょう%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$sキーフレーズ密度%2$s: フォーカスキーフレーズが%5$d回見つかりました。文字数に対するおすすめの最低数%3$d回に足りません。%4$sキーフレーズにフォーカスしましょう%2$s !"],"%1$sKeyphrase density%2$s: The focus keyphrase was found %3$d time. This is great!":["%1$sキーフレーズ密度%2$s: フォーカスキーフレーズが%3$d回見つかりました。すばらしい !"],"%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$sキーフレーズ密度%2$s: フォーカスキーフレーズが%5$d回見つかりました。文字数に対するおすすめの上限である%3$d回を超えています。%4$s過度な最適化はやめましょう%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$sキーフレーズ密度%2$s: フォーカスキーフレーズが%5$d回見つかりました。文字数に対するおすすめの上限である%3$d回を超えています。%4$s過度な最適化はやめましょう%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$sKeyphrase length%3$s: %2$sSet a keyphrase in order to calculate your SEO score%3$s.":["%1$sキーフレーズの長さ%3$s: %2$sSEO スコアを計測するには、キーフレーズを設定しましょう%3$s。"],"%1$sKeyphrase in slug%2$s: More than half of your keyphrase appears in the slug. That's great!":["%1$sスラッグ中のキーフレーズ%2$s: 半分以上のキーフレーズがスラッグ中にあります。すばらしい !"],"%1$sKeyphrase in slug%3$s: (Part of) your keyphrase does not appear in the slug. %2$sChange that%3$s!":["%1$sスラッグ中のキーフレーズ%3$s: キーフレーズ (の一部) がスラッグ中にありません。%2$s変更しましょう%3$s !"],"%1$sKeyphrase in slug%2$s: Great work!":["%1$sスラッグ中のキーフレーズ%2$s: いいですね !"],"%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$sタイトル内のキーフレーズ%3$s: キーフレーズ「%4$s」のすべての語が SEO タイトルに表示されません。%2$sSEO タイトル内にキーフレーズの完全一致を書くようお試しください%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$sタイトル内のキーフレーズ%3$s: キーフレーズの完全一致がありません。%2$sSEO タイトル内にキーフレーズの完全一致を書くようお試しください%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$sタイトル内のキーフレーズ%3$s: SEO タイトル内にキーフレーズの完全一致がありますが、冒頭ではありません。%2$s冒頭への移動を試してください%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$sタイトル内のキーフレーズ%2$s: SEO タイトルの冒頭がキーフレーズと完全一致しました。いいですね !"],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sキーフレーズ分布%2$s: いいですね !"],"%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$sキーフレーズ分布%3$s: 均一ではありません。一部のテキストはキーフレーズや同義語を含んでいません。%2$s分布を均一にしましょう%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$sキーフレーズ分布%3$s: とても均一とは言えません。大部分のテキストはキーフレーズや同義語を含んでいません。%2$s分布を均一にしましょう%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$sキーフレーズ分布%3$s: %2$sキーフレーズまたは同義語をテキストに含むと、キーフレーズ分布をチェックすることができます%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.":[],"%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.":[],"%1$sPreviously used keyphrase%2$s: You've not used this keyphrase before, very good.":[],"%1$sSlug stopwords%3$s: The slug for this page contains a stop word. %2$sRemove it%3$s!":[],"%1$sSlug too long%3$s: the slug for this page is a bit long. %2$sShorten it%3$s!":[],"%1$sImage alt attributes%3$s: No images appear on this page. %2$sAdd some%3$s!":["%1$s画像の alt 属性%3$s: ページに画像がありません。%2$s追加しましょう%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!":[],"This is far below the recommended minimum of %5$d word. %3$sAdd more content%4$s.":[],"This is below the recommended minimum of %5$d word. %3$sAdd more content%4$s.":["推奨最低値である%5$d語を下回っています。%3$sもっとコンテンツを追加してください%4$s。"],"%2$sText length%4$s: The text contains %1$d word.":["%2$sテキストの長さ%4$s: テキストは%1$d語含んでいます。"],"%2$sText length%3$s: The text contains %1$d word. Good job!":["%2$sテキストの長さ%3$s: テキストは%1$d語含んでいます。いいですね !"],"%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$sSEO title width%3$s: %2$sPlease create an SEO title%3$s.":["%1$sSEO タイトルの長さ%3$s: %2$sSEO タイトルを作成してください%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$sSEO タイトルの長さ%3$s: SEO タイトルが表示上限よりも幅広くなっています。%2$s短くしてください%3$s。"],"%1$sSEO title width%2$s: Good job!":["%1$sSEO タイトルの長さ%2$s: いいですね !"],"%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$sSEO タイトルの長さ%3$s: SEO タイトルが短すぎます。%2$sキーフレーズの種類を増やすか、行動喚起フレーズを作成してください%3$s。"],"%1$sOutbound links%2$s: There are both nofollowed and normal outbound links on this page. Good job!":["%1$s外部リンク%2$s: このページには、nofollow リンクと通常の外部リンクの両方があります。その調子です。"],"%1$sOutbound links%2$s: Good job!":["%1$s外部リンク%2$s: その調子です。"],"%1$sOutbound links%3$s: All outbound links on this page are nofollowed. %2$sAdd some normal links%3$s.":[],"%1$sOutbound links%3$s: No outbound links appear in this page. %2$sAdd some%3$s!":[],"%1$sMeta description length%2$s: Well done!":["%1$sメタディスクリプションの長さ%2$s: いいですね !"],"%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$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$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$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$sメタディスクリプション中のキーフレーズ%2$s: メタディスクリプションが設定されていますが、キーフレーズがありません。%3$s修正しましょう%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$sメタディスクリプション中のキーフレーズ%2$s: メタディスクリプション中にキーフレーズが%3$s回含まれており、おすすめ上限の2回を超過しています。%4$s制限しましょう%5$s !"],"%1$sKeyphrase in meta description%2$s: Keyphrase or synonym appear in the meta description. Well done!":["%1$sメタディスクリプション中のキーフレーズ%2$s: メタディスクリプション中にキーフレーズまたは同義語が含まれています。いいですね !"],"%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$sキーフレーズの長さ%5$s: キーフレーズの長さは%1$d語で、推奨上限値の%2$d語をかなり超えています。%4$sもっと短くしましょう%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$sキーフレーズの長さ%5$s: キーフレーズの長さは%1$d語で、推奨上限値の%2$d語を超えています。%4$sもっと短くしましょう%5$s。"],"%1$sKeyphrase length%2$s: Good job!":["%1$sキーフレーズの長さ%2$s: いいですね !"],"%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$sキーフレーズの長さ%3$s: ページにフォーカスキーフレーズが設定されていません。%2$sSEO スコアを計測するには、キーフレーズを設定しましょう%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$s冒頭のキーフレーズ%3$s: キーフレーズまたは同義語が第一段落に含まれていません。%2$s今すぐトピックを明確にしましょう%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$s冒頭のキーフレーズ%3$s: キーフレーズまたは同義語がコピーの第一段落に含まれていますが、一文に収まっていません。%2$s修正しましょう%3$s !"],"%1$sKeyphrase in introduction%2$s: Well done!":["%1$s冒頭のキーフレーズ%2$s: いいですね !"],"%1$sInternal links%2$s: There are both nofollowed and normal internal links on this page. Good job!":["%1$s内部リンク%2$s: ページ内に nofollow 済みのリンクおよび内部リンクの両方があります。いいですね !"],"%1$sInternal links%2$s: You have enough internal links. Good job!":["%1$s内部リンク%2$s: 十分な内部リンクがあります。いいですね !"],"%1$sInternal links%3$s: The internal links in this page are all nofollowed. %2$sAdd some good internal links%3$s.":["%1$s内部リンク%3$s: ページ内の内部リンクはすべて nofollow 済みです。%2$s内部リンクを追加しましょう%3$s。"],"%1$sInternal links%3$s: No internal links appear in this page, %2$smake sure to add some%3$s!":["%1$s内部リンク%3$s: ページ内に内部リンクがありません。%2$s必ず追加しましょう%3$s !"],"%1$sTransition words%2$s: Well done!":["%1$s転換語%2$s: いいですね !"],"%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$s転換語%2$s: %3$s文のみに転換語が含まれていますが、これは十分な数ではありません。%4$sもっと増やしてみましょう%2$s。"],"%1$sTransition words%2$s: None of the sentences contain transition words. %3$sUse some%2$s.":[],"%1$sNot enough content%2$s: %3$sPlease add some content to enable a good analysis%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$s小見出し分布%2$s: 小見出しは使用していませんが、テキストは十分に短く、おそらく必要ありません。"],"%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$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$sサブ見出しの分布%2$s: %3$d個のテキストセクションの長さが%4$d語を超えており、サブ見出しで区切られていません。%5$s可読性を改善するためにサブ見出しを追加しましょう%2$s。"],"%1$sSubheading distribution%2$s: Great job!":["%1$s小見出し分布%2$s: よくできています。"],"%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$sSentence length%2$s: Great!":["%1$s文の長さ%2$s: いい感じです !"],"%1$sConsecutive sentences%2$s: There is enough variety in your sentences. That's great!":[],"%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$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$s受動態%2$s: 文の中に %3$s 受動態が含まれています。これは推奨する割合 %4$sを越えています。%5$s同等の能動態を使用してください%2$s。"],"%1$sPassive voice%2$s: You're using enough active voice. That's great!":["%1$s受動態%2$s: 能動態を十分に使用しています。いい感じです。"],"%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$s段落の長さ%2$s: %3$d個の段落の長さが推奨上限値の%4$d語を超えています。%5$sもっと短くしましょう%2$s。"],"%1$sParagraph length%2$s: None of the paragraphs are too long. Great job!":["%1$s段落の長さ%2$s: 長過ぎる段落はありません。Good Job!"],"Good job!":["いいですね。"],"%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":[],"Scroll to see the preview content.":["コンテンツのプレビューを見るにはスクロールしてください。"],"An error occurred in the '%1$s' assessment":["%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の単語に%2$s%3$s以上のシラブル%4$sが含まれています。おすすめの最大値%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の単語に%2$s%3$s以上のシラブル%4$sが含まれています。おすすめの最大値%5$sと同じか下回っています。"],"This is slightly below the recommended minimum of %5$d word. %3$sAdd a bit more copy%4$s.":["推奨最低値である%5$d語をやや下回っています。%3$sもう少し文章を追加してください%4$s。"],"The meta description contains %1$d sentence %2$sover %3$s words%4$s. Try to shorten this sentence.":["メタディスクリプションに%2$s%3$s単語以上%4$s含まれる文章が%1$d文あります。文章を短くしてみましょう。"],"The meta description contains no sentences %1$sover %2$s words%3$s.":["メタディスクリプションに%1$s%2$s語以上の文%3$sが含まれていません。"],"Mobile preview":["モバイルプレビュー"],"Desktop preview":["デスクトッププレビュー"],"Please provide an SEO title by editing the snippet below.":["SEO で重要な Title タグは、以下のスニペットから編集できます。"],"Meta description preview:":["メタディスクリプションのプレビュー:"],"Slug preview:":["スラッグをプレビュー:"],"SEO title preview:":["SEO タイトルのプレビュー:"],"Close snippet editor":["スニペットエディターを閉じる"],"Slug":["スラッグ"],"Remove marks in the text":["文章からマークを除去する"],"Mark this result in the text":["この結果をテキストにマークする"],"Marks are disabled in current view":["現在のビューでマークが無効になっています"],"Good SEO score":["非常に良い SEO スコアです"],"OK SEO score":["SEO スコアは OK です"],"Feedback":["フィードバック"],"ok":["ok"],"Please provide a meta description by editing the snippet below.":["以下のスニペットを編集し、メタディスクリプションを入力してください。"],"Edit snippet":["スニペットを編集"],"You can click on each element in the preview to jump to the Snippet Editor.":["プレビューで各要素をクリックすると、スニペットエディターにジャンプできます。"],"SEO title":["SEO タイトル"],"Needs improvement":["改善が必要"],"Good":["良い"],"very difficult":["非常に難しい"],"Try to make shorter sentences, using less difficult words to improve readability":["可読性を向上させるために、難しい言葉を減らし、文章を短くしてみてください。"],"difficult":["難しい"],"Try to make shorter sentences to improve readability":["可読性を向上させるために、文章を短くしてみてください。"],"fairly difficult":["かなり難しい"],"OK":["OK"],"fairly easy":["かなり易しい"],"easy":["易しい"],"very easy":["非常に易しい"],"Meta description":["メタディスクリプション"]}}}
1
+ {"domain":"wordpress-seo","locale_data":{"wordpress-seo":{"":{"domain":"wordpress-seo","plural-forms":"nplurals=1; plural=0;","lang":"ja_JP"},"Google preview":["Google プレビュー"],"Has feedback":["フィードバックあり"],"Content optimization:":["コンテンツ最適化:"],"%1$sFlesch Reading Ease%2$s: The copy scores %3$s in the test, which is considered %4$s to read. %5$s":["%1$sFlesch Reading Ease%2$s: テスト結果: コピースコア %3$s、読みやすさ %4$s %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$s画像の alt 属性%5$s: ページ内の画像%2$d枚中%1$d枚の alt 属性でキーフレーズまたは同義語を含んでいます。これはやや多すぎます。%4$s本当に適切な画像にのみキーフレーズまたは同義語を含めましょう%5$s。"],"%1$sImage alt attributes%2$s: Good job!":["%1$s画像の alt 属性%2$s: いいですね !"],"%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$s画像の alt 属性%5$s: ページ内の画像%2$d枚中%1$d枚しか alt 属性がありません。これは本文の話題に影響します。%4$s適切な画像の alt 属性にキーフレーズまたは同義語を追加しましょう%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$s画像の alt 属性%3$s: ページ内の画像に alt 属性がありません。これは本文の話題に影響します。%2$s適切な画像の alt 属性にキーフレーズまたは同義語を追加しましょう%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$s画像の alt 属性%3$s: ページ内の画像に alt 属性がありますが、キーフレーズが含まれていません。%2$s修正しましょう%3$s !"],"%1$sKeyphrase in subheading%2$s: %3$s of your higher-level subheadings reflects the topic of your copy. Good job!":["%1$s小見出し内キーフレーズ%2$s: 上位レベル小見出しのうち%3$s個が文章のトピックを反映しています。いいですね !"],"%1$sKeyphrase in subheading%2$s: Your higher-level subheading reflects the topic of your copy. Good job!":["%1$s小見出し内キーフレーズ%2$s: 上位レベル小見出しが文章のトピックを反映しています。いいですね !"],"%1$sKeyphrase in subheading%3$s: %2$sUse more keyphrases or synonyms in your higher-level subheadings%3$s!":["%1$s副見出しのキーフレーズ%3$s: %2$s上位レベルの副見出しではもっとキーフレーズや類義語を使用してください%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$s単一タイトル%3$s: H1はメインのタイトルにのみ使用します。テキスト中にある、すべてのメインタイトルではない H1 を探し、%2$s下位レベルの見出しに変更してください%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$sキーフレーズ密度%2$s: フォーカスキーフレーズが0回見つかりました。文字数に対するおすすめの最低数%3$d回に足りません。%4$sキーフレーズにフォーカスしましょう%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$sキーフレーズ密度%2$s: フォーカスキーフレーズが%5$d回見つかりました。文字数に対するおすすめの最低数%3$d回に足りません。%4$sキーフレーズにフォーカスしましょう%2$s !"],"%1$sKeyphrase density%2$s: The focus keyphrase was found %3$d time. This is great!":["%1$sキーフレーズ密度%2$s: フォーカスキーフレーズが%3$d回見つかりました。すばらしい !"],"%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$sキーフレーズ密度%2$s: フォーカスキーフレーズが%5$d回見つかりました。文字数に対するおすすめの上限である%3$d回を超えています。%4$s過度な最適化はやめましょう%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$sキーフレーズ密度%2$s: フォーカスキーフレーズが%5$d回見つかりました。文字数に対するおすすめの上限である%3$d回を超えています。%4$s過度な最適化はやめましょう%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$sキーフレーズの中の機能語%3$s: キーフレーズ \"%4$s\" には機能語しか含まれていません。%2$s良いキーフレーズの作り方を学習してください。%3$s"],"%1$sKeyphrase length%3$s: %2$sSet a keyphrase in order to calculate your SEO score%3$s.":["%1$sキーフレーズの長さ%3$s: %2$sSEO スコアを計測するには、キーフレーズを設定しましょう%3$s。"],"%1$sKeyphrase in slug%2$s: More than half of your keyphrase appears in the slug. That's great!":["%1$sスラッグ中のキーフレーズ%2$s: 半分以上のキーフレーズがスラッグ中にあります。すばらしい !"],"%1$sKeyphrase in slug%3$s: (Part of) your keyphrase does not appear in the slug. %2$sChange that%3$s!":["%1$sスラッグ中のキーフレーズ%3$s: キーフレーズ (の一部) がスラッグ中にありません。%2$s変更しましょう%3$s !"],"%1$sKeyphrase in slug%2$s: Great work!":["%1$sスラッグ中のキーフレーズ%2$s: いいですね !"],"%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$sタイトル内のキーフレーズ%3$s: キーフレーズ「%4$s」のすべての語が SEO タイトルに表示されません。%2$sSEO タイトル内にキーフレーズの完全一致を書くようお試しください%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$sタイトル内のキーフレーズ%3$s: キーフレーズの完全一致がありません。%2$sSEO タイトル内にキーフレーズの完全一致を書くようお試しください%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$sタイトル内のキーフレーズ%3$s: SEO タイトル内にキーフレーズの完全一致がありますが、冒頭ではありません。%2$s冒頭への移動を試してください%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$sタイトル内のキーフレーズ%2$s: SEO タイトルの冒頭がキーフレーズと完全一致しました。いいですね !"],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sキーフレーズ分布%2$s: いいですね !"],"%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$sキーフレーズ分布%3$s: 均一ではありません。一部のテキストはキーフレーズや同義語を含んでいません。%2$s分布を均一にしましょう%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$sキーフレーズ分布%3$s: とても均一とは言えません。大部分のテキストはキーフレーズや同義語を含んでいません。%2$s分布を均一にしましょう%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$sキーフレーズ分布%3$s: %2$sキーフレーズまたは同義語をテキストに含むと、キーフレーズ分布をチェックすることができます%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$s以前使用されたキーフレーズ%6$s: %3$s 以前にこのキーフレーズ %1$s は %2$d 回使われています。%5$s複数回、キーフレーズを使用しないでください%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$s以前使用されたキーフレーズ%5$s: %2$s 以前にこのキーフレーズ %1$s は1回使われています。%4$s複数回、キーフレーズを使用しないでください%5$s。"],"%1$sPreviously used keyphrase%2$s: You've not used this keyphrase before, very good.":["%1$s以前使用されたキーフレーズ%2$s: このキーフレーズは過去に使用されていません。"],"%1$sSlug stopwords%3$s: The slug for this page contains a stop word. %2$sRemove it%3$s!":["%1$sスラッグのストップワード%3$s: このページのスラッグにはストップワードが含まれています。%2$s削除してください%3$s !"],"%1$sSlug too long%3$s: the slug for this page is a bit long. %2$sShorten it%3$s!":["%1$sスラッグが長すぎる%3$s: このページのスラッグは少し長すぎます。%2$s短くしてください%3$s !"],"%1$sImage alt attributes%3$s: No images appear on this page. %2$sAdd some%3$s!":["%1$s画像の alt 属性%3$s: ページに画像がありません。%2$s追加しましょう%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$sキーフレーズのリンク%3$s: このページのランク付けに使用する言葉で別のページにリンクしています。%2$s変更してください%3$s !"],"This is far below the recommended minimum of %5$d word. %3$sAdd more content%4$s.":["推奨される最低語数 %5$d を遥かに下回ります。%3$sコンテンツをもっと追加してください%4$s。"],"This is below the recommended minimum of %5$d word. %3$sAdd more content%4$s.":["推奨最低値である%5$d語を下回っています。%3$sもっとコンテンツを追加してください%4$s。"],"%2$sText length%4$s: The text contains %1$d word.":["%2$sテキストの長さ%4$s: テキストは%1$d語含んでいます。"],"%2$sText length%3$s: The text contains %1$d word. Good job!":["%2$sテキストの長さ%3$s: テキストは%1$d語含んでいます。いいですね !"],"%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$s副見出しのキーフレーズ%3$s: 上位レベルの副見出しの 75%% 以上がコピーのトピックを反映しますが、多すぎます。%2$s最適化しすぎないでください%3$s !"],"%1$sSEO title width%3$s: %2$sPlease create an SEO title%3$s.":["%1$sSEO タイトルの長さ%3$s: %2$sSEO タイトルを作成してください%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$sSEO タイトルの長さ%3$s: SEO タイトルが表示上限よりも幅広くなっています。%2$s短くしてください%3$s。"],"%1$sSEO title width%2$s: Good job!":["%1$sSEO タイトルの長さ%2$s: いいですね !"],"%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$sSEO タイトルの長さ%3$s: SEO タイトルが短すぎます。%2$sキーフレーズの種類を増やすか、行動喚起フレーズを作成してください%3$s。"],"%1$sOutbound links%2$s: There are both nofollowed and normal outbound links on this page. Good job!":["%1$s外部リンク%2$s: このページには、nofollow リンクと通常の外部リンクの両方があります。その調子です。"],"%1$sOutbound links%2$s: Good job!":["%1$s外部リンク%2$s: その調子です。"],"%1$sOutbound links%3$s: All outbound links on this page are nofollowed. %2$sAdd some normal links%3$s.":["%1$s外部へのリンク%3$s: このページのすべての外部リンクは nofollow です。%2$s通常のリンクも追加してください%3$s。"],"%1$sOutbound links%3$s: No outbound links appear in this page. %2$sAdd some%3$s!":["%1$s外部へのリンク%3$s: このページには外部へのリンクがありません。%2$sいくつか追加してください%3$s !"],"%1$sMeta description length%2$s: Well done!":["%1$sメタディスクリプションの長さ%2$s: いいですね !"],"%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$smeta description の長さ%3$s: meta description が %4$d 文字を超えています。すべての description が読めるように、%2$s長さを縮めてください%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$smeta description の長さ%3$s: meta description が %4$d 文字以下と短すぎます。%5$d 文字まで可能です。%2$sスペースを使用してください%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$smeta description の長さ%3$s: meta description が指定されていません。検索エンジンは代替としてページのコピーを表示します。%2$smeta description を書いてください%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$sメタディスクリプション中のキーフレーズ%2$s: メタディスクリプションが設定されていますが、キーフレーズがありません。%3$s修正しましょう%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$sメタディスクリプション中のキーフレーズ%2$s: メタディスクリプション中にキーフレーズが%3$s回含まれており、おすすめ上限の2回を超過しています。%4$s制限しましょう%5$s !"],"%1$sKeyphrase in meta description%2$s: Keyphrase or synonym appear in the meta description. Well done!":["%1$sメタディスクリプション中のキーフレーズ%2$s: メタディスクリプション中にキーフレーズまたは同義語が含まれています。いいですね !"],"%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$sキーフレーズの長さ%5$s: キーフレーズの長さは%1$d語で、推奨上限値の%2$d語をかなり超えています。%4$sもっと短くしましょう%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$sキーフレーズの長さ%5$s: キーフレーズの長さは%1$d語で、推奨上限値の%2$d語を超えています。%4$sもっと短くしましょう%5$s。"],"%1$sKeyphrase length%2$s: Good job!":["%1$sキーフレーズの長さ%2$s: いいですね !"],"%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$sキーフレーズの長さ%3$s: ページにフォーカスキーフレーズが設定されていません。%2$sSEO スコアを計測するには、キーフレーズを設定しましょう%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$s冒頭のキーフレーズ%3$s: キーフレーズまたは同義語が第一段落に含まれていません。%2$s今すぐトピックを明確にしましょう%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$s冒頭のキーフレーズ%3$s: キーフレーズまたは同義語がコピーの第一段落に含まれていますが、一文に収まっていません。%2$s修正しましょう%3$s !"],"%1$sKeyphrase in introduction%2$s: Well done!":["%1$s冒頭のキーフレーズ%2$s: いいですね !"],"%1$sInternal links%2$s: There are both nofollowed and normal internal links on this page. Good job!":["%1$s内部リンク%2$s: ページ内に nofollow 済みのリンクおよび内部リンクの両方があります。いいですね !"],"%1$sInternal links%2$s: You have enough internal links. Good job!":["%1$s内部リンク%2$s: 十分な内部リンクがあります。いいですね !"],"%1$sInternal links%3$s: The internal links in this page are all nofollowed. %2$sAdd some good internal links%3$s.":["%1$s内部リンク%3$s: ページ内の内部リンクはすべて nofollow 済みです。%2$s内部リンクを追加しましょう%3$s。"],"%1$sInternal links%3$s: No internal links appear in this page, %2$smake sure to add some%3$s!":["%1$s内部リンク%3$s: ページ内に内部リンクがありません。%2$s必ず追加しましょう%3$s !"],"%1$sTransition words%2$s: Well done!":["%1$s転換語%2$s: いいですね !"],"%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$s転換語%2$s: %3$s文のみに転換語が含まれていますが、これは十分な数ではありません。%4$sもっと増やしてみましょう%2$s。"],"%1$sTransition words%2$s: None of the sentences contain transition words. %3$sUse some%2$s.":["%1$s転換語%2$s: 文に転換語がありません。%3$sいくつか使用してください%2$s。"],"%1$sNot enough content%2$s: %3$sPlease add some content to enable a good analysis%2$s.":["%1$s不十分なコンテンツ%2$s: %3$s解析の精度を上げるためコンテンツを追加してください%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$s小見出し分布%2$s: 小見出しは使用していませんが、テキストは十分に短く、おそらく必要ありません。"],"%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$s副見出しの利用%2$s: テキストが比較的長いにも関わらず副見出しが使われていません。%3$sいくつかの副見出しを追加してください%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$sサブ見出しの分布%2$s: %3$d個のテキストセクションの長さが%4$d語を超えており、サブ見出しで区切られていません。%5$s可読性を改善するためにサブ見出しを追加しましょう%2$s。"],"%1$sSubheading distribution%2$s: Great job!":["%1$s小見出し分布%2$s: よくできています。"],"%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$s文章の長さ%2$s: 文章の %3$s は %4$s 以上の語を含みます。これは推奨する最大値 %5$s を上回ります。%6$s文章を短くしてください%2$s。"],"%1$sSentence length%2$s: Great!":["%1$s文の長さ%2$s: いい感じです !"],"%1$sConsecutive sentences%2$s: There is enough variety in your sentences. That's great!":["%1$s連続した文章%2$s: バラエティーに富んだ文章です。Good Job!"],"%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$s連続した文章%2$s: テキストの中には、同じ言葉で始まる連続した文章が %3$d 以上あるインスタンスが %4$d あります。%5$s文章に変化をつけてください%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$s受動態%2$s: 文の中に %3$s 受動態が含まれています。これは推奨する割合 %4$sを越えています。%5$s同等の能動態を使用してください%2$s。"],"%1$sPassive voice%2$s: You're using enough active voice. That's great!":["%1$s受動態%2$s: 能動態を十分に使用しています。いい感じです。"],"%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$s段落の長さ%2$s: %3$d個の段落の長さが推奨上限値の%4$d語を超えています。%5$sもっと短くしましょう%2$s。"],"%1$sParagraph length%2$s: None of the paragraphs are too long. Great job!":["%1$s段落の長さ%2$s: 長過ぎる段落はありません。Good Job!"],"Good job!":["いいですね。"],"%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$sFlesch Reading Ease%2$s: テスト結果: コピースコア %3$s、読みやすさ %4$s %5$s%6$s%7$s"],"Scroll to see the preview content.":["コンテンツのプレビューを見るにはスクロールしてください。"],"An error occurred in the '%1$s' assessment":["%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の単語に%2$s%3$s以上のシラブル%4$sが含まれています。おすすめの最大値%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の単語に%2$s%3$s以上のシラブル%4$sが含まれています。おすすめの最大値%5$sと同じか下回っています。"],"This is slightly below the recommended minimum of %5$d word. %3$sAdd a bit more copy%4$s.":["推奨最低値である%5$d語をやや下回っています。%3$sもう少し文章を追加してください%4$s。"],"The meta description contains %1$d sentence %2$sover %3$s words%4$s. Try to shorten this sentence.":["メタディスクリプションに%2$s%3$s単語以上%4$s含まれる文章が%1$d文あります。文章を短くしてみましょう。"],"The meta description contains no sentences %1$sover %2$s words%3$s.":["メタディスクリプションに%1$s%2$s語以上の文%3$sが含まれていません。"],"Mobile preview":["モバイルプレビュー"],"Desktop preview":["デスクトッププレビュー"],"Please provide an SEO title by editing the snippet below.":["SEO で重要な Title タグは、以下のスニペットから編集できます。"],"Meta description preview:":["メタディスクリプションのプレビュー:"],"Slug preview:":["スラッグをプレビュー:"],"SEO title preview:":["SEO タイトルのプレビュー:"],"Close snippet editor":["スニペットエディターを閉じる"],"Slug":["スラッグ"],"Remove marks in the text":["文章からマークを除去する"],"Mark this result in the text":["この結果をテキストにマークする"],"Marks are disabled in current view":["現在のビューでマークが無効になっています"],"Good SEO score":["非常に良い SEO スコアです"],"OK SEO score":["SEO スコアは OK です"],"Feedback":["フィードバック"],"ok":["ok"],"Please provide a meta description by editing the snippet below.":["以下のスニペットを編集し、メタディスクリプションを入力してください。"],"Edit snippet":["スニペットを編集"],"You can click on each element in the preview to jump to the Snippet Editor.":["プレビューで各要素をクリックすると、スニペットエディターにジャンプできます。"],"SEO title":["SEO タイトル"],"Needs improvement":["改善が必要"],"Good":["良い"],"very difficult":["非常に難しい"],"Try to make shorter sentences, using less difficult words to improve readability":["可読性を向上させるために、難しい言葉を減らし、文章を短くしてみてください。"],"difficult":["難しい"],"Try to make shorter sentences to improve readability":["可読性を向上させるために、文章を短くしてみてください。"],"fairly difficult":["かなり難しい"],"OK":["OK"],"fairly easy":["かなり易しい"],"easy":["易しい"],"very easy":["非常に易しい"],"Meta description":["メタディスクリプション"]}}}
languages/wordpress-seo-pl_PL.json CHANGED
@@ -1 +1 @@
1
- {"domain":"wordpress-seo","locale_data":{"wordpress-seo":{"":{"domain":"wordpress-seo","plural-forms":"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);","lang":"pl"},"Google preview":[],"Has feedback":["Dostępne uwagi"],"Content optimization:":["Optymalizacja treści:"],"%1$sFlesch Reading Ease%2$s: The copy scores %3$s in the test, which is considered %4$s to read. %5$s":["%1$sCzytelność%2$s: Treść została oceniona na %3$s w teście, co oznacza, że tekst jest %4$s do przeczytania. %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$sAtrybuty alt obrazków%5$s: Z %2$d obrazów na tej stronie, %1$d ma atrybuty alt ze słowami z fraz kluczowych lub synonimami. To trochę za dużo. %4$sUżywaj frazy kluczowej lub synonimów tylko wtedy, kiedy naprawdę pasują do obrazu%5$s."],"%1$sImage alt attributes%2$s: Good job!":["%1$sAtrybuty alt obrazków%2$s: Dobra robota!"],"%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$sAtrybuty alt obrazków%5$s: Z %2$d obrazków na tej stronie, tylko %1$d ma atrybut alt pokrywający się z tematem wpisu. %4$sDodaj frazę kluczową lub jej synonimy do tagu alt obrazków%5$s!","%3$sAtrybuty alt obrazków%5$s: Z %2$d obrazków na tej stronie, tylko %1$d mają atrybuty alt pokrywający się z tematem wpisu. %4$sDodaj frazę kluczową lub jej synonimy do tagu alt obrazków%5$s!","%3$sAtrybuty alt obrazków%5$s: Z %2$d obrazków na tej stronie, tylko %1$d ma atrybuty alt pokrywający się z tematem wpisu. %4$sDodaj frazę kluczową lub jej synonimy do tagu alt obrazków%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$sAtrybuty alt obrazków%3$s: Obrazki na tej stronie nie mają atrybutów alt pokrywających się z tematem wpisu. %2$sDodaj frazę kluczową lub jej synonimy do atrybutów alt obrazków%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$sAtrybuty alt obrazków%3$s: Obrazki na tej stronie mają atrybuty alt, ale nie została ustawiona fraza kluczowa. %2$sNapraw to%3$s!"],"%1$sKeyphrase in subheading%2$s: %3$s of your higher-level subheadings reflects the topic of your copy. Good job!":["%1$sSłowo kluczowe w nagłówku%2$s: %3$s z twoich nagłówków wyższego rzędu pokrywa się z tematem wpisu. Dobra robota!","%1$sSłowo kluczowe w nagłówku%2$s: %3$s z twoich nagłówków wyższego rzędu pokrywa się z tematem wpisu. Dobra robota!","%1$sSłowo kluczowe w nagłówku%2$s: %3$s z twoich nagłówków wyższego rzędu pokrywa się z tematem wpisu. Dobra robota!"],"%1$sKeyphrase in subheading%2$s: Your higher-level subheading reflects the topic of your copy. Good job!":["%1$sSłowo kluczowe w nagłówku%2$s: Nagłówków wyższego rzędu pokrywa się z tematem wpisu. Dobra robota!"],"%1$sKeyphrase in subheading%3$s: %2$sUse more keyphrases or synonyms in your higher-level subheadings%3$s!":["%1$sSłowo kluczowe w nagłówku%3$s:%2$sUżywaj częściej słów kluczowych lub ich synonimów z nagłówkach wyższego rzędu%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$sTytuł%3$s: Nagłówek H1 powinien być użyty tylko jako tytuł tekstu. Znajdź wszystkie nagłówki H1 w tekście i %2$s zamień je na nagłówki niższego poziomu%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$sGęstość słowa kluczowego%2$s: Słowo kluczowe nie zostało znalezione. To mniej niż zalecane minimum %3$d razy dla tekstu o tej długości. %4$sSkup się na słowie kluczowym%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$sGęstość słowa kluczowego%2$s: Słowo kluczowe zostało znalezione %5$d raz. To mniej niż zalecane minimum %3$d razy dla tekstu o tej długości. %4$sSkup się na słowie kluczowym%2$s!","%1$sGęstość słowa kluczowego%2$s: Słowo kluczowe zostało znalezione %5$d razy. To mniej niż zalecane minimum %3$d razy dla tekstu o tej długości. %4$sSkup się na słowie kluczowym%2$s!","%1$sGęstość słowa kluczowego%2$s: Słowo kluczowe zostało znalezione %5$d razy. To mniej niż zalecane minimum %3$d razy dla tekstu o tej długości. %4$sSkup się na słowie kluczowym%2$s!"],"%1$sKeyphrase density%2$s: The focus keyphrase was found %3$d time. This is great!":["%1$sGęstość słowa kluczowego%2$s: Słowo kluczowe zostało znalezione %3$d raz. Świetnie!","%1$sGęstość słowa kluczowego%2$s: Słowo kluczowe zostało znalezione %3$d razy. Świetnie!","%1$sGęstość frazy kluczowej%2$s: Fraza kluczowa została znaleziona %3$d razy. Świetnie!"],"%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$sGęstość słowa kluczowego%2$s: Słowo kluczowe zostało znalezione %5$d raz. To więcej niż zalecane maksymalne %3$d razy dla tekstu o tej długości. %4$sNie optymalizuj zbyt agresywnie%2$s!","%1$sGęstość słowa kluczowego%2$s: Słowo kluczowe zostało znalezione %5$d raz. To o wiele więcej niż zalecane maksymalne %3$d razy dla tekstu o tej długości. %4$sNie optymalizuj zbyt agresywnie%2$s!","%1$sGęstość słowa kluczowego%2$s: Słowo kluczowe zostało znalezione %5$d raz. To o wiele więcej niż zalecane maksymalne %3$d razy dla tekstu o tej długości. %4$sNie optymalizuj zbyt agresywnie%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$sGęstość słowa kluczowego%2$s: Słowo kluczowe zostało znalezione %5$d raz. To o wiele więcej niż zalecane maksymalne %3$d razy dla tekstu o tej długości. %4$sNie optymalizuj zbyt agresywnie%2$s!","%1$sGęstość słowa kluczowego%2$s: Słowo kluczowe zostało znalezione %5$d razy. To o wiele więcej niż zalecane maksymalne %3$d razy dla tekstu o tej długości. %4$sNie optymalizuj zbyt agresywnie%2$s!","%1$sGęstość słowa kluczowego%2$s: Słowo kluczowe zostało znalezione %5$d razy. To o wiele więcej niż zalecane maksymalne %3$d razy dla tekstu o tej długości. %4$sNie optymalizuj zbyt agresywnie%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$sFunktory w frazie kluczowej%3$s: Fraza kluczowa \"%4$s\" zawiera jedynie funktory. %2$sDowiedz się więcej o tworzeniu dobrych fraz kluczowych.%3$s"],"%1$sKeyphrase length%3$s: %2$sSet a keyphrase in order to calculate your SEO score%3$s.":["%1$sDługość frazy kluczowej%3$s: %2$sWpisz frazę kluczową, aby obliczyć wynik SEO %3$s."],"%1$sKeyphrase in slug%2$s: More than half of your keyphrase appears in the slug. That's great!":["%1$sFraza kluczowa w bezpośrednim odnośniku%2$s: Więcej niż połowa frazy kluczowej pojawiła się w bezpośrednim odnośniku. Świetnie!"],"%1$sKeyphrase in slug%3$s: (Part of) your keyphrase does not appear in the slug. %2$sChange that%3$s!":["%1$sFraza kluczowa w bezpośrednim odnośniku%3$s: (Część lub cała) fraza kluczowa nie pojawia się w bezpośrednim odnośniku. %2$sZmień to%3$s!"],"%1$sKeyphrase in slug%2$s: Great work!":["%1$sFraza kluczowa w bezpośrednim odnośniku%2$s: Dobra robota!"],"%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$sFraza kluczowa w tytule%3$s: Nie wszystkie słowa z frazy kluczowej \"%4$s\" pojawiły się w tytule. %2$sPostaraj się użyć wszystkich słów z frazy kluczowej w tytule%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$sFraza kluczowa w tytule%3$s: Brak dokładnego dopasowania. %2$sSpróbuj dopasować tytuł do frazy kluczowej%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$sFraza kluczowa w tytule%3$s: Fraza kluczowa występuje w tytule, ale nie na początku. %2$sSpróbuj przesunąć ją na początek%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$sFraza kluczowa w tytule%2$s: Dokładnie dopasowana fraza kluczowa występuje już na początku tytułu. Dobra robota!"],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sRozkład frazy kluczowej%2$s: Dobra robota!"],"%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$sRozkład frazy kluczowej%3$s: Nierówny. Niektóre partie tekstu nie zawierają fraz kluczowych lub ich synonimów. %2$sRozłóż je równomiernie%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$sRozkład frazy kluczowej%3$s: Bardzo nierówny. Duże części tekstu nie zawierają frazy kluczowej lub jej synonimów. %2$sRozłóż je równomiernie%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$sRozkład fraz kluczowych%3$s: %2$sUwzględnij frazę kluczową i jej synonimy w tekście, aby sprawdzić jej rozkład%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$sUżyta fraza kluczowa%6$s: Słowo kluczowe zostało już użyte %1$s%2$d wcześniej%3$s. %5$sProszę nie używać słowa kluczowego więcej niż raz%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$sUżyta fraza kluczowa%5$s: Słowo kluczowe zostało już użyte %1$swcześniej%2$s. %4$sProszę nie używać słowa kluczowego więcej niż raz%5$s."],"%1$sPreviously used keyphrase%2$s: You've not used this keyphrase before, very good.":["%1$sUżyta fraza kluczowa%2$s: Słowo kluczowe nie zostało jeszcze użyte, bardzo dobrze."],"%1$sSlug stopwords%3$s: The slug for this page contains a stop word. %2$sRemove it%3$s!":["%1$s\"Słowa stop\" w bezpośrednim odnośniku%3$s: Bezpośredni odnośnik do tej strony zawiera \"słowo stop\". %2$sUsuń je%3$s!","%1$s\"Słowa stop\" w bezpośrednim odnośniku%3$s: Bezpośredni odnośnik do tej strony zawiera \"słowa stop\". %2$sUsuń je%3$s!","%1$s\"Słowa stop\" w bezpośrednim odnośniku%3$s: Bezpośredni odnośnik do tej strony zawiera \"słowa stop\". %2$sUsuń je%3$s!"],"%1$sSlug too long%3$s: the slug for this page is a bit long. %2$sShorten it%3$s!":["%1$sBezpośredni odnośnik jest za długi%3$s: bezpośredni odnośnik dla tej strony jest trochę za długi. %2$sSkróć go%3$s!"],"%1$sImage alt attributes%3$s: No images appear on this page. %2$sAdd some%3$s!":["%1$sAtrybuty alt obrazków%3$s: Brak obrazków na tej stronie. %2$sDodaj jakieś%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$sLinkowana fraza kluczowa%3$s: Linkujesz do innej strony na słowa kluczowe, które chcesz, aby obecna strona była wysoko. %2$sNie rób tego%3$s!"],"This is far below the recommended minimum of %5$d word. %3$sAdd more content%4$s.":["To dużo mniej, niż zalecane minimum %5$d słowo. %3$sDopisz więcej treści%4$s.","To dużo mniej, niż zalecane minimum %5$d słowa. %3$sDopisz więcej treści%4$s.","To dużo mniej, niż zalecane minimum %5$d słów. %3$sDopisz więcej treści%4$s."],"This is below the recommended minimum of %5$d word. %3$sAdd more content%4$s.":["To mniej, niż zalecane minimum %5$d słowo. %3$sDopisz więcej treści%4$s.","To mniej, niż zalecane minimum %5$d słowa. %3$sDopisz więcej treści%4$s.","To mniej, niż zalecane minimum %5$d słów. %3$sDopisz więcej treści%4$s."],"%2$sText length%4$s: The text contains %1$d word.":["%2$sDługość tekstu%4$s: Tekst zawiera %1$d słowo.","%2$sDługość tekstu%4$s: Tekst zawiera %1$d słowa.","%2$sDługość tekstu%4$s: Tekst zawiera %1$d słów."],"%2$sText length%3$s: The text contains %1$d word. Good job!":["%2$sDługość tekstu%3$s: Tekst zawiera %1$d słowo. Dobra robota!","%2$sDługość tekstu%3$s: Tekst zawiera %1$d słowa. Dobra robota!","%2$sDługość tekstu%3$s: Tekst zawiera %1$d słów. Dobra robota!"],"%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$sSłowo kluczowe w nagłówku%3$s: Ponad 75% z twoich nagłówków wyższego rzędu pokrywa się z tematem wpisu. To za dużo. %2$sNie optymalizuj zbyt agresywnie%3$s!"],"%1$sSEO title width%3$s: %2$sPlease create an SEO title%3$s.":["%1$sDługość tytułu SEO%3$s: %2$sProszę utworzyć tytuł 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$sDługość tytułu SEO%3$s: Tytuł SEO jest za długi. %2$sSpróbuj go skrócić%3$s."],"%1$sSEO title width%2$s: Good job!":["%1$sDługość tytułu SEO%2$s:Dobra robota!"],"%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$sDługość tytułu SEO%3$s: Tytuł SEO jest za krótki. %2$sProszę dodać warianty frazy kluczowej lub utworzyć treść z wezwaniem do działania%3$s."],"%1$sOutbound links%2$s: There are both nofollowed and normal outbound links on this page. Good job!":["%1$sWychodzące odnośniki%2$s: Na tej stronie występują wychodzące odnośniki z atrybutami \"nofollow\" i zwykłe. Dobra robota!"],"%1$sOutbound links%2$s: Good job!":["%1$sWychodzące odnośniki%2$s: Dobra robota!"],"%1$sOutbound links%3$s: All outbound links on this page are nofollowed. %2$sAdd some normal links%3$s.":["%1$sWychodzące odnośniki%3$s: Wszystkie wychodzące odnośniki na tej stronie posiadają atrybut \"nofollow\". %2$sDodaj również zwykłe linki%3$s."],"%1$sOutbound links%3$s: No outbound links appear in this page. %2$sAdd some%3$s!":["%1$sWychodzące odnośniki%3$s: Na tej stronie nie znaleziono wychodzących odnośników. %2$sDodaj jakieś%3$s!"],"%1$sMeta description length%2$s: Well done!":["%1$sDługość meta opisu%2$s: Dobra robota!"],"%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$sDługość meta opisu%3$s: Meta opis zawiera ponad %4$d znaków. Aby upewnić się, że cały meta opis będzie widoczny, %2$sskróć go%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$sDługość meta opisu%3$s: Meta opis jest za krótki (poniżej %4$d znaków). Dostępne jest jeszcze %5$d znaków. %2$sWykorzystaj je%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$sDługość meta opisu%3$s: Nie wpisano opisu meta. Wyszukiwarki użyją części wpisu jako opisu meta. %2$sUzupełnij go%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$sFraza kluczowa w opisie meta%2$s: Opis meta został wprowadzony, ale nie zawiera frazy kluczowej. %3$sPopraw to%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$sFraza kluczowa w opisie meta%2$s: Opis meta zawiera frazę kluczową %3$s razy, co stanowi przekroczenie zalecanego maksimum 2 razy. %4$sOgranicz użycie%5$s!"],"%1$sKeyphrase in meta description%2$s: Keyphrase or synonym appear in the meta description. Well done!":["%1$sFraza kluczowa w opisie meta%2$s: Fraza kluczowa lub jej synonimy pojawiają się w opisie meta. Dobra robota!"],"%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$sDługość frazy kluczowej%5$s: Fraza kluczowa zawiera %1$d słów. To jest zdecydowanie za dużo wobec rekomendowanego maksimum %2$d słów. %4$sSkróć frazę%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$sDługość frazy kluczowej%5$s: Fraza kluczowa zawiera %1$d słów. To jest za dużo wobec rekomendowanego maksimum %2$d słów. %4$sSkróć frazę%5$s!"],"%1$sKeyphrase length%2$s: Good job!":["%1$sDługość frazy kluczowej%2$s: Dobra robota!"],"%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$sDługość frazy kluczowej%3$s: Na tej stronie nie ustawiono frazy kluczowej. %2$sWpisz frazę kluczową, aby obliczyć wynik 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$sFraza kluczowa we wstępie%3$s: Twoja fraza kluczowa lub jej synonimy nie pojawiają się w pierwszym paragrafie. %2$sUpewnij się, że temat wpisu jest niezwłocznie opisany%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$sFraza kluczowa we wstępie%3$s: Twoja fraza kluczowa lub jej synonimy nie pojawiają się w pierwszym paragrafie, ale nie w jednym zdaniu. %2$sPopraw to%3$s."],"%1$sKeyphrase in introduction%2$s: Well done!":["%1$sFraza kluczowa we wstępie%2$s: Dobra robota!"],"%1$sInternal links%2$s: There are both nofollowed and normal internal links on this page. Good job!":["%1$sWewnętrzne odnośniki%2$s: Na stronie znajdują się zarówno odnośniki zwykłe, jak i \"nofollow\". Dobra robota!"],"%1$sInternal links%2$s: You have enough internal links. Good job!":["%1$sWewnętrzne odnośniki%2$s: Masz wystarczającą liczbę wewnętrznych odnośników. Dobra robota!"],"%1$sInternal links%3$s: The internal links in this page are all nofollowed. %2$sAdd some good internal links%3$s.":["%1$sWewnętrzne odnośniki%3$s: Wszystkie wewnętrzne odnośniki na tej stronie mają ustawiony atrybut nofollow. %2$sDodaj inne wewnętrzne linki%3$s."],"%1$sInternal links%3$s: No internal links appear in this page, %2$smake sure to add some%3$s!":["%1$sWewnętrzne odnośniki%3$s: Na tej stronie nie ma żadnego wewnętrznego odnośnika. %2$sDodaj jakieś%3$s!"],"%1$sTransition words%2$s: Well done!":["%1$sSłowa łączące%2$s: Dobra robota!"],"%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$sSłowa łączące%2$s: Tylko %3$s zdań zawiera słowa łączące, to za mało. %4$sUżywaj ich częściej%2$s."],"%1$sTransition words%2$s: None of the sentences contain transition words. %3$sUse some%2$s.":["%1$sSłowa łączące%2$s: Żadne zdanie nie zawiera słów łączących. %3$sUżyj ich%2$s."],"%1$sNot enough content%2$s: %3$sPlease add some content to enable a good analysis%2$s.":["%1$sZa mało treści%2$s: %3$sDodaj więcej treści, aby wykonać analizę%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$sRozkład nagłówków%2$s: Nie korzystasz z nagłówków, ale tekst jest wystarczająco krótki i prawdopodobnie ich nie potrzebuje."],"%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$sRozkład podtytułów%2$s: Nie korzystasz z nagłówków, choć ten tekst jest raczej długi. %3$sSpróbuj dodać nagłówki%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$sRozkład nagłówków%2$s: %3$d sekcja tekstu jest dłuższa niż %4$d słów i nie jest podzielona żadnymi nagłówkami. %5$sDodaj nagłówki, aby poprawić czytelność%2$s.","%1$sPodział nagłówków%2$s: %3$d sekcje tekstu są dłuższe niż %4$d słów i nie są podzielone żadnymi nagłówkami. %5$sDodaj nagłówki, aby poprawić czytelność%2$s.","%1$sPodział nagłówków%2$s: %3$d sekcji tekstu jest dłuższych niż %4$d słów i nie są podzielone żadnymi nagłówkami. %5$sDodaj nagłówki, aby poprawić czytelność%2$s."],"%1$sSubheading distribution%2$s: Great job!":["%1$sRozkład nagłówków%2$s: Dobra robota!"],"%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$sDługość zdań%2$s: %3$s zdań zawiera więcej niż %4$s słów, czyli więcej niż rekomendowane maksimum %5$s zdań. %6$sSpróbuj skrócić zdania%2$s."],"%1$sSentence length%2$s: Great!":["%1$sDługość zdań%2$s: Dobra robota!"],"%1$sConsecutive sentences%2$s: There is enough variety in your sentences. That's great!":["%1$sNastępujące zdania%2$s: Zdania są wystarczająco zróżnicowane. Świetnie!"],"%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$sNastępujące zdania%2$s: Tekst zawiera %3$d następujące po sobie zdanie zaczynające się tym samym słowem. %5$sSpróbuj wprowadzić trochę różnorodności%2$s!","%1$sNastępujące zdania%2$s: Tekst zawiera %4$d przypadki, w których %3$d następujące po sobie zdania zaczyna się tym samym słowem. %5$s Spróbuj zmienić szyk wyrazów i zdań%2$s!","%1$sNastępujące zdania%2$s: Tekst zawiera %4$d przypadki, w których %3$d następujących po sobie zdań zaczyna się tym samym słowem. %5$s Spróbuj zmienić szyk wyrazów i zdań%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$sStrona bierna%2$s: %3$s zdań zawiera stronę bierną, co przekracza zalecaną maksymalną ilość %4$s. %5$sSpróbuj częściej użyć strony czynnej%2$s."],"%1$sPassive voice%2$s: You're using enough active voice. That's great!":["%1$sStrona bierna%2$s: Używasz wystarczająco często strony czynnej. Świetnie!"],"%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$sDługość akapitów%2$s: %3$d akapit zawiera więcej niż zalecane maksimum %4$d słów. %5$sSkróć ten akapit%2$s!","%1$sDługość akapitów%2$s: %3$d akapity zawierają więcej niż zalecane maksimum %4$d słów. %5$sSkróć te akapity%2$s!","%1$sDługość akapitów%2$s: %3$d akapitów zawierają więcej niż zalecane maksimum %4$d słów. %5$sSkróć te akapity%2$s!"],"%1$sParagraph length%2$s: None of the paragraphs are too long. Great job!":["%1$sDługość akapitów%2$s: Żaden z akapitów nie jest za długi. Dobra robota!"],"Good job!":["Dobra robota!"],"%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$sCzytelność%2$s: Treść została oceniona na %3$s w teście, co oznacza, że tekst jest %4$s do przeczytania. %5$s%6$s%7$s"],"Scroll to see the preview content.":["Przewiń, aby zobaczyć podgląd treści."],"An error occurred in the '%1$s' assessment":["Wystąpił błąd podczas wykonywania oceny \"%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 wyrazów zawiera %2$sponad %3$s sylab%4$s, czyli więcej, niż wynosi zalecane maksimum (%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 wyrazów zawiera %2$sponad %3$s sylab%4$s, czyli mniej lub tyle, ile wynosi zalecane maksimum (%5$s)."],"This is slightly below the recommended minimum of %5$d word. %3$sAdd a bit more copy%4$s.":["To trochę mniej, niż %2$szalecane minimum%3$s słów: %4$d. Dopisz trochę więcej treści.","To trochę mniej, niż %2$szalecane minimum%3$s słów: %4$d. Dopisz trochę więcej treści.","To trochę mniej, niż %2$szalecane minimum%3$s słów: %4$d. Dopisz trochę więcej treści."],"The meta description contains %1$d sentence %2$sover %3$s words%4$s. Try to shorten this sentence.":["Opis meta zawiera %1$d zdań mających %2$sponad %3$s wyrazów%4$s. Spróbuj skrócić te zdania.","Opis meta zawiera %1$d zdania mające %2$sponad %3$s wyrazów%4$s. Spróbuj skrócić te zdania.","Opis meta zawiera %1$d zdań mających %2$sponad %3$s wyrazów%4$s. Spróbuj skrócić te zdania."],"The meta description contains no sentences %1$sover %2$s words%3$s.":["Opis meta nie zawiera zdań, które mają %1$sponad %2$s wyrazów%3$s."],"Mobile preview":["Podgląd na urządzeniach mobilnych"],"Desktop preview":["Podgląd na komputerach"],"Please provide an SEO title by editing the snippet below.":["Wprowadź tytuł SEO w poniższym polu edytora wyglądu wyników wyszukiwania."],"Meta description preview:":["Podgląd opisu meta:"],"Slug preview:":["Podgląd sluga:"],"SEO title preview:":["Podgląd tytułu SEO:"],"Close snippet editor":["Zamknij edytor wyglądu podstrony w wynikach wyszukiwania"],"Slug":["Slug"],"Remove marks in the text":["Usuń znaczniki w tekście"],"Mark this result in the text":["Zaznacz ten wynik w tekście"],"Marks are disabled in current view":["Znaczniki są wyłączone w obecnym widoku"],"Good SEO score":["Dobra ocena SEO"],"OK SEO score":["Wystarczająca ocena SEO"],"Feedback":["Opinie"],"ok":["ok"],"Please provide a meta description by editing the snippet below.":["Wprowadź opis meta w poniższym polu edytora wyglądu wyników wyszukiwania."],"Edit snippet":["Edytuj wygląd podstrony w wynikach wyszukiwania"],"You can click on each element in the preview to jump to the Snippet Editor.":["Możesz kliknąć na dowolny element podglądu, aby przejść do edycji jego treści."],"SEO title":["Tytuł SEO"],"Needs improvement":["Wymaga poprawy"],"Good":["Dobre"],"very difficult":["bardzo trudna"],"Try to make shorter sentences, using less difficult words to improve readability":["Aby poprawić czytelność, spróbuj trochę skrócić zdania i używać prostszych słów"],"difficult":["trudna"],"Try to make shorter sentences to improve readability":["Aby poprawić czytelność, spróbuj trochę skrócić zdania"],"fairly difficult":["dość trudna"],"OK":["OK"],"fairly easy":["dość łatwa"],"easy":["łatwa"],"very easy":["bardzo łatwa"],"Meta description":["Opis"]}}}
1
+ {"domain":"wordpress-seo","locale_data":{"wordpress-seo":{"":{"domain":"wordpress-seo","plural-forms":"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);","lang":"pl"},"Google preview":[],"Has feedback":["Dostępne uwagi"],"Content optimization:":["Optymalizacja treści:"],"%1$sFlesch Reading Ease%2$s: The copy scores %3$s in the test, which is considered %4$s to read. %5$s":["%1$sCzytelność%2$s: Treść została oceniona na %3$s w teście, co oznacza, że tekst jest %4$s do przeczytania. %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$sAtrybuty alt obrazków%5$s: Z %2$d obrazów na tej stronie, %1$d ma atrybuty alt ze słowami z fraz kluczowych lub synonimami. To trochę za dużo. %4$sUżywaj frazy kluczowej lub synonimów tylko wtedy, kiedy naprawdę pasują do obrazu%5$s."],"%1$sImage alt attributes%2$s: Good job!":["%1$sAtrybuty alt obrazków%2$s: Dobra robota!"],"%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$sAtrybuty alt obrazków%5$s: Z %2$d obrazków na tej stronie, tylko %1$d ma atrybut alt pokrywający się z tematem wpisu. %4$sDodaj frazę kluczową lub jej synonimy do tagu alt obrazków%5$s!","%3$sAtrybuty alt obrazków%5$s: Z %2$d obrazków na tej stronie, tylko %1$d mają atrybuty alt pokrywający się z tematem wpisu. %4$sDodaj frazę kluczową lub jej synonimy do tagu alt obrazków%5$s!","%3$sAtrybuty alt obrazków%5$s: Z %2$d obrazków na tej stronie, tylko %1$d ma atrybuty alt pokrywający się z tematem wpisu. %4$sDodaj frazę kluczową lub jej synonimy do tagu alt obrazków%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$sAtrybuty alt obrazków%3$s: Obrazki na tej stronie nie mają atrybutów alt pokrywających się z tematem wpisu. %2$sDodaj frazę kluczową lub jej synonimy do atrybutów alt obrazków%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$sAtrybuty alt obrazków%3$s: Obrazki na tej stronie mają atrybuty alt, ale nie została ustawiona fraza kluczowa. %2$sNapraw to%3$s!"],"%1$sKeyphrase in subheading%2$s: %3$s of your higher-level subheadings reflects the topic of your copy. Good job!":["%1$sSłowo kluczowe w nagłówku%2$s: %3$s z twoich nagłówków wyższego rzędu pokrywa się z tematem wpisu. Dobra robota!","%1$sSłowo kluczowe w nagłówku%2$s: %3$s z twoich nagłówków wyższego rzędu pokrywa się z tematem wpisu. Dobra robota!","%1$sSłowo kluczowe w nagłówku%2$s: %3$s z twoich nagłówków wyższego rzędu pokrywa się z tematem wpisu. Dobra robota!"],"%1$sKeyphrase in subheading%2$s: Your higher-level subheading reflects the topic of your copy. Good job!":["%1$sSłowo kluczowe w nagłówku%2$s: Nagłówków wyższego rzędu pokrywa się z tematem wpisu. Dobra robota!"],"%1$sKeyphrase in subheading%3$s: %2$sUse more keyphrases or synonyms in your higher-level subheadings%3$s!":["%1$sSłowo kluczowe w nagłówku%3$s:%2$sUżywaj częściej słów kluczowych lub ich synonimów z nagłówkach wyższego rzędu%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$sTytuł%3$s: Nagłówek H1 powinien być użyty tylko jako tytuł tekstu. Znajdź wszystkie nagłówki H1 w tekście i %2$s zamień je na nagłówki niższego poziomu%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$sGęstość słowa kluczowego%2$s: Słowo kluczowe nie zostało znalezione. To mniej niż zalecane minimum %3$d razy dla tekstu o tej długości. %4$sSkup się na słowie kluczowym%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$sGęstość słowa kluczowego%2$s: Słowo kluczowe zostało znalezione %5$d raz. To mniej niż zalecane minimum %3$d razy dla tekstu o tej długości. %4$sSkup się na słowie kluczowym%2$s!","%1$sGęstość słowa kluczowego%2$s: Słowo kluczowe zostało znalezione %5$d razy. To mniej niż zalecane minimum %3$d razy dla tekstu o tej długości. %4$sSkup się na słowie kluczowym%2$s!","%1$sGęstość słowa kluczowego%2$s: Słowo kluczowe zostało znalezione %5$d razy. To mniej niż zalecane minimum %3$d razy dla tekstu o tej długości. %4$sSkup się na słowie kluczowym%2$s!"],"%1$sKeyphrase density%2$s: The focus keyphrase was found %3$d time. This is great!":["%1$sGęstość słowa kluczowego%2$s: Słowo kluczowe zostało znalezione %3$d raz. Świetnie!","%1$sGęstość słowa kluczowego%2$s: Słowo kluczowe zostało znalezione %3$d razy. Świetnie!","%1$sGęstość frazy kluczowej%2$s: Fraza kluczowa została znaleziona %3$d razy. Świetnie!"],"%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$sGęstość słowa kluczowego%2$s: Słowo kluczowe zostało znalezione %5$d raz. To więcej niż zalecane maksymalne %3$d razy dla tekstu o tej długości. %4$sNie optymalizuj zbyt agresywnie%2$s!","%1$sGęstość słowa kluczowego%2$s: Słowo kluczowe zostało znalezione %5$d raz. To o wiele więcej niż zalecane maksymalne %3$d razy dla tekstu o tej długości. %4$sNie optymalizuj zbyt agresywnie%2$s!","%1$sGęstość słowa kluczowego%2$s: Słowo kluczowe zostało znalezione %5$d raz. To o wiele więcej niż zalecane maksymalne %3$d razy dla tekstu o tej długości. %4$sNie optymalizuj zbyt agresywnie%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$sGęstość słowa kluczowego%2$s: Słowo kluczowe zostało znalezione %5$d raz. To o wiele więcej niż zalecane maksymalne %3$d razy dla tekstu o tej długości. %4$sNie optymalizuj zbyt agresywnie%2$s!","%1$sGęstość słowa kluczowego%2$s: Słowo kluczowe zostało znalezione %5$d razy. To o wiele więcej niż zalecane maksymalne %3$d razy dla tekstu o tej długości. %4$sNie optymalizuj zbyt agresywnie%2$s!","%1$sGęstość słowa kluczowego%2$s: Słowo kluczowe zostało znalezione %5$d razy. To o wiele więcej niż zalecane maksymalne %3$d razy dla tekstu o tej długości. %4$sNie optymalizuj zbyt agresywnie%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$sFunktory w frazie kluczowej%3$s: Fraza kluczowa \"%4$s\" zawiera jedynie funktory. %2$sDowiedz się więcej o tworzeniu dobrych fraz kluczowych.%3$s"],"%1$sKeyphrase length%3$s: %2$sSet a keyphrase in order to calculate your SEO score%3$s.":["%1$sDługość frazy kluczowej%3$s: %2$sWpisz frazę kluczową, aby obliczyć wynik SEO %3$s."],"%1$sKeyphrase in slug%2$s: More than half of your keyphrase appears in the slug. That's great!":["%1$sFraza kluczowa w bezpośrednim odnośniku%2$s: Więcej niż połowa frazy kluczowej pojawiła się w bezpośrednim odnośniku. Świetnie!"],"%1$sKeyphrase in slug%3$s: (Part of) your keyphrase does not appear in the slug. %2$sChange that%3$s!":["%1$sFraza kluczowa w bezpośrednim odnośniku%3$s: (Część lub cała) fraza kluczowa nie pojawia się w bezpośrednim odnośniku. %2$sZmień to%3$s!"],"%1$sKeyphrase in slug%2$s: Great work!":["%1$sFraza kluczowa w bezpośrednim odnośniku%2$s: Dobra robota!"],"%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$sFraza kluczowa w tytule%3$s: Nie wszystkie słowa z frazy kluczowej \"%4$s\" pojawiły się w tytule. %2$sPostaraj się użyć wszystkich słów z frazy kluczowej w tytule%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$sFraza kluczowa w tytule%3$s: Brak dokładnego dopasowania. %2$sSpróbuj dopasować tytuł do frazy kluczowej%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$sFraza kluczowa w tytule%3$s: Fraza kluczowa występuje w tytule, ale nie na początku. %2$sSpróbuj przesunąć ją na początek%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$sFraza kluczowa w tytule%2$s: Dokładnie dopasowana fraza kluczowa występuje już na początku tytułu. Dobra robota!"],"%1$sKeyphrase distribution%2$s: Good job!":["%1$sRozkład frazy kluczowej%2$s: Dobra robota!"],"%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$sRozkład frazy kluczowej%3$s: Nierówny. Niektóre partie tekstu nie zawierają fraz kluczowych lub ich synonimów. %2$sRozłóż je równomiernie%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$sRozkład frazy kluczowej%3$s: Bardzo nierówny. Duże części tekstu nie zawierają frazy kluczowej lub jej synonimów. %2$sRozłóż je równomiernie%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$sRozkład fraz kluczowych%3$s: %2$sUwzględnij frazę kluczową i jej synonimy w tekście, aby sprawdzić jej rozkład%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$sUżyta fraza kluczowa%6$s: Słowo kluczowe zostało już użyte %1$s%2$d wcześniej%3$s. %5$sProszę nie używać słowa kluczowego więcej niż raz%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$sUżyta fraza kluczowa%5$s: Słowo kluczowe zostało już użyte %1$swcześniej%2$s. %4$sProszę nie używać słowa kluczowego więcej niż raz%5$s."],"%1$sPreviously used keyphrase%2$s: You've not used this keyphrase before, very good.":["%1$sUżyta fraza kluczowa%2$s: Słowo kluczowe nie zostało jeszcze użyte, bardzo dobrze."],"%1$sSlug stopwords%3$s: The slug for this page contains a stop word. %2$sRemove it%3$s!":["%1$s\"Słowa stop\" w bezpośrednim odnośniku%3$s: Bezpośredni odnośnik do tej strony zawiera \"słowo stop\". %2$sUsuń je%3$s!","%1$s\"Słowa stop\" w bezpośrednim odnośniku%3$s: Bezpośredni odnośnik do tej strony zawiera \"słowa stop\". %2$sUsuń je%3$s!","%1$s\"Słowa stop\" w bezpośrednim odnośniku%3$s: Bezpośredni odnośnik do tej strony zawiera \"słowa stop\". %2$sUsuń je%3$s!"],"%1$sSlug too long%3$s: the slug for this page is a bit long. %2$sShorten it%3$s!":["%1$sBezpośredni odnośnik jest za długi%3$s: bezpośredni odnośnik dla tej strony jest trochę za długi. %2$sSkróć go%3$s!"],"%1$sImage alt attributes%3$s: No images appear on this page. %2$sAdd some%3$s!":["%1$sAtrybuty alt obrazków%3$s: Brak obrazków na tej stronie. %2$sDodaj jakieś%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$sLinkowana fraza kluczowa%3$s: Linkujesz do innej strony na słowa kluczowe, które chcesz, aby obecna strona była wysoko. %2$sNie rób tego%3$s!"],"This is far below the recommended minimum of %5$d word. %3$sAdd more content%4$s.":["To dużo mniej, niż zalecane minimum %5$d słowo. %3$sDopisz więcej treści%4$s.","To dużo mniej, niż zalecane minimum %5$d słowa. %3$sDopisz więcej treści%4$s.","To dużo mniej, niż zalecane minimum %5$d słów. %3$sDopisz więcej treści%4$s."],"This is below the recommended minimum of %5$d word. %3$sAdd more content%4$s.":["To mniej, niż zalecane minimum %5$d słowo. %3$sDopisz więcej treści%4$s.","To mniej, niż zalecane minimum %5$d słowa. %3$sDopisz więcej treści%4$s.","To mniej, niż zalecane minimum %5$d słów. %3$sDopisz więcej treści%4$s."],"%2$sText length%4$s: The text contains %1$d word.":["%2$sDługość tekstu%4$s: Tekst zawiera %1$d słowo.","%2$sDługość tekstu%4$s: Tekst zawiera %1$d słowa.","%2$sDługość tekstu%4$s: Tekst zawiera %1$d słów."],"%2$sText length%3$s: The text contains %1$d word. Good job!":["%2$sDługość tekstu%3$s: Tekst zawiera %1$d słowo. Dobra robota!","%2$sDługość tekstu%3$s: Tekst zawiera %1$d słowa. Dobra robota!","%2$sDługość tekstu%3$s: Tekst zawiera %1$d słów. Dobra robota!"],"%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$sWyrażenie kluczowe w nagłówku%3$s: Ponad 75%% z twoich nagłówków wyższego stopnia odpowiada tematyce treści. To za dużo. %2$sNie optymalizuj zbyt agresywnie%3$s!"],"%1$sSEO title width%3$s: %2$sPlease create an SEO title%3$s.":["%1$sDługość tytułu SEO%3$s: %2$sProszę utworzyć tytuł 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$sDługość tytułu SEO%3$s: Tytuł SEO jest za długi. %2$sSpróbuj go skrócić%3$s."],"%1$sSEO title width%2$s: Good job!":["%1$sDługość tytułu SEO%2$s:Dobra robota!"],"%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$sDługość tytułu SEO%3$s: Tytuł SEO jest za krótki. %2$sProszę dodać warianty frazy kluczowej lub utworzyć treść z wezwaniem do działania%3$s."],"%1$sOutbound links%2$s: There are both nofollowed and normal outbound links on this page. Good job!":["%1$sWychodzące odnośniki%2$s: Na tej stronie występują wychodzące odnośniki z atrybutami \"nofollow\" i zwykłe. Dobra robota!"],"%1$sOutbound links%2$s: Good job!":["%1$sWychodzące odnośniki%2$s: Dobra robota!"],"%1$sOutbound links%3$s: All outbound links on this page are nofollowed. %2$sAdd some normal links%3$s.":["%1$sWychodzące odnośniki%3$s: Wszystkie wychodzące odnośniki na tej stronie posiadają atrybut \"nofollow\". %2$sDodaj również zwykłe linki%3$s."],"%1$sOutbound links%3$s: No outbound links appear in this page. %2$sAdd some%3$s!":["%1$sWychodzące odnośniki%3$s: Na tej stronie nie znaleziono wychodzących odnośników. %2$sDodaj jakieś%3$s!"],"%1$sMeta description length%2$s: Well done!":["%1$sDługość meta opisu%2$s: Dobra robota!"],"%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$sDługość meta opisu%3$s: Meta opis zawiera ponad %4$d znaków. Aby upewnić się, że cały meta opis będzie widoczny, %2$sskróć go%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$sDługość meta opisu%3$s: Meta opis jest za krótki (poniżej %4$d znaków). Dostępne jest jeszcze %5$d znaków. %2$sWykorzystaj je%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$sDługość meta opisu%3$s: Nie wpisano opisu meta. Wyszukiwarki użyją części wpisu jako opisu meta. %2$sUzupełnij go%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$sFraza kluczowa w opisie meta%2$s: Opis meta został wprowadzony, ale nie zawiera frazy kluczowej. %3$sPopraw to%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$sFraza kluczowa w opisie meta%2$s: Opis meta zawiera frazę kluczową %3$s razy, co stanowi przekroczenie zalecanego maksimum 2 razy. %4$sOgranicz użycie%5$s!"],"%1$sKeyphrase in meta description%2$s: Keyphrase or synonym appear in the meta description. Well done!":["%1$sFraza kluczowa w opisie meta%2$s: Fraza kluczowa lub jej synonimy pojawiają się w opisie meta. Dobra robota!"],"%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$sDługość frazy kluczowej%5$s: Fraza kluczowa zawiera %1$d słów. To jest zdecydowanie za dużo wobec rekomendowanego maksimum %2$d słów. %4$sSkróć frazę%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$sDługość frazy kluczowej%5$s: Fraza kluczowa zawiera %1$d słów. To jest za dużo wobec rekomendowanego maksimum %2$d słów. %4$sSkróć frazę%5$s!"],"%1$sKeyphrase length%2$s: Good job!":["%1$sDługość frazy kluczowej%2$s: Dobra robota!"],"%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$sDługość frazy kluczowej%3$s: Na tej stronie nie ustawiono frazy kluczowej. %2$sWpisz frazę kluczową, aby obliczyć wynik 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$sFraza kluczowa we wstępie%3$s: Twoja fraza kluczowa lub jej synonimy nie pojawiają się w pierwszym paragrafie. %2$sUpewnij się, że temat wpisu jest niezwłocznie opisany%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$sFraza kluczowa we wstępie%3$s: Twoja fraza kluczowa lub jej synonimy nie pojawiają się w pierwszym paragrafie, ale nie w jednym zdaniu. %2$sPopraw to%3$s."],"%1$sKeyphrase in introduction%2$s: Well done!":["%1$sFraza kluczowa we wstępie%2$s: Dobra robota!"],"%1$sInternal links%2$s: There are both nofollowed and normal internal links on this page. Good job!":["%1$sWewnętrzne odnośniki%2$s: Na stronie znajdują się zarówno odnośniki zwykłe, jak i \"nofollow\". Dobra robota!"],"%1$sInternal links%2$s: You have enough internal links. Good job!":["%1$sWewnętrzne odnośniki%2$s: Masz wystarczającą liczbę wewnętrznych odnośników. Dobra robota!"],"%1$sInternal links%3$s: The internal links in this page are all nofollowed. %2$sAdd some good internal links%3$s.":["%1$sWewnętrzne odnośniki%3$s: Wszystkie wewnętrzne odnośniki na tej stronie mają ustawiony atrybut nofollow. %2$sDodaj inne wewnętrzne linki%3$s."],"%1$sInternal links%3$s: No internal links appear in this page, %2$smake sure to add some%3$s!":["%1$sWewnętrzne odnośniki%3$s: Na tej stronie nie ma żadnego wewnętrznego odnośnika. %2$sDodaj jakieś%3$s!"],"%1$sTransition words%2$s: Well done!":["%1$sSłowa łączące%2$s: Dobra robota!"],"%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$sSłowa łączące%2$s: Tylko %3$s zdań zawiera słowa łączące, to za mało. %4$sUżywaj ich częściej%2$s."],"%1$sTransition words%2$s: None of the sentences contain transition words. %3$sUse some%2$s.":["%1$sSłowa łączące%2$s: Żadne zdanie nie zawiera słów łączących. %3$sUżyj ich%2$s."],"%1$sNot enough content%2$s: %3$sPlease add some content to enable a good analysis%2$s.":["%1$sZa mało treści%2$s: %3$sDodaj więcej treści, aby wykonać analizę%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$sRozkład nagłówków%2$s: Nie korzystasz z nagłówków, ale tekst jest wystarczająco krótki i prawdopodobnie ich nie potrzebuje."],"%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$sRozkład podtytułów%2$s: Nie korzystasz z nagłówków, choć ten tekst jest raczej długi. %3$sSpróbuj dodać nagłówki%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$sRozkład nagłówków%2$s: %3$d sekcja tekstu jest dłuższa niż %4$d słów i nie jest podzielona żadnymi nagłówkami. %5$sDodaj nagłówki, aby poprawić czytelność%2$s.","%1$sPodział nagłówków%2$s: %3$d sekcje tekstu są dłuższe niż %4$d słów i nie są podzielone żadnymi nagłówkami. %5$sDodaj nagłówki, aby poprawić czytelność%2$s.","%1$sPodział nagłówków%2$s: %3$d sekcji tekstu jest dłuższych niż %4$d słów i nie są podzielone żadnymi nagłówkami. %5$sDodaj nagłówki, aby poprawić czytelność%2$s."],"%1$sSubheading distribution%2$s: Great job!":["%1$sRozkład nagłówków%2$s: Dobra robota!"],"%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$sDługość zdań%2$s: %3$s zdań zawiera więcej niż %4$s słów, czyli więcej niż rekomendowane maksimum %5$s zdań. %6$sSpróbuj skrócić zdania%2$s."],"%1$sSentence length%2$s: Great!":["%1$sDługość zdań%2$s: Dobra robota!"],"%1$sConsecutive sentences%2$s: There is enough variety in your sentences. That's great!":["%1$sNastępujące zdania%2$s: Zdania są wystarczająco zróżnicowane. Świetnie!"],"%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$sNastępujące zdania%2$s: Tekst zawiera %3$d następujące po sobie zdanie zaczynające się tym samym słowem. %5$sSpróbuj wprowadzić trochę różnorodności%2$s!","%1$sNastępujące zdania%2$s: Tekst zawiera %4$d przypadki, w których %3$d następujące po sobie zdania zaczyna się tym samym słowem. %5$s Spróbuj zmienić szyk wyrazów i zdań%2$s!","%1$sNastępujące zdania%2$s: Tekst zawiera %4$d przypadki, w których %3$d następujących po sobie zdań zaczyna się tym samym słowem. %5$s Spróbuj zmienić szyk wyrazów i zdań%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$sStrona bierna%2$s: %3$s zdań zawiera stronę bierną, co przekracza zalecaną maksymalną ilość %4$s. %5$sSpróbuj częściej użyć strony czynnej%2$s."],"%1$sPassive voice%2$s: You're using enough active voice. That's great!":["%1$sStrona bierna%2$s: Używasz wystarczająco często strony czynnej. Świetnie!"],"%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$sDługość akapitów%2$s: %3$d akapit zawiera więcej niż zalecane maksimum %4$d słów. %5$sSkróć ten akapit%2$s!","%1$sDługość akapitów%2$s: %3$d akapity zawierają więcej niż zalecane maksimum %4$d słów. %5$sSkróć te akapity%2$s!","%1$sDługość akapitów%2$s: %3$d akapitów zawierają więcej niż zalecane maksimum %4$d słów. %5$sSkróć te akapity%2$s!"],"%1$sParagraph length%2$s: None of the paragraphs are too long. Great job!":["%1$sDługość akapitów%2$s: Żaden z akapitów nie jest za długi. Dobra robota!"],"Good job!":["Dobra robota!"],"%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$sCzytelność%2$s: Treść została oceniona na %3$s w teście, co oznacza, że tekst jest %4$s do przeczytania. %5$s%6$s%7$s"],"Scroll to see the preview content.":["Przewiń, aby zobaczyć podgląd treści."],"An error occurred in the '%1$s' assessment":["Wystąpił błąd podczas wykonywania oceny \"%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 wyrazów zawiera %2$sponad %3$s sylab%4$s, czyli więcej, niż wynosi zalecane maksimum (%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 wyrazów zawiera %2$sponad %3$s sylab%4$s, czyli mniej lub tyle, ile wynosi zalecane maksimum (%5$s)."],"This is slightly below the recommended minimum of %5$d word. %3$sAdd a bit more copy%4$s.":["To trochę mniej, niż %2$szalecane minimum%3$s słów: %4$d. Dopisz trochę więcej treści.","To trochę mniej, niż %2$szalecane minimum%3$s słów: %4$d. Dopisz trochę więcej treści.","To trochę mniej, niż %2$szalecane minimum%3$s słów: %4$d. Dopisz trochę więcej treści."],"The meta description contains %1$d sentence %2$sover %3$s words%4$s. Try to shorten this sentence.":["Opis meta zawiera %1$d zdań mających %2$sponad %3$s wyrazów%4$s. Spróbuj skrócić te zdania.","Opis meta zawiera %1$d zdania mające %2$sponad %3$s wyrazów%4$s. Spróbuj skrócić te zdania.","Opis meta zawiera %1$d zdań mających %2$sponad %3$s wyrazów%4$s. Spróbuj skrócić te zdania."],"The meta description contains no sentences %1$sover %2$s words%3$s.":["Opis meta nie zawiera zdań, które mają %1$sponad %2$s wyrazów%3$s."],"Mobile preview":["Podgląd na urządzeniach mobilnych"],"Desktop preview":["Podgląd na komputerach"],"Please provide an SEO title by editing the snippet below.":["Wprowadź tytuł SEO w poniższym polu edytora wyglądu wyników wyszukiwania."],"Meta description preview:":["Podgląd opisu meta:"],"Slug preview:":["Podgląd sluga:"],"SEO title preview:":["Podgląd tytułu SEO:"],"Close snippet editor":["Zamknij edytor wyglądu podstrony w wynikach wyszukiwania"],"Slug":["Slug"],"Remove marks in the text":["Usuń znaczniki w tekście"],"Mark this result in the text":["Zaznacz ten wynik w tekście"],"Marks are disabled in current view":["Znaczniki są wyłączone w obecnym widoku"],"Good SEO score":["Dobra ocena SEO"],"OK SEO score":["Wystarczająca ocena SEO"],"Feedback":["Opinie"],"ok":["ok"],"Please provide a meta description by editing the snippet below.":["Wprowadź opis meta w poniższym polu edytora wyglądu wyników wyszukiwania."],"Edit snippet":["Edytuj wygląd podstrony w wynikach wyszukiwania"],"You can click on each element in the preview to jump to the Snippet Editor.":["Możesz kliknąć na dowolny element podglądu, aby przejść do edycji jego treści."],"SEO title":["Tytuł SEO"],"Needs improvement":["Wymaga poprawy"],"Good":["Dobre"],"very difficult":["bardzo trudna"],"Try to make shorter sentences, using less difficult words to improve readability":["Aby poprawić czytelność, spróbuj trochę skrócić zdania i używać prostszych słów"],"difficult":["trudna"],"Try to make shorter sentences to improve readability":["Aby poprawić czytelność, spróbuj trochę skrócić zdania"],"fairly difficult":["dość trudna"],"OK":["OK"],"fairly easy":["dość łatwa"],"easy":["łatwa"],"very easy":["bardzo łatwa"],"Meta description":["Opis"]}}}
languages/wordpress-seojs-ja.json CHANGED
@@ -1 +1 @@
1
- {"domain":"wordpress-seo","locale_data":{"wordpress-seo":{"":{"domain":"wordpress-seo","plural-forms":"nplurals=1; plural=0;","lang":"ja_JP"},"Google preview":["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.":[],"Schema":["スキーマ"],"Truly optimize your site for a local audience with our %s plugin! Optimized address details, opening hours, store locator and pickup option!":["%s プラグインを使ってあなたのサイトを地元のお客様のために最適化しましょう。住所の詳細、営業時間、店舗検索、ピックアップオプション。"],"Serving local customers?":["地域のお客様にサービスを提供していますか ?"],"Get the %s plugin now":["%s プラグインを今すぐ入手"],"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.":["メタデーター内のソーシャルプロフィール、名前、その他ユーザーの詳細なデータを %1$s プロファイルページで編集できます。"],"Select a user...":["ユーザーを選択してください"],"Name:":["名前:"],"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":["このサイトの代表者としてユーザー%1$sを選択しました。ユーザープロファイル情報は検索結果に使用されます。%2$s情報が正しいことを確認するためにプロファイルを更新してください。%3$s"],"Error: Please select a user below to make your site's meta data complete.":["エラー: サイトのメタデータを完成させるには、以下でのユーザーを選択してください。"],"New step added":["新しいステップを追加しました"],"New question added":["新しい質問を追加しました"],"Did you know %s also analyzes the different word forms of your keyphrase, like plurals and past tenses?":[],"Help on choosing the perfect focus keyphrase":["完璧なフォーカスキーフレーズを選ぶには"],"Would you like to add a related keyphrase?":["類似キーフレーズを追加しますか ?"],"Go %s!":["%sへ移動"],"Rank better with synonyms & related keyphrases":["同義語と関連キーフレーズでのランク向上"],"Add related keyphrase":["関連キーフレーズを追加"],"Get %s":["%s を入手"],"Focus keyphrase":["フォーカスキーフレーズ"],"Learn more about the readability analysis":["可読性分析の詳細"],"Describe the duration of the instruction:":["説明の長さを記述します:"],"Optional. Customize how you want to describe the duration of the instruction":["任意。説明の長さの表示をカスタマイズしましょう。"],"%s, %s and %s":["%sと%s、%s"],"%s and %s":["%s, %s"],"%d minute":["%d分"],"%d hour":["%d時間"],"%d day":["%d日"],"Enter a step title":["ステップのタイトルを入力"],"Optional. This can give you better control over the styling of the steps.":["任意。ステップのスタイリングがより制御しやすくなります。"],"CSS class(es) to apply to the steps":["ステップに適用する CSS クラス"],"minutes":["分"],"hours":["時間"],"days":["日"],"Create a How-to guide in an SEO-friendly way. You can only use one How-to block per post.":["SEO フレンドリーな方法でハウツーガイドを作成しましょう。ハウツーブロックは投稿ごとにひとつのみ使用できます。"],"List your Frequently Asked Questions in an SEO-friendly way. You can only use one FAQ block per post.":["よくある質問と回答を SEO フレンドリーな方法でリスト化します。"],"Copy error":["エラー文をコピー"],"An error occurred loading the %s primary taxonomy picker.":["%s メインタクソノミー選択ツールの読み込み中にエラーが発生しました。"],"Time needed:":["所要時間:"],"Move question down":["質問を下へ移動"],"Move question up":["質問を上へ移動"],"Insert question":["質問の挿入"],"Delete question":["質問を削除"],"Enter the answer to the question":["質問の答えを入力してください"],"Enter a question":["質問を入力"],"Add question":["質問を追加"],"Frequently Asked Questions":["よくあるご質問"],"Great news: you can, with %s!":["朗報: %s で可能です !"],"Select the primary %s":["メイン%sを選択"],"Mark as cornerstone content":["コーナーストーンコンテンツとしてマーク"],"Move step down":["ステップを下へ移動"],"Move step up":["ステップを上へ移動"],"Insert step":["ステップを挿入"],"Delete step":["ステップを削除"],"Add image":["画像を追加"],"Enter a step description":["ステップの説明を入力"],"Enter a description":["ディスクリプションを入力"],"Unordered list":["箇条書きリスト"],"Showing step items as an ordered list.":["ステップ項目を順序付きリストとして表示します。"],"Showing step items as an unordered list":["ステップ項目を箇条書きリストとして表示します。"],"Add step":["ステップを追加"],"Delete total time":["合計時間を削除"],"Add total time":["合計時間を追加"],"How to":["ハウツー"],"How-to":["ハウツー"],"Analysis results":["解析結果"],"Enter a focus keyphrase to calculate the SEO score":["SEO スコアを計算するには、フォーカスするキーフレーズを入力します"],"Learn more about Cornerstone Content.":["コーナーストーンコンテンツについて詳しく知る"],"Cornerstone content should be the most important and extensive articles on your site.":["コーナーストーンコンテンツは、サイト上もっとも重要かつ広がりのある記事にしてください。"],"Add synonyms":["同義語の追加"],"Would you like to add keyphrase synonyms?":["類似キーフレーズを追加しますか ?"],"Current year":["今年"],"Page":["固定ページ"],"Tagline":["キャッチフレーズ"],"Modify your meta description by editing it right here":["メタディスクリプションの設定をここで編集して変更します"],"ID":["ID"],"Separator":["区切り"],"Search phrase":["検索フレーズ"],"Term description":["ターム説明"],"Tag description":["タグ説明"],"Category description":["カテゴリーの説明"],"Primary category":["メインカテゴリー"],"Category":["カテゴリー"],"Excerpt only":["抜粋のみ"],"Excerpt":["抜粋"],"Site title":["サイトタイトル"],"Parent title":["親タイトル"],"Date":["日付"],"24/7 email support":["年中無休のメールサポート"],"SEO analysis":["SEO 解析"],"Other benefits of %s for you:":["%s のその他の利点:"],"Cornerstone content":["コーナーストーンコンテンツ"],"Superfast internal linking suggestions":["すばやい内部リンクの提案"],"Great news: you can, with %1$s!":["朗報: %1$s で可能です !"],"1 year free support and updates included!":["1年間の無料更新とアップグレードを含みます。"],"%1$sSocial media preview%2$s: Facebook & Twitter":["%1$sソーシャルメディアのプレビュー%2$s: Facebook & Twitter"],"%1$sNo more dead links%2$s: easy redirect manager":["%1$sデッドリンクとは無縁に%2$s: かんたんリダイレクト管理"],"No ads!":["広告なし !"],"Please provide a meta description by editing the snippet below.":["以下のスニペットを編集し、メタディスクリプションを入力してください。"],"The name of the person":["人物の名前"],"Readability analysis":["可読性解析"],"Open":["開く"],"Title":["タイトル"],"Close":["閉じる"],"FAQ":["よくあるご質問"],"Settings":["設定"]}}}
1
+ {"domain":"wordpress-seo","locale_data":{"wordpress-seo":{"":{"domain":"wordpress-seo","plural-forms":"nplurals=1; plural=0;","lang":"ja_JP"},"Google preview":["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.":["「OK」をクリックすると HelpScout ビーコンを開きます。そこで質問に対する答えを検索できます。ビーコンはサポートデータをロードし、クッキーを設定する場合があります。"],"Schema":["スキーマ"],"Truly optimize your site for a local audience with our %s plugin! Optimized address details, opening hours, store locator and pickup option!":["%s プラグインを使ってあなたのサイトを地元のお客様のために最適化しましょう。住所の詳細、営業時間、店舗検索、ピックアップオプション。"],"Serving local customers?":["地域のお客様にサービスを提供していますか ?"],"Get the %s plugin now":["%s プラグインを今すぐ入手"],"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.":["メタデーター内のソーシャルプロフィール、名前、その他ユーザーの詳細なデータを %1$s プロファイルページで編集できます。"],"Select a user...":["ユーザーを選択してください"],"Name:":["名前:"],"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":["このサイトの代表者としてユーザー%1$sを選択しました。ユーザープロファイル情報は検索結果に使用されます。%2$s情報が正しいことを確認するためにプロファイルを更新してください。%3$s"],"Error: Please select a user below to make your site's meta data complete.":["エラー: サイトのメタデータを完成させるには、以下でのユーザーを選択してください。"],"New step added":["新しいステップを追加しました"],"New question added":["新しい質問を追加しました"],"Did you know %s also analyzes the different word forms of your keyphrase, like plurals and past tenses?":["%s はまた、複数形や過去形などキーフレーズの異なる語形を解析するとご存知ですか ?"],"Help on choosing the perfect focus keyphrase":["完璧なフォーカスキーフレーズを選ぶには"],"Would you like to add a related keyphrase?":["類似キーフレーズを追加しますか ?"],"Go %s!":["%sへ移動"],"Rank better with synonyms & related keyphrases":["同義語と関連キーフレーズでのランク向上"],"Add related keyphrase":["関連キーフレーズを追加"],"Get %s":["%s を入手"],"Focus keyphrase":["フォーカスキーフレーズ"],"Learn more about the readability analysis":["可読性分析の詳細"],"Describe the duration of the instruction:":["説明の長さを記述します:"],"Optional. Customize how you want to describe the duration of the instruction":["任意。説明の長さの表示をカスタマイズしましょう。"],"%s, %s and %s":["%sと%s、%s"],"%s and %s":["%s, %s"],"%d minute":["%d分"],"%d hour":["%d時間"],"%d day":["%d日"],"Enter a step title":["ステップのタイトルを入力"],"Optional. This can give you better control over the styling of the steps.":["任意。ステップのスタイリングがより制御しやすくなります。"],"CSS class(es) to apply to the steps":["ステップに適用する CSS クラス"],"minutes":["分"],"hours":["時間"],"days":["日"],"Create a How-to guide in an SEO-friendly way. You can only use one How-to block per post.":["SEO フレンドリーな方法でハウツーガイドを作成しましょう。ハウツーブロックは投稿ごとにひとつのみ使用できます。"],"List your Frequently Asked Questions in an SEO-friendly way. You can only use one FAQ block per post.":["よくある質問と回答を SEO フレンドリーな方法でリスト化します。"],"Copy error":["エラー文をコピー"],"An error occurred loading the %s primary taxonomy picker.":["%s メインタクソノミー選択ツールの読み込み中にエラーが発生しました。"],"Time needed:":["所要時間:"],"Move question down":["質問を下へ移動"],"Move question up":["質問を上へ移動"],"Insert question":["質問の挿入"],"Delete question":["質問を削除"],"Enter the answer to the question":["質問の答えを入力してください"],"Enter a question":["質問を入力"],"Add question":["質問を追加"],"Frequently Asked Questions":["よくあるご質問"],"Great news: you can, with %s!":["朗報: %s で可能です !"],"Select the primary %s":["メイン%sを選択"],"Mark as cornerstone content":["コーナーストーンコンテンツとしてマーク"],"Move step down":["ステップを下へ移動"],"Move step up":["ステップを上へ移動"],"Insert step":["ステップを挿入"],"Delete step":["ステップを削除"],"Add image":["画像を追加"],"Enter a step description":["ステップの説明を入力"],"Enter a description":["ディスクリプションを入力"],"Unordered list":["箇条書きリスト"],"Showing step items as an ordered list.":["ステップ項目を順序付きリストとして表示します。"],"Showing step items as an unordered list":["ステップ項目を箇条書きリストとして表示します。"],"Add step":["ステップを追加"],"Delete total time":["合計時間を削除"],"Add total time":["合計時間を追加"],"How to":["ハウツー"],"How-to":["ハウツー"],"Analysis results":["解析結果"],"Enter a focus keyphrase to calculate the SEO score":["SEO スコアを計算するには、フォーカスするキーフレーズを入力します"],"Learn more about Cornerstone Content.":["コーナーストーンコンテンツについて詳しく知る"],"Cornerstone content should be the most important and extensive articles on your site.":["コーナーストーンコンテンツは、サイト上もっとも重要かつ広がりのある記事にしてください。"],"Add synonyms":["同義語の追加"],"Would you like to add keyphrase synonyms?":["類似キーフレーズを追加しますか ?"],"Current year":["今年"],"Page":["固定ページ"],"Tagline":["キャッチフレーズ"],"Modify your meta description by editing it right here":["メタディスクリプションの設定をここで編集して変更します"],"ID":["ID"],"Separator":["区切り"],"Search phrase":["検索フレーズ"],"Term description":["ターム説明"],"Tag description":["タグ説明"],"Category description":["カテゴリーの説明"],"Primary category":["メインカテゴリー"],"Category":["カテゴリー"],"Excerpt only":["抜粋のみ"],"Excerpt":["抜粋"],"Site title":["サイトタイトル"],"Parent title":["親タイトル"],"Date":["日付"],"24/7 email support":["年中無休のメールサポート"],"SEO analysis":["SEO 解析"],"Other benefits of %s for you:":["%s のその他の利点:"],"Cornerstone content":["コーナーストーンコンテンツ"],"Superfast internal linking suggestions":["すばやい内部リンクの提案"],"Great news: you can, with %1$s!":["朗報: %1$s で可能です !"],"1 year free support and updates included!":["1年間の無料更新とアップグレードを含みます。"],"%1$sSocial media preview%2$s: Facebook & Twitter":["%1$sソーシャルメディアのプレビュー%2$s: Facebook & Twitter"],"%1$sNo more dead links%2$s: easy redirect manager":["%1$sデッドリンクとは無縁に%2$s: かんたんリダイレクト管理"],"No ads!":["広告なし !"],"Please provide a meta description by editing the snippet below.":["以下のスニペットを編集し、メタディスクリプションを入力してください。"],"The name of the person":["人物の名前"],"Readability analysis":["可読性解析"],"Open":["開く"],"Title":["タイトル"],"Close":["閉じる"],"FAQ":["よくあるご質問"],"Settings":["設定"]}}}
languages/yoast-components-ja.json CHANGED
@@ -1 +1 @@
1
- {"domain":"yoast-components","locale_data":{"yoast-components":{"":{"domain":"yoast-components","plural-forms":"nplurals=1; plural=0;","lang":"ja_JP"},"Preview as:":["プレビュー:"],"Mobile result":["モバイルの結果"],"Desktop result":["デスクトップの結果"],"Dismiss this alert":["この通知を非表示"],"The following words and word combinations occur the most in the content. These give an indication of what your content focuses on. If the words differ a lot from your topic, you might want to rewrite your content accordingly. ":["以下の単語と単語の組み合わせは、コンテンツの中で最も多く出てきます。これらは、コンテンツが何に焦点を当てているかを示しています。もし、単語がトピックと大きく異なる場合は、それに応じてコンテンツを書き換えた方がいいかもしれません。"],"Once you add a bit more copy, we'll give you a list of words that occur the most in the content. These give an indication of what your content focuses on.":[],"%d occurrences":["%d回"],"We could not find any relevant articles on your website that you could link to from your post.":["投稿からリンクできる関連記事をサイト内に見つけることができませんでした。"],"The image you selected is too small for Facebook":["Facebook 用に選択した画像が小さすぎます"],"The given image url cannot be loaded":["この画像の URL を読み込めません"],"This is a list of related content to which you could link in your post. {{a}}Read our article about site structure{{/a}} to learn more about how internal linking can help improve your SEO.":[],"Are you trying to use multiple keyphrases? You should add them separately below.":["複数のキーフレーズを使用したいですか ? 以下に個別に追加してください。"],"Mark as cornerstone content":["コーナーストーンコンテンツとしてマーク"],"image preview":["画像のプレビュー"],"Copied!":["コピーしました。"],"Not supported!":["サポート対象外です。"],"Read {{a}}our article about site structure{{/a}} to learn more about how internal linking can help improve your SEO.":["{{a}}サイト構造についての記事{{/a}}を読み、内部リンクが SEO を改善するしくみを学びましょう。"],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["文字をもう少し追加すると、記事内からリンクが可能な関連コンテンツがここにリスト表示されます。"],"Consider linking to these {{a}}cornerstone articles:{{/a}}":["以下の{{a}}コーナーストーン記事{{/a}}へのリンクを検討してください:"],"Consider linking to these articles:":["これらの記事へのリンクを検討してください:"],"Copy link":["リンクをコピー"],"Copy link to suggested article: %s":["提案記事へのリンクをコピー: %s"],"Read our %1$sultimate guide to keyword research%2$s to learn more about keyword research and keyword strategy.":[],"Once you add a bit more copy, we'll give you a list of words and word combinations that occur the most in the content. These give an indication of what your content focuses on.":[],"The following words occur the most in the content. These give an indication of what your content focuses on. If the words differ a lot from your topic, you might want to rewrite your content accordingly. ":[],"Prominent words":["有名な言葉"],"Something went wrong. Please reload the page.":["何かおかしいようです。ページをリロードしてください。"],"Modify your meta description by editing it right here":["メタディスクリプションの設定をここで編集して変更します"],"Url preview":["URL のプレビュー:"],"Please provide a meta description by editing the snippet below. If you don’t, Google will try to find a relevant part of your post to show in the search results.":["以下のスニペットを編集して、メタディスクリプションを設定してください。設定しない場合、Google の検索結果で投稿の関連部分が表示されます。"],"Insert snippet variable":["スニペット変数の挿入"],"Dismiss this notice":["通知を非表示"],"No results":["結果なし"],"%d result found, use up and down arrow keys to navigate":["%d件見つかりました、上下の矢印キーを使用して移動します。"],"Your site language is set to %s. If this is not correct, contact your site administrator.":["サイトの言語が %s に設定されています。これが正しくない場合は、サイト管理者に問い合わせてください。"],"On":["オン"],"Off":["オフ"],"Good results":["良い結果"],"Remove highlight from the text":["テキストからハイライトを削除"],"Your site language is set to %s. ":["あなたのサイト言語は%sに設定されています。"],"Highlight this result in the text":["この結果をテキストで強調表示"],"Considerations":["検討事項"],"Errors":["エラー"],"Change language":["言語変更"],"(Opens in a new browser tab)":["(新しいブラウザータブで開く)"],"Scroll to see the preview content.":["コンテンツのプレビューを見るにはスクロールしてください。"],"Step %1$d: %2$s":["手順%1$d: %2$s"],"Close snippet editor":["スニペットエディターを閉じる"],"Slug":["スラッグ"],"Marks are disabled in current view":["現在のビューでマークが無効になっています"],"Choose an image":["画像を選択する"],"Remove the image":["画像を削除する"],"MailChimp signup failed:":["MailChimp の登録に失敗しました:"],"Sign Up!":["登録"],"Edit snippet":["スニペットを編集"],"SEO title preview":["SEO タイトルのプレビュー:"],"Meta description preview":["メタディスクリプションのプレビュー: "],"A problem occurred when saving the current step, {{link}}please file a bug report{{/link}} describing what step you are on and which changes you want to make (if any).":["現在のステップを保存する際に問題が発生しました。どのステップにいたのかと、何を変更したいのか (もしあれば) を添えて、{{link}}バグ報告を提出してください{{/link}}。"],"Close the Wizard":["ウィザードを閉じる"],"%s installation wizard":["%s インストールウィザード"],"SEO title":["SEO タイトル"],"Improvements":["改善"],"Problems":["問題点"],"Email":["メール"],"Previous":["前へ"],"Next":["次へ"],"Close":["閉じる"],"Meta description":["メタディスクリプション"]}}}
1
+ {"domain":"yoast-components","locale_data":{"yoast-components":{"":{"domain":"yoast-components","plural-forms":"nplurals=1; plural=0;","lang":"ja_JP"},"Preview as:":["プレビュー:"],"Mobile result":["モバイルの結果"],"Desktop result":["デスクトップの結果"],"Dismiss this alert":["この通知を非表示"],"The following words and word combinations occur the most in the content. These give an indication of what your content focuses on. If the words differ a lot from your topic, you might want to rewrite your content accordingly. ":["以下の単語と単語の組み合わせは、コンテンツの中で最も多く出てきます。これらは、コンテンツが何に焦点を当てているかを示しています。もし、単語がトピックと大きく異なる場合は、それに応じてコンテンツを書き換えた方がいいかもしれません。"],"Once you add a bit more copy, we'll give you a list of words that occur the most in the content. These give an indication of what your content focuses on.":["あともう少しコピーを追加すれば、コンテンツ内で頻出する言葉のリストを作成できます。このリストによりコンテンツは何にフォーカスしているかを示すことができます。"],"%d occurrences":["%d回"],"We could not find any relevant articles on your website that you could link to from your post.":["投稿からリンクできる関連記事をサイト内に見つけることができませんでした。"],"The image you selected is too small for Facebook":["Facebook 用に選択した画像が小さすぎます"],"The given image url cannot be loaded":["この画像の URL を読み込めません"],"This is a list of related content to which you could link in your post. {{a}}Read our article about site structure{{/a}} to learn more about how internal linking can help improve your SEO.":["以下は投稿からリンク可能な関連するコンテンツのリストです。内部リンクがどのように SEO を向上するかについては{{a}}サイト構造に関する私たちの記事を一読ください{{/a}}。"],"Are you trying to use multiple keyphrases? You should add them separately below.":["複数のキーフレーズを使用したいですか ? 以下に個別に追加してください。"],"Mark as cornerstone content":["コーナーストーンコンテンツとしてマーク"],"image preview":["画像のプレビュー"],"Copied!":["コピーしました。"],"Not supported!":["サポート対象外です。"],"Read {{a}}our article about site structure{{/a}} to learn more about how internal linking can help improve your SEO.":["{{a}}サイト構造についての記事{{/a}}を読み、内部リンクが SEO を改善するしくみを学びましょう。"],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["文字をもう少し追加すると、記事内からリンクが可能な関連コンテンツがここにリスト表示されます。"],"Consider linking to these {{a}}cornerstone articles:{{/a}}":["以下の{{a}}コーナーストーン記事{{/a}}へのリンクを検討してください:"],"Consider linking to these articles:":["これらの記事へのリンクを検討してください:"],"Copy link":["リンクをコピー"],"Copy link to suggested article: %s":["提案記事へのリンクをコピー: %s"],"Read our %1$sultimate guide to keyword research%2$s to learn more about keyword research and keyword strategy.":[],"Once you add a bit more copy, we'll give you a list of words and word combinations that occur the most in the content. These give an indication of what your content focuses on.":["もう少しコピーを追加したら、コンテンツの中で最も多く発生する単語と単語の組み合わせのリストを提供します。これらはあなたの内容が焦点を当てるものを示す。"],"The following words occur the most in the content. These give an indication of what your content focuses on. If the words differ a lot from your topic, you might want to rewrite your content accordingly. ":["次の単語と単語の組み合わせは、コンテンツの中で最も多く発生します。これらはあなたの内容が焦点を当てるものを示す。単語がトピックと異なる場合は、それに応じてコンテンツを書き換える必要があります。"],"Prominent words":["有名な言葉"],"Something went wrong. Please reload the page.":["何かおかしいようです。ページをリロードしてください。"],"Modify your meta description by editing it right here":["メタディスクリプションの設定をここで編集して変更します"],"Url preview":["URL のプレビュー:"],"Please provide a meta description by editing the snippet below. If you don’t, Google will try to find a relevant part of your post to show in the search results.":["以下のスニペットを編集して、メタディスクリプションを設定してください。設定しない場合、Google の検索結果で投稿の関連部分が表示されます。"],"Insert snippet variable":["スニペット変数の挿入"],"Dismiss this notice":["通知を非表示"],"No results":["結果なし"],"%d result found, use up and down arrow keys to navigate":["%d件見つかりました、上下の矢印キーを使用して移動します。"],"Your site language is set to %s. If this is not correct, contact your site administrator.":["サイトの言語が %s に設定されています。これが正しくない場合は、サイト管理者に問い合わせてください。"],"On":["オン"],"Off":["オフ"],"Good results":["良い結果"],"Remove highlight from the text":["テキストからハイライトを削除"],"Your site language is set to %s. ":["あなたのサイト言語は%sに設定されています。"],"Highlight this result in the text":["この結果をテキストで強調表示"],"Considerations":["検討事項"],"Errors":["エラー"],"Change language":["言語変更"],"(Opens in a new browser tab)":["(新しいブラウザータブで開く)"],"Scroll to see the preview content.":["コンテンツのプレビューを見るにはスクロールしてください。"],"Step %1$d: %2$s":["手順%1$d: %2$s"],"Close snippet editor":["スニペットエディターを閉じる"],"Slug":["スラッグ"],"Marks are disabled in current view":["現在のビューでマークが無効になっています"],"Choose an image":["画像を選択する"],"Remove the image":["画像を削除する"],"MailChimp signup failed:":["MailChimp の登録に失敗しました:"],"Sign Up!":["登録"],"Edit snippet":["スニペットを編集"],"SEO title preview":["SEO タイトルのプレビュー:"],"Meta description preview":["メタディスクリプションのプレビュー: "],"A problem occurred when saving the current step, {{link}}please file a bug report{{/link}} describing what step you are on and which changes you want to make (if any).":["現在のステップを保存する際に問題が発生しました。どのステップにいたのかと、何を変更したいのか (もしあれば) を添えて、{{link}}バグ報告を提出してください{{/link}}。"],"Close the Wizard":["ウィザードを閉じる"],"%s installation wizard":["%s インストールウィザード"],"SEO title":["SEO タイトル"],"Improvements":["改善"],"Problems":["問題点"],"Email":["メール"],"Previous":["前へ"],"Next":["次へ"],"Close":["閉じる"],"Meta description":["メタディスクリプション"]}}}
lib/orm.php CHANGED
@@ -264,6 +264,9 @@ class ORM implements \ArrayAccess {
264
  */
265
  global $wpdb;
266
 
 
 
 
267
  $query = $wpdb->prepare( $query, $parameters );
268
 
269
  return $wpdb->query( $query );
@@ -1098,7 +1101,7 @@ class ORM implements \ArrayAccess {
1098
  $key = "{$table}.{$key}";
1099
  }
1100
  $key = $result->_quote_identifier( $key );
1101
- $placeholder = '%s';
1102
  $result = $result->_add_condition( $type, "{$key} {$separator} {$placeholder}", $val );
1103
  }
1104
 
@@ -1121,7 +1124,7 @@ class ORM implements \ArrayAccess {
1121
  if ( \array_key_exists( $key, $this->_expr_fields ) ) {
1122
  $db_fields[] = $value;
1123
  } else {
1124
- $db_fields[] = '%s';
1125
  }
1126
  }
1127
 
@@ -1260,7 +1263,7 @@ class ORM implements \ArrayAccess {
1260
  }
1261
  $query[] = $this->_quote_identifier( $key );
1262
  $data[] = $item;
1263
- $query[] = $op . '%s';
1264
  }
1265
  }
1266
  $query[] = '))';
@@ -2209,7 +2212,7 @@ class ORM implements \ArrayAccess {
2209
  $field_list = [];
2210
  foreach ( $this->_dirty_fields as $key => $value ) {
2211
  if ( ! \array_key_exists( $key, $this->_expr_fields ) ) {
2212
- $value = '%s';
2213
  }
2214
  $field_list[] = "{$this->_quote_identifier($key)} = {$value}";
2215
  }
264
  */
265
  global $wpdb;
266
 
267
+ $parameters = \array_filter( $parameters, function ( $parameter ) {
268
+ return $parameter !== null;
269
+ } );
270
  $query = $wpdb->prepare( $query, $parameters );
271
 
272
  return $wpdb->query( $query );
1101
  $key = "{$table}.{$key}";
1102
  }
1103
  $key = $result->_quote_identifier( $key );
1104
+ $placeholder = ( $val === null ) ? 'NULL' : '%s';
1105
  $result = $result->_add_condition( $type, "{$key} {$separator} {$placeholder}", $val );
1106
  }
1107
 
1124
  if ( \array_key_exists( $key, $this->_expr_fields ) ) {
1125
  $db_fields[] = $value;
1126
  } else {
1127
+ $db_fields[] = ( $value === null ) ? 'NULL' : '%s';
1128
  }
1129
  }
1130
 
1263
  }
1264
  $query[] = $this->_quote_identifier( $key );
1265
  $data[] = $item;
1266
+ $query[] = $op . ( ( $item === null ) ? 'NULL' : '%s' );
1267
  }
1268
  }
1269
  $query[] = '))';
2212
  $field_list = [];
2213
  foreach ( $this->_dirty_fields as $key => $value ) {
2214
  if ( ! \array_key_exists( $key, $this->_expr_fields ) ) {
2215
+ $value = ( $value === NULL ) ? 'NULL' : '%s';
2216
  }
2217
  $field_list[] = "{$this->_quote_identifier($key)} = {$value}";
2218
  }
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.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,6 +209,13 @@ Your question has most likely been answered on our knowledge base: [kb.yoast.com
209
 
210
  == Changelog ==
211
 
 
 
 
 
 
 
 
212
  = 14.0.3 =
213
  Release Date: April 30th, 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.4
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.4 =
213
+ Release Date: April 30th, 2020
214
+
215
+ Bugfixes:
216
+
217
+ * Fixes a bug where robots meta values defaulted to 0 instead of null because of a [bug in WPDB](https://core.trac.wordpress.org/ticket/12819). This could result in incorrect values for `noindex`, `nofollow` , `noarchive`, `noimageindex` and/or `nosnippet`. In order to purge the wrong data, we need to truncate our tables again. This means you will have to go through the indexing process again. We’re very sorry. For sites with more than 10,000 posts, we advise using the [WP CLI command to do the indexation on the server](https://yoa.st/wp-cli-index).
218
+
219
  = 14.0.3 =
220
  Release Date: April 30th, 2020
221
 
src/config/migrations/20200430150130_ClearIndexableTables.php ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ * ClearIndexableTables
13
+ */
14
+ class ClearIndexableTables extends Ruckusing_Migration_Base {
15
+
16
+ /**
17
+ * Migration up.
18
+ */
19
+ public function up() {
20
+ $this->query( 'TRUNCATE TABLE ' . $this->get_indexable_table_name() );
21
+ $this->query( 'TRUNCATE TABLE ' . $this->get_indexable_hierarchy_table_name() );
22
+ }
23
+
24
+ /**
25
+ * Migration down.
26
+ */
27
+ public function down() {
28
+ // Nothing to do.
29
+ }
30
+
31
+ /**
32
+ * Retrieves the table name to use for storing indexables.
33
+ *
34
+ * @return string The table name to use.
35
+ */
36
+ protected function get_indexable_table_name() {
37
+ return Model::get_table_name( 'Indexable' );
38
+ }
39
+
40
+ /**
41
+ * Retrieves the table name to use.
42
+ *
43
+ * @return string The table name to use.
44
+ */
45
+ protected function get_indexable_hierarchy_table_name() {
46
+ return Model::get_table_name( 'Indexable_Hierarchy' );
47
+ }
48
+ }
vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInitd68966ec94af8b28648b9ed9a98a08f0::getLoader();
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInite8045e5427b38f7e74d01a423dc8fd66::getLoader();
vendor/composer/ClassLoader.php CHANGED
@@ -279,7 +279,7 @@ class ClassLoader
279
  */
280
  public function setApcuPrefix($apcuPrefix)
281
  {
282
- $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null;
283
  }
284
 
285
  /**
@@ -377,11 +377,11 @@ class ClassLoader
377
  $subPath = $class;
378
  while (false !== $lastPos = strrpos($subPath, '\\')) {
379
  $subPath = substr($subPath, 0, $lastPos);
380
- $search = $subPath.'\\';
381
  if (isset($this->prefixDirsPsr4[$search])) {
 
382
  foreach ($this->prefixDirsPsr4[$search] as $dir) {
383
- $length = $this->prefixLengthsPsr4[$first][$search];
384
- if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
385
  return $file;
386
  }
387
  }
279
  */
280
  public function setApcuPrefix($apcuPrefix)
281
  {
282
+ $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
283
  }
284
 
285
  /**
377
  $subPath = $class;
378
  while (false !== $lastPos = strrpos($subPath, '\\')) {
379
  $subPath = substr($subPath, 0, $lastPos);
380
+ $search = $subPath . '\\';
381
  if (isset($this->prefixDirsPsr4[$search])) {
382
+ $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
383
  foreach ($this->prefixDirsPsr4[$search] as $dir) {
384
+ if (file_exists($file = $dir . $pathEnd)) {
 
385
  return $file;
386
  }
387
  }
vendor/composer/autoload_classmap.php CHANGED
@@ -10,6 +10,7 @@ return array(
10
  'AddColumnsToIndexables' => $baseDir . '/src/config/migrations/20200420073606_AddColumnsToIndexables.php',
11
  'AddIndexableObjectIdAndTypeIndex' => $baseDir . '/src/config/migrations/20200430075614_AddIndexableObjectIdAndTypeIndex.php',
12
  'BreadcrumbTitleAndHierarchyReset' => $baseDir . '/src/config/migrations/20200428123747_BreadcrumbTitleAndHierarchyReset.php',
 
13
  'Composer\\Installers\\AglInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AglInstaller.php',
14
  'Composer\\Installers\\AimeosInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AimeosInstaller.php',
15
  'Composer\\Installers\\AnnotateCmsInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php',
@@ -540,6 +541,10 @@ return array(
540
  'YoastSEO_Vendor\\GuzzleHttp\\RetryMiddleware' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/RetryMiddleware.php',
541
  'YoastSEO_Vendor\\GuzzleHttp\\TransferStats' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/TransferStats.php',
542
  'YoastSEO_Vendor\\GuzzleHttp\\UriTemplate' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/UriTemplate.php',
 
 
 
 
543
  'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\AbstractGrant' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Grant/AbstractGrant.php',
544
  'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\AuthorizationCode' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Grant/AuthorizationCode.php',
545
  'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\ClientCredentials' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Grant/ClientCredentials.php',
@@ -566,6 +571,7 @@ return array(
566
  'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\QueryBuilderTrait' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Tool/QueryBuilderTrait.php',
567
  'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\RequestFactory' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Tool/RequestFactory.php',
568
  'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\RequiredParameterTrait' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Tool/RequiredParameterTrait.php',
 
569
  'YoastSEO_Vendor\\Psr\\Container\\ContainerExceptionInterface' => $baseDir . '/vendor_prefixed/psr/container/src/ContainerExceptionInterface.php',
570
  'YoastSEO_Vendor\\Psr\\Container\\ContainerInterface' => $baseDir . '/vendor_prefixed/psr/container/src/ContainerInterface.php',
571
  'YoastSEO_Vendor\\Psr\\Container\\NotFoundExceptionInterface' => $baseDir . '/vendor_prefixed/psr/container/src/NotFoundExceptionInterface.php',
10
  'AddColumnsToIndexables' => $baseDir . '/src/config/migrations/20200420073606_AddColumnsToIndexables.php',
11
  'AddIndexableObjectIdAndTypeIndex' => $baseDir . '/src/config/migrations/20200430075614_AddIndexableObjectIdAndTypeIndex.php',
12
  'BreadcrumbTitleAndHierarchyReset' => $baseDir . '/src/config/migrations/20200428123747_BreadcrumbTitleAndHierarchyReset.php',
13
+ 'ClearIndexableTables' => $baseDir . '/src/config/migrations/20200430150130_ClearIndexableTables.php',
14
  'Composer\\Installers\\AglInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AglInstaller.php',
15
  'Composer\\Installers\\AimeosInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AimeosInstaller.php',
16
  'Composer\\Installers\\AnnotateCmsInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php',
541
  'YoastSEO_Vendor\\GuzzleHttp\\RetryMiddleware' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/RetryMiddleware.php',
542
  'YoastSEO_Vendor\\GuzzleHttp\\TransferStats' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/TransferStats.php',
543
  'YoastSEO_Vendor\\GuzzleHttp\\UriTemplate' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/UriTemplate.php',
544
+ 'YoastSEO_Vendor\\IdiormMethodMissingException' => $baseDir . '/vendor_prefixed/j4mie/idiorm/idiorm.php',
545
+ 'YoastSEO_Vendor\\IdiormResultSet' => $baseDir . '/vendor_prefixed/j4mie/idiorm/idiorm.php',
546
+ 'YoastSEO_Vendor\\IdiormString' => $baseDir . '/vendor_prefixed/j4mie/idiorm/idiorm.php',
547
+ 'YoastSEO_Vendor\\IdiormStringException' => $baseDir . '/vendor_prefixed/j4mie/idiorm/idiorm.php',
548
  'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\AbstractGrant' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Grant/AbstractGrant.php',
549
  'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\AuthorizationCode' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Grant/AuthorizationCode.php',
550
  'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\ClientCredentials' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Grant/ClientCredentials.php',
571
  'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\QueryBuilderTrait' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Tool/QueryBuilderTrait.php',
572
  'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\RequestFactory' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Tool/RequestFactory.php',
573
  'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\RequiredParameterTrait' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Tool/RequiredParameterTrait.php',
574
+ 'YoastSEO_Vendor\\ORM' => $baseDir . '/vendor_prefixed/j4mie/idiorm/idiorm.php',
575
  'YoastSEO_Vendor\\Psr\\Container\\ContainerExceptionInterface' => $baseDir . '/vendor_prefixed/psr/container/src/ContainerExceptionInterface.php',
576
  'YoastSEO_Vendor\\Psr\\Container\\ContainerInterface' => $baseDir . '/vendor_prefixed/psr/container/src/ContainerInterface.php',
577
  'YoastSEO_Vendor\\Psr\\Container\\NotFoundExceptionInterface' => $baseDir . '/vendor_prefixed/psr/container/src/NotFoundExceptionInterface.php',
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInitd68966ec94af8b28648b9ed9a98a08f0
6
  {
7
  private static $loader;
8
 
@@ -13,21 +13,24 @@ class ComposerAutoloaderInitd68966ec94af8b28648b9ed9a98a08f0
13
  }
14
  }
15
 
 
 
 
16
  public static function getLoader()
17
  {
18
  if (null !== self::$loader) {
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInitd68966ec94af8b28648b9ed9a98a08f0', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInitd68966ec94af8b28648b9ed9a98a08f0', 'loadClassLoader'));
25
 
26
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
  if ($useStaticLoader) {
28
  require_once __DIR__ . '/autoload_static.php';
29
 
30
- call_user_func(\Composer\Autoload\ComposerStaticInitd68966ec94af8b28648b9ed9a98a08f0::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInite8045e5427b38f7e74d01a423dc8fd66
6
  {
7
  private static $loader;
8
 
13
  }
14
  }
15
 
16
+ /**
17
+ * @return \Composer\Autoload\ClassLoader
18
+ */
19
  public static function getLoader()
20
  {
21
  if (null !== self::$loader) {
22
  return self::$loader;
23
  }
24
 
25
+ spl_autoload_register(array('ComposerAutoloaderInite8045e5427b38f7e74d01a423dc8fd66', 'loadClassLoader'), true, true);
26
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
27
+ spl_autoload_unregister(array('ComposerAutoloaderInite8045e5427b38f7e74d01a423dc8fd66', 'loadClassLoader'));
28
 
29
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
30
  if ($useStaticLoader) {
31
  require_once __DIR__ . '/autoload_static.php';
32
 
33
+ call_user_func(\Composer\Autoload\ComposerStaticInite8045e5427b38f7e74d01a423dc8fd66::getInitializer($loader));
34
  } else {
35
  $map = require __DIR__ . '/autoload_namespaces.php';
36
  foreach ($map as $namespace => $path) {
vendor/composer/autoload_static.php CHANGED
@@ -4,7 +4,7 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInitd68966ec94af8b28648b9ed9a98a08f0
8
  {
9
  public static $prefixLengthsPsr4 = array (
10
  'C' =>
@@ -25,6 +25,7 @@ class ComposerStaticInitd68966ec94af8b28648b9ed9a98a08f0
25
  'AddColumnsToIndexables' => __DIR__ . '/../..' . '/src/config/migrations/20200420073606_AddColumnsToIndexables.php',
26
  'AddIndexableObjectIdAndTypeIndex' => __DIR__ . '/../..' . '/src/config/migrations/20200430075614_AddIndexableObjectIdAndTypeIndex.php',
27
  'BreadcrumbTitleAndHierarchyReset' => __DIR__ . '/../..' . '/src/config/migrations/20200428123747_BreadcrumbTitleAndHierarchyReset.php',
 
28
  'Composer\\Installers\\AglInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AglInstaller.php',
29
  'Composer\\Installers\\AimeosInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AimeosInstaller.php',
30
  'Composer\\Installers\\AnnotateCmsInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php',
@@ -555,6 +556,10 @@ class ComposerStaticInitd68966ec94af8b28648b9ed9a98a08f0
555
  'YoastSEO_Vendor\\GuzzleHttp\\RetryMiddleware' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/RetryMiddleware.php',
556
  'YoastSEO_Vendor\\GuzzleHttp\\TransferStats' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/TransferStats.php',
557
  'YoastSEO_Vendor\\GuzzleHttp\\UriTemplate' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/UriTemplate.php',
 
 
 
 
558
  'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\AbstractGrant' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Grant/AbstractGrant.php',
559
  'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\AuthorizationCode' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Grant/AuthorizationCode.php',
560
  'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\ClientCredentials' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Grant/ClientCredentials.php',
@@ -581,6 +586,7 @@ class ComposerStaticInitd68966ec94af8b28648b9ed9a98a08f0
581
  'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\QueryBuilderTrait' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Tool/QueryBuilderTrait.php',
582
  'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\RequestFactory' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Tool/RequestFactory.php',
583
  'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\RequiredParameterTrait' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Tool/RequiredParameterTrait.php',
 
584
  'YoastSEO_Vendor\\Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/container/src/ContainerExceptionInterface.php',
585
  'YoastSEO_Vendor\\Psr\\Container\\ContainerInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/container/src/ContainerInterface.php',
586
  'YoastSEO_Vendor\\Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/container/src/NotFoundExceptionInterface.php',
@@ -892,9 +898,9 @@ class ComposerStaticInitd68966ec94af8b28648b9ed9a98a08f0
892
  public static function getInitializer(ClassLoader $loader)
893
  {
894
  return \Closure::bind(function () use ($loader) {
895
- $loader->prefixLengthsPsr4 = ComposerStaticInitd68966ec94af8b28648b9ed9a98a08f0::$prefixLengthsPsr4;
896
- $loader->prefixDirsPsr4 = ComposerStaticInitd68966ec94af8b28648b9ed9a98a08f0::$prefixDirsPsr4;
897
- $loader->classMap = ComposerStaticInitd68966ec94af8b28648b9ed9a98a08f0::$classMap;
898
 
899
  }, null, ClassLoader::class);
900
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInite8045e5427b38f7e74d01a423dc8fd66
8
  {
9
  public static $prefixLengthsPsr4 = array (
10
  'C' =>
25
  'AddColumnsToIndexables' => __DIR__ . '/../..' . '/src/config/migrations/20200420073606_AddColumnsToIndexables.php',
26
  'AddIndexableObjectIdAndTypeIndex' => __DIR__ . '/../..' . '/src/config/migrations/20200430075614_AddIndexableObjectIdAndTypeIndex.php',
27
  'BreadcrumbTitleAndHierarchyReset' => __DIR__ . '/../..' . '/src/config/migrations/20200428123747_BreadcrumbTitleAndHierarchyReset.php',
28
+ 'ClearIndexableTables' => __DIR__ . '/../..' . '/src/config/migrations/20200430150130_ClearIndexableTables.php',
29
  'Composer\\Installers\\AglInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AglInstaller.php',
30
  'Composer\\Installers\\AimeosInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AimeosInstaller.php',
31
  'Composer\\Installers\\AnnotateCmsInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php',
556
  'YoastSEO_Vendor\\GuzzleHttp\\RetryMiddleware' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/RetryMiddleware.php',
557
  'YoastSEO_Vendor\\GuzzleHttp\\TransferStats' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/TransferStats.php',
558
  'YoastSEO_Vendor\\GuzzleHttp\\UriTemplate' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/UriTemplate.php',
559
+ 'YoastSEO_Vendor\\IdiormMethodMissingException' => __DIR__ . '/../..' . '/vendor_prefixed/j4mie/idiorm/idiorm.php',
560
+ 'YoastSEO_Vendor\\IdiormResultSet' => __DIR__ . '/../..' . '/vendor_prefixed/j4mie/idiorm/idiorm.php',
561
+ 'YoastSEO_Vendor\\IdiormString' => __DIR__ . '/../..' . '/vendor_prefixed/j4mie/idiorm/idiorm.php',
562
+ 'YoastSEO_Vendor\\IdiormStringException' => __DIR__ . '/../..' . '/vendor_prefixed/j4mie/idiorm/idiorm.php',
563
  'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\AbstractGrant' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Grant/AbstractGrant.php',
564
  'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\AuthorizationCode' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Grant/AuthorizationCode.php',
565
  'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\ClientCredentials' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Grant/ClientCredentials.php',
586
  'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\QueryBuilderTrait' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Tool/QueryBuilderTrait.php',
587
  'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\RequestFactory' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Tool/RequestFactory.php',
588
  'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\RequiredParameterTrait' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Tool/RequiredParameterTrait.php',
589
+ 'YoastSEO_Vendor\\ORM' => __DIR__ . '/../..' . '/vendor_prefixed/j4mie/idiorm/idiorm.php',
590
  'YoastSEO_Vendor\\Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/container/src/ContainerExceptionInterface.php',
591
  'YoastSEO_Vendor\\Psr\\Container\\ContainerInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/container/src/ContainerInterface.php',
592
  'YoastSEO_Vendor\\Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/container/src/NotFoundExceptionInterface.php',
898
  public static function getInitializer(ClassLoader $loader)
899
  {
900
  return \Closure::bind(function () use ($loader) {
901
+ $loader->prefixLengthsPsr4 = ComposerStaticInite8045e5427b38f7e74d01a423dc8fd66::$prefixLengthsPsr4;
902
+ $loader->prefixDirsPsr4 = ComposerStaticInite8045e5427b38f7e74d01a423dc8fd66::$prefixDirsPsr4;
903
+ $loader->classMap = ComposerStaticInite8045e5427b38f7e74d01a423dc8fd66::$classMap;
904
 
905
  }, null, ClassLoader::class);
906
  }
vendor_prefixed/j4mie/idiorm/idiorm.php ADDED
@@ -0,0 +1,2415 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace YoastSEO_Vendor;
4
+
5
+ /**
6
+ *
7
+ * Idiorm
8
+ *
9
+ * http://github.com/j4mie/idiorm/
10
+ *
11
+ * A single-class super-simple database abstraction layer for PHP.
12
+ * Provides (nearly) zero-configuration object-relational mapping
13
+ * and a fluent interface for building basic, commonly-used queries.
14
+ *
15
+ * BSD Licensed.
16
+ *
17
+ * Copyright (c) 2010, Jamie Matthews
18
+ * All rights reserved.
19
+ *
20
+ * Redistribution and use in source and binary forms, with or without
21
+ * modification, are permitted provided that the following conditions are met:
22
+ *
23
+ * * Redistributions of source code must retain the above copyright notice, this
24
+ * list of conditions and the following disclaimer.
25
+ *
26
+ * * Redistributions in binary form must reproduce the above copyright notice,
27
+ * this list of conditions and the following disclaimer in the documentation
28
+ * and/or other materials provided with the distribution.
29
+ *
30
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
31
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
32
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
33
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
34
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
35
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
36
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
37
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
38
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
39
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
40
+ *
41
+ *
42
+ * The methods documented below are magic methods that conform to PSR-1.
43
+ * This documentation exposes these methods to doc generators and IDEs.
44
+ * @see http://www.php-fig.org/psr/psr-1/
45
+ *
46
+ * @method static array|string getConfig($key = null, $connection_name = self::DEFAULT_CONNECTION)
47
+ * @method static null resetConfig()
48
+ * @method static \ORM forTable($table_name, $connection_name = self::DEFAULT_CONNECTION)
49
+ * @method static null setDb($db, $connection_name = self::DEFAULT_CONNECTION)
50
+ * @method static null resetDb()
51
+ * @method static null setupLimitClauseStyle($connection_name)
52
+ * @method static \PDO getDb($connection_name = self::DEFAULT_CONNECTION)
53
+ * @method static bool rawExecute($query, $parameters = array())
54
+ * @method static \PDOStatement getLastStatement()
55
+ * @method static string getLastQuery($connection_name = null)
56
+ * @method static array getQueryLog($connection_name = self::DEFAULT_CONNECTION)
57
+ * @method array getConnectionNames()
58
+ * @method $this useIdColumn($id_column)
59
+ * @method \ORM|bool findOne($id=null)
60
+ * @method array|\IdiormResultSet findMany()
61
+ * @method \IdiormResultSet findResultSet()
62
+ * @method array findArray()
63
+ * @method $this forceAllDirty()
64
+ * @method $this rawQuery($query, $parameters = array())
65
+ * @method $this tableAlias($alias)
66
+ * @method int countNullIdColumns()
67
+ * @method $this selectExpr($expr, $alias=null)
68
+ * @method \ORM selectMany($values)
69
+ * @method \ORM selectManyExpr($values)
70
+ * @method $this rawJoin($table, $constraint, $table_alias, $parameters = array())
71
+ * @method $this innerJoin($table, $constraint, $table_alias=null)
72
+ * @method $this leftOuterJoin($table, $constraint, $table_alias=null)
73
+ * @method $this rightOuterJoin($table, $constraint, $table_alias=null)
74
+ * @method $this fullOuterJoin($table, $constraint, $table_alias=null)
75
+ * @method $this whereEqual($column_name, $value=null)
76
+ * @method $this whereNotEqual($column_name, $value=null)
77
+ * @method $this whereIdIs($id)
78
+ * @method $this whereAnyIs($values, $operator='=')
79
+ * @method array|string whereIdIn($ids)
80
+ * @method $this whereLike($column_name, $value=null)
81
+ * @method $this whereNotLike($column_name, $value=null)
82
+ * @method $this whereGt($column_name, $value=null)
83
+ * @method $this whereLt($column_name, $value=null)
84
+ * @method $this whereGte($column_name, $value=null)
85
+ * @method $this whereLte($column_name, $value=null)
86
+ * @method $this whereIn($column_name, $values)
87
+ * @method $this whereNotIn($column_name, $values)
88
+ * @method $this whereNull($column_name)
89
+ * @method $this whereNotNull($column_name)
90
+ * @method $this whereRaw($clause, $parameters=array())
91
+ * @method $this orderByDesc($column_name)
92
+ * @method $this orderByAsc($column_name)
93
+ * @method $this orderByExpr($clause)
94
+ * @method $this groupBy($column_name)
95
+ * @method $this groupByExpr($expr)
96
+ * @method $this havingEqual($column_name, $value=null)
97
+ * @method $this havingNotEqual($column_name, $value=null)
98
+ * @method $this havingIdIs($id)
99
+ * @method $this havingLike($column_name, $value=null)
100
+ * @method $this havingNotLike($column_name, $value=null)
101
+ * @method $this havingGt($column_name, $value=null)
102
+ * @method $this havingLt($column_name, $value=null)
103
+ * @method $this havingGte($column_name, $value=null)
104
+ * @method $this havingLte($column_name, $value=null)
105
+ * @method $this havingIn($column_name, $values=null)
106
+ * @method $this havingNotIn($column_name, $values=null)
107
+ * @method $this havingNull($column_name)
108
+ * @method $this havingNotNull($column_name)
109
+ * @method $this havingRaw($clause, $parameters=array())
110
+ * @method static this clearCache($table_name = null, $connection_name = self::DEFAULT_CONNECTION)
111
+ * @method array asArray()
112
+ * @method bool setExpr($key, $value = null)
113
+ * @method bool isDirty($key)
114
+ * @method bool isNew()
115
+ */
116
+ class ORM implements \ArrayAccess
117
+ {
118
+ // ----------------------- //
119
+ // --- CLASS CONSTANTS --- //
120
+ // ----------------------- //
121
+ // WHERE and HAVING condition array keys
122
+ const CONDITION_FRAGMENT = 0;
123
+ const CONDITION_VALUES = 1;
124
+ const DEFAULT_CONNECTION = 'default';
125
+ // Limit clause style
126
+ const LIMIT_STYLE_TOP_N = "top";
127
+ const LIMIT_STYLE_LIMIT = "limit";
128
+ // ------------------------ //
129
+ // --- CLASS PROPERTIES --- //
130
+ // ------------------------ //
131
+ // Class configuration
132
+ protected static $_default_config = array(
133
+ 'connection_string' => 'sqlite::memory:',
134
+ 'id_column' => 'id',
135
+ 'id_column_overrides' => array(),
136
+ 'error_mode' => \PDO::ERRMODE_EXCEPTION,
137
+ 'username' => null,
138
+ 'password' => null,
139
+ 'driver_options' => null,
140
+ 'identifier_quote_character' => null,
141
+ // if this is null, will be autodetected
142
+ 'limit_clause_style' => null,
143
+ // if this is null, will be autodetected
144
+ 'logging' => \false,
145
+ 'logger' => null,
146
+ 'caching' => \false,
147
+ 'caching_auto_clear' => \false,
148
+ 'return_result_sets' => \false,
149
+ );
150
+ // Map of configuration settings
151
+ protected static $_config = array();
152
+ // Map of database connections, instances of the PDO class
153
+ protected static $_db = array();
154
+ // Last query run, only populated if logging is enabled
155
+ protected static $_last_query;
156
+ // Log of all queries run, mapped by connection key, only populated if logging is enabled
157
+ protected static $_query_log = array();
158
+ // Query cache, only used if query caching is enabled
159
+ protected static $_query_cache = array();
160
+ // Reference to previously used PDOStatement object to enable low-level access, if needed
161
+ protected static $_last_statement = null;
162
+ // --------------------------- //
163
+ // --- INSTANCE PROPERTIES --- //
164
+ // --------------------------- //
165
+ // Key name of the connections in self::$_db used by this instance
166
+ protected $_connection_name;
167
+ // The name of the table the current ORM instance is associated with
168
+ protected $_table_name;
169
+ // Alias for the table to be used in SELECT queries
170
+ protected $_table_alias = null;
171
+ // Values to be bound to the query
172
+ protected $_values = array();
173
+ // Columns to select in the result
174
+ protected $_result_columns = array('*');
175
+ // Are we using the default result column or have these been manually changed?
176
+ protected $_using_default_result_columns = \true;
177
+ // Join sources
178
+ protected $_join_sources = array();
179
+ // Should the query include a DISTINCT keyword?
180
+ protected $_distinct = \false;
181
+ // Is this a raw query?
182
+ protected $_is_raw_query = \false;
183
+ // The raw query
184
+ protected $_raw_query = '';
185
+ // The raw query parameters
186
+ protected $_raw_parameters = array();
187
+ // Array of WHERE clauses
188
+ protected $_where_conditions = array();
189
+ // LIMIT
190
+ protected $_limit = null;
191
+ // OFFSET
192
+ protected $_offset = null;
193
+ // ORDER BY
194
+ protected $_order_by = array();
195
+ // GROUP BY
196
+ protected $_group_by = array();
197
+ // HAVING
198
+ protected $_having_conditions = array();
199
+ // The data for a hydrated instance of the class
200
+ protected $_data = array();
201
+ // Fields that have been modified during the
202
+ // lifetime of the object
203
+ protected $_dirty_fields = array();
204
+ // Fields that are to be inserted in the DB raw
205
+ protected $_expr_fields = array();
206
+ // Is this a new object (has create() been called)?
207
+ protected $_is_new = \false;
208
+ // Name of the column to use as the primary key for
209
+ // this instance only. Overrides the config settings.
210
+ protected $_instance_id_column = null;
211
+ // ---------------------- //
212
+ // --- STATIC METHODS --- //
213
+ // ---------------------- //
214
+ /**
215
+ * Pass configuration settings to the class in the form of
216
+ * key/value pairs. As a shortcut, if the second argument
217
+ * is omitted and the key is a string, the setting is
218
+ * assumed to be the DSN string used by PDO to connect
219
+ * to the database (often, this will be the only configuration
220
+ * required to use Idiorm). If you have more than one setting
221
+ * you wish to configure, another shortcut is to pass an array
222
+ * of settings (and omit the second argument).
223
+ * @param string|array $key
224
+ * @param mixed $value
225
+ * @param string $connection_name Which connection to use
226
+ */
227
+ public static function configure($key, $value = null, $connection_name = self::DEFAULT_CONNECTION)
228
+ {
229
+ self::_setup_db_config($connection_name);
230
+ //ensures at least default config is set
231
+ if (\is_array($key)) {
232
+ // Shortcut: If only one array argument is passed,
233
+ // assume it's an array of configuration settings
234
+ foreach ($key as $conf_key => $conf_value) {
235
+ self::configure($conf_key, $conf_value, $connection_name);
236
+ }
237
+ } else {
238
+ if (\is_null($value)) {
239
+ // Shortcut: If only one string argument is passed,
240
+ // assume it's a connection string
241
+ $value = $key;
242
+ $key = 'connection_string';
243
+ }
244
+ self::$_config[$connection_name][$key] = $value;
245
+ }
246
+ }
247
+ /**
248
+ * Retrieve configuration options by key, or as whole array.
249
+ * @param string $key
250
+ * @param string $connection_name Which connection to use
251
+ */
252
+ public static function get_config($key = null, $connection_name = self::DEFAULT_CONNECTION)
253
+ {
254
+ if ($key) {
255
+ return self::$_config[$connection_name][$key];
256
+ } else {
257
+ return self::$_config[$connection_name];
258
+ }
259
+ }
260
+ /**
261
+ * Delete all configs in _config array.
262
+ */
263
+ public static function reset_config()
264
+ {
265
+ self::$_config = array();
266
+ }
267
+ /**
268
+ * Despite its slightly odd name, this is actually the factory
269
+ * method used to acquire instances of the class. It is named
270
+ * this way for the sake of a readable interface, ie
271
+ * ORM::for_table('table_name')->find_one()-> etc. As such,
272
+ * this will normally be the first method called in a chain.
273
+ * @param string $table_name
274
+ * @param string $connection_name Which connection to use
275
+ * @return ORM
276
+ */
277
+ public static function for_table($table_name, $connection_name = self::DEFAULT_CONNECTION)
278
+ {
279
+ self::_setup_db($connection_name);
280
+ return new self($table_name, array(), $connection_name);
281
+ }
282
+ /**
283
+ * Set up the database connection used by the class
284
+ * @param string $connection_name Which connection to use
285
+ */
286
+ protected static function _setup_db($connection_name = self::DEFAULT_CONNECTION)
287
+ {
288
+ if (!\array_key_exists($connection_name, self::$_db) || !\is_object(self::$_db[$connection_name])) {
289
+ self::_setup_db_config($connection_name);
290
+ $db = new \PDO(self::$_config[$connection_name]['connection_string'], self::$_config[$connection_name]['username'], self::$_config[$connection_name]['password'], self::$_config[$connection_name]['driver_options']);
291
+ $db->setAttribute(\PDO::ATTR_ERRMODE, self::$_config[$connection_name]['error_mode']);
292
+ self::set_db($db, $connection_name);
293
+ }
294
+ }
295
+ /**
296
+ * Ensures configuration (multiple connections) is at least set to default.
297
+ * @param string $connection_name Which connection to use
298
+ */
299
+ protected static function _setup_db_config($connection_name)
300
+ {
301
+ if (!\array_key_exists($connection_name, self::$_config)) {
302
+ self::$_config[$connection_name] = self::$_default_config;
303
+ }
304
+ }
305
+ /**
306
+ * Set the PDO object used by Idiorm to communicate with the database.
307
+ * This is public in case the ORM should use a ready-instantiated
308
+ * PDO object as its database connection. Accepts an optional string key
309
+ * to identify the connection if multiple connections are used.
310
+ * @param PDO $db
311
+ * @param string $connection_name Which connection to use
312
+ */
313
+ public static function set_db($db, $connection_name = self::DEFAULT_CONNECTION)
314
+ {
315
+ self::_setup_db_config($connection_name);
316
+ self::$_db[$connection_name] = $db;
317
+ if (!\is_null(self::$_db[$connection_name])) {
318
+ self::_setup_identifier_quote_character($connection_name);
319
+ self::_setup_limit_clause_style($connection_name);
320
+ }
321
+ }
322
+ /**
323
+ * Close and delete all registered PDO objects in _db array.
324
+ */
325
+ public static function reset_db()
326
+ {
327
+ self::$_db = null;
328
+ self::$_db = array();
329
+ }
330
+ /**
331
+ * Detect and initialise the character used to quote identifiers
332
+ * (table names, column names etc). If this has been specified
333
+ * manually using ORM::configure('identifier_quote_character', 'some-char'),
334
+ * this will do nothing.
335
+ * @param string $connection_name Which connection to use
336
+ */
337
+ protected static function _setup_identifier_quote_character($connection_name)
338
+ {
339
+ if (\is_null(self::$_config[$connection_name]['identifier_quote_character'])) {
340
+ self::$_config[$connection_name]['identifier_quote_character'] = self::_detect_identifier_quote_character($connection_name);
341
+ }
342
+ }
343
+ /**
344
+ * Detect and initialise the limit clause style ("SELECT TOP 5" /
345
+ * "... LIMIT 5"). If this has been specified manually using
346
+ * ORM::configure('limit_clause_style', 'top'), this will do nothing.
347
+ * @param string $connection_name Which connection to use
348
+ */
349
+ public static function _setup_limit_clause_style($connection_name)
350
+ {
351
+ if (\is_null(self::$_config[$connection_name]['limit_clause_style'])) {
352
+ self::$_config[$connection_name]['limit_clause_style'] = self::_detect_limit_clause_style($connection_name);
353
+ }
354
+ }
355
+ /**
356
+ * Return the correct character used to quote identifiers (table
357
+ * names, column names etc) by looking at the driver being used by PDO.
358
+ * @param string $connection_name Which connection to use
359
+ * @return string
360
+ */
361
+ protected static function _detect_identifier_quote_character($connection_name)
362
+ {
363
+ switch (self::get_db($connection_name)->getAttribute(\PDO::ATTR_DRIVER_NAME)) {
364
+ case 'pgsql':
365
+ case 'sqlsrv':
366
+ case 'dblib':
367
+ case 'mssql':
368
+ case 'sybase':
369
+ case 'firebird':
370
+ return '"';
371
+ case 'mysql':
372
+ case 'sqlite':
373
+ case 'sqlite2':
374
+ default:
375
+ return '`';
376
+ }
377
+ }
378
+ /**
379
+ * Returns a constant after determining the appropriate limit clause
380
+ * style
381
+ * @param string $connection_name Which connection to use
382
+ * @return string Limit clause style keyword/constant
383
+ */
384
+ protected static function _detect_limit_clause_style($connection_name)
385
+ {
386
+ switch (self::get_db($connection_name)->getAttribute(\PDO::ATTR_DRIVER_NAME)) {
387
+ case 'sqlsrv':
388
+ case 'dblib':
389
+ case 'mssql':
390
+ return \YoastSEO_Vendor\ORM::LIMIT_STYLE_TOP_N;
391
+ default:
392
+ return \YoastSEO_Vendor\ORM::LIMIT_STYLE_LIMIT;
393
+ }
394
+ }
395
+ /**
396
+ * Returns the PDO instance used by the the ORM to communicate with
397
+ * the database. This can be called if any low-level DB access is
398
+ * required outside the class. If multiple connections are used,
399
+ * accepts an optional key name for the connection.
400
+ * @param string $connection_name Which connection to use
401
+ * @return PDO
402
+ */
403
+ public static function get_db($connection_name = self::DEFAULT_CONNECTION)
404
+ {
405
+ self::_setup_db($connection_name);
406
+ // required in case this is called before Idiorm is instantiated
407
+ return self::$_db[$connection_name];
408
+ }
409
+ /**
410
+ * Executes a raw query as a wrapper for PDOStatement::execute.
411
+ * Useful for queries that can't be accomplished through Idiorm,
412
+ * particularly those using engine-specific features.
413
+ * @example raw_execute('SELECT `name`, AVG(`order`) FROM `customer` GROUP BY `name` HAVING AVG(`order`) > 10')
414
+ * @example raw_execute('INSERT OR REPLACE INTO `widget` (`id`, `name`) SELECT `id`, `name` FROM `other_table`')
415
+ * @param string $query The raw SQL query
416
+ * @param array $parameters Optional bound parameters
417
+ * @param string $connection_name Which connection to use
418
+ * @return bool Success
419
+ */
420
+ public static function raw_execute($query, $parameters = array(), $connection_name = self::DEFAULT_CONNECTION)
421
+ {
422
+ self::_setup_db($connection_name);
423
+ return self::_execute($query, $parameters, $connection_name);
424
+ }
425
+ /**
426
+ * Returns the PDOStatement instance last used by any connection wrapped by the ORM.
427
+ * Useful for access to PDOStatement::rowCount() or error information
428
+ * @return PDOStatement
429
+ */
430
+ public static function get_last_statement()
431
+ {
432
+ return self::$_last_statement;
433
+ }
434
+ /**
435
+ * Internal helper method for executing statments. Logs queries, and
436
+ * stores statement object in ::_last_statment, accessible publicly
437
+ * through ::get_last_statement()
438
+ * @param string $query
439
+ * @param array $parameters An array of parameters to be bound in to the query
440
+ * @param string $connection_name Which connection to use
441
+ * @return bool Response of PDOStatement::execute()
442
+ */
443
+ protected static function _execute($query, $parameters = array(), $connection_name = self::DEFAULT_CONNECTION)
444
+ {
445
+ $statement = self::get_db($connection_name)->prepare($query);
446
+ self::$_last_statement = $statement;
447
+ $time = \microtime(\true);
448
+ foreach ($parameters as $key => &$param) {
449
+ if (\is_null($param)) {
450
+ $type = \PDO::PARAM_NULL;
451
+ } else {
452
+ if (\is_bool($param)) {
453
+ $type = \PDO::PARAM_BOOL;
454
+ } else {
455
+ if (\is_int($param)) {
456
+ $type = \PDO::PARAM_INT;
457
+ } else {
458
+ $type = \PDO::PARAM_STR;
459
+ }
460
+ }
461
+ }
462
+ $statement->bindParam(\is_int($key) ? ++$key : $key, $param, $type);
463
+ }
464
+ $q = $statement->execute();
465
+ self::_log_query($query, $parameters, $connection_name, \microtime(\true) - $time);
466
+ return $q;
467
+ }
468
+ /**
469
+ * Add a query to the internal query log. Only works if the
470
+ * 'logging' config option is set to true.
471
+ *
472
+ * This works by manually binding the parameters to the query - the
473
+ * query isn't executed like this (PDO normally passes the query and
474
+ * parameters to the database which takes care of the binding) but
475
+ * doing it this way makes the logged queries more readable.
476
+ * @param string $query
477
+ * @param array $parameters An array of parameters to be bound in to the query
478
+ * @param string $connection_name Which connection to use
479
+ * @param float $query_time Query time
480
+ * @return bool
481
+ */
482
+ protected static function _log_query($query, $parameters, $connection_name, $query_time)
483
+ {
484
+ // If logging is not enabled, do nothing
485
+ if (!self::$_config[$connection_name]['logging']) {
486
+ return \false;
487
+ }
488
+ if (!isset(self::$_query_log[$connection_name])) {
489
+ self::$_query_log[$connection_name] = array();
490
+ }
491
+ if (empty($parameters)) {
492
+ $bound_query = $query;
493
+ } else {
494
+ // Escape the parameters
495
+ $parameters = \array_map(array(self::get_db($connection_name), 'quote'), $parameters);
496
+ if (\array_values($parameters) === $parameters) {
497
+ // ? placeholders
498
+ // Avoid %format collision for vsprintf
499
+ $query = \str_replace("%", "%%", $query);
500
+ // Replace placeholders in the query for vsprintf
501
+ if (\false !== \strpos($query, "'") || \false !== \strpos($query, '"')) {
502
+ $query = \YoastSEO_Vendor\IdiormString::str_replace_outside_quotes("?", "%s", $query);
503
+ } else {
504
+ $query = \str_replace("?", "%s", $query);
505
+ }
506
+ // Replace the question marks in the query with the parameters
507
+ $bound_query = \vsprintf($query, $parameters);
508
+ } else {
509
+ // named placeholders
510
+ foreach ($parameters as $key => $val) {
511
+ $query = \str_replace($key, $val, $query);
512
+ }
513
+ $bound_query = $query;
514
+ }
515
+ }
516
+ self::$_last_query = $bound_query;
517
+ self::$_query_log[$connection_name][] = $bound_query;
518
+ if (\is_callable(self::$_config[$connection_name]['logger'])) {
519
+ $logger = self::$_config[$connection_name]['logger'];
520
+ $logger($bound_query, $query_time);
521
+ }
522
+ return \true;
523
+ }
524
+ /**
525
+ * Get the last query executed. Only works if the
526
+ * 'logging' config option is set to true. Otherwise
527
+ * this will return null. Returns last query from all connections if
528
+ * no connection_name is specified
529
+ * @param null|string $connection_name Which connection to use
530
+ * @return string
531
+ */
532
+ public static function get_last_query($connection_name = null)
533
+ {
534
+ if ($connection_name === null) {
535
+ return self::$_last_query;
536
+ }
537
+ if (!isset(self::$_query_log[$connection_name])) {
538
+ return '';
539
+ }
540
+ return \end(self::$_query_log[$connection_name]);
541
+ }
542
+ /**
543
+ * Get an array containing all the queries run on a
544
+ * specified connection up to now.
545
+ * Only works if the 'logging' config option is
546
+ * set to true. Otherwise, returned array will be empty.
547
+ * @param string $connection_name Which connection to use
548
+ */
549
+ public static function get_query_log($connection_name = self::DEFAULT_CONNECTION)
550
+ {
551
+ if (isset(self::$_query_log[$connection_name])) {
552
+ return self::$_query_log[$connection_name];
553
+ }
554
+ return array();
555
+ }
556
+ /**
557
+ * Get a list of the available connection names
558
+ * @return array
559
+ */
560
+ public static function get_connection_names()
561
+ {
562
+ return \array_keys(self::$_db);
563
+ }
564
+ // ------------------------ //
565
+ // --- INSTANCE METHODS --- //
566
+ // ------------------------ //
567
+ /**
568
+ * "Private" constructor; shouldn't be called directly.
569
+ * Use the ORM::for_table factory method instead.
570
+ */
571
+ protected function __construct($table_name, $data = array(), $connection_name = self::DEFAULT_CONNECTION)
572
+ {
573
+ $this->_table_name = $table_name;
574
+ $this->_data = $data;
575
+ $this->_connection_name = $connection_name;
576
+ self::_setup_db_config($connection_name);
577
+ }
578
+ /**
579
+ * Create a new, empty instance of the class. Used
580
+ * to add a new row to your database. May optionally
581
+ * be passed an associative array of data to populate
582
+ * the instance. If so, all fields will be flagged as
583
+ * dirty so all will be saved to the database when
584
+ * save() is called.
585
+ */
586
+ public function create($data = null)
587
+ {
588
+ $this->_is_new = \true;
589
+ if (!\is_null($data)) {
590
+ return $this->hydrate($data)->force_all_dirty();
591
+ }
592
+ return $this;
593
+ }
594
+ /**
595
+ * Specify the ID column to use for this instance or array of instances only.
596
+ * This overrides the id_column and id_column_overrides settings.
597
+ *
598
+ * This is mostly useful for libraries built on top of Idiorm, and will
599
+ * not normally be used in manually built queries. If you don't know why
600
+ * you would want to use this, you should probably just ignore it.
601
+ */
602
+ public function use_id_column($id_column)
603
+ {
604
+ $this->_instance_id_column = $id_column;
605
+ return $this;
606
+ }
607
+ /**
608
+ * Create an ORM instance from the given row (an associative
609
+ * array of data fetched from the database)
610
+ */
611
+ protected function _create_instance_from_row($row)
612
+ {
613
+ $instance = self::for_table($this->_table_name, $this->_connection_name);
614
+ $instance->use_id_column($this->_instance_id_column);
615
+ $instance->hydrate($row);
616
+ return $instance;
617
+ }
618
+ /**
619
+ * Tell the ORM that you are expecting a single result
620
+ * back from your query, and execute it. Will return
621
+ * a single instance of the ORM class, or false if no
622
+ * rows were returned.
623
+ * As a shortcut, you may supply an ID as a parameter
624
+ * to this method. This will perform a primary key
625
+ * lookup on the table.
626
+ */
627
+ public function find_one($id = null)
628
+ {
629
+ if (!\is_null($id)) {
630
+ $this->where_id_is($id);
631
+ }
632
+ $this->limit(1);
633
+ $rows = $this->_run();
634
+ if (empty($rows)) {
635
+ return \false;
636
+ }
637
+ return $this->_create_instance_from_row($rows[0]);
638
+ }
639
+ /**
640
+ * Tell the ORM that you are expecting multiple results
641
+ * from your query, and execute it. Will return an array
642
+ * of instances of the ORM class, or an empty array if
643
+ * no rows were returned.
644
+ * @return array|\IdiormResultSet
645
+ */
646
+ public function find_many()
647
+ {
648
+ if (self::$_config[$this->_connection_name]['return_result_sets']) {
649
+ return $this->find_result_set();
650
+ }
651
+ return $this->_find_many();
652
+ }
653
+ /**
654
+ * Tell the ORM that you are expecting multiple results
655
+ * from your query, and execute it. Will return an array
656
+ * of instances of the ORM class, or an empty array if
657
+ * no rows were returned.
658
+ * @return array
659
+ */
660
+ protected function _find_many()
661
+ {
662
+ $rows = $this->_run();
663
+ return \array_map(array($this, '_create_instance_from_row'), $rows);
664
+ }
665
+ /**
666
+ * Tell the ORM that you are expecting multiple results
667
+ * from your query, and execute it. Will return a result set object
668
+ * containing instances of the ORM class.
669
+ * @return \IdiormResultSet
670
+ */
671
+ public function find_result_set()
672
+ {
673
+ return new \YoastSEO_Vendor\IdiormResultSet($this->_find_many());
674
+ }
675
+ /**
676
+ * Tell the ORM that you are expecting multiple results
677
+ * from your query, and execute it. Will return an array,
678
+ * or an empty array if no rows were returned.
679
+ * @return array
680
+ */
681
+ public function find_array()
682
+ {
683
+ return $this->_run();
684
+ }
685
+ /**
686
+ * Tell the ORM that you wish to execute a COUNT query.
687
+ * Will return an integer representing the number of
688
+ * rows returned.
689
+ */
690
+ public function count($column = '*')
691
+ {
692
+ return $this->_call_aggregate_db_function(__FUNCTION__, $column);
693
+ }
694
+ /**
695
+ * Tell the ORM that you wish to execute a MAX query.
696
+ * Will return the max value of the choosen column.
697
+ */
698
+ public function max($column)
699
+ {
700
+ return $this->_call_aggregate_db_function(__FUNCTION__, $column);
701
+ }
702
+ /**
703
+ * Tell the ORM that you wish to execute a MIN query.
704
+ * Will return the min value of the choosen column.
705
+ */
706
+ public function min($column)
707
+ {
708
+ return $this->_call_aggregate_db_function(__FUNCTION__, $column);
709
+ }
710
+ /**
711
+ * Tell the ORM that you wish to execute a AVG query.
712
+ * Will return the average value of the choosen column.
713
+ */
714
+ public function avg($column)
715
+ {
716
+ return $this->_call_aggregate_db_function(__FUNCTION__, $column);
717
+ }
718
+ /**
719
+ * Tell the ORM that you wish to execute a SUM query.
720
+ * Will return the sum of the choosen column.
721
+ */
722
+ public function sum($column)
723
+ {
724
+ return $this->_call_aggregate_db_function(__FUNCTION__, $column);
725
+ }
726
+ /**
727
+ * Execute an aggregate query on the current connection.
728
+ * @param string $sql_function The aggregate function to call eg. MIN, COUNT, etc
729
+ * @param string $column The column to execute the aggregate query against
730
+ * @return int
731
+ */
732
+ protected function _call_aggregate_db_function($sql_function, $column)
733
+ {
734
+ $alias = \strtolower($sql_function);
735
+ $sql_function = \strtoupper($sql_function);
736
+ if ('*' != $column) {
737
+ $column = $this->_quote_identifier($column);
738
+ }
739
+ $result_columns = $this->_result_columns;
740
+ $this->_result_columns = array();
741
+ $this->select_expr("{$sql_function}({$column})", $alias);
742
+ $result = $this->find_one();
743
+ $this->_result_columns = $result_columns;
744
+ $return_value = 0;
745
+ if ($result !== \false && isset($result->{$alias})) {
746
+ if (!\is_numeric($result->{$alias})) {
747
+ $return_value = $result->{$alias};
748
+ } elseif ((int) $result->{$alias} == (float) $result->{$alias}) {
749
+ $return_value = (int) $result->{$alias};
750
+ } else {
751
+ $return_value = (float) $result->{$alias};
752
+ }
753
+ }
754
+ return $return_value;
755
+ }
756
+ /**
757
+ * This method can be called to hydrate (populate) this
758
+ * instance of the class from an associative array of data.
759
+ * This will usually be called only from inside the class,
760
+ * but it's public in case you need to call it directly.
761
+ */
762
+ public function hydrate($data = array())
763
+ {
764
+ $this->_data = $data;
765
+ return $this;
766
+ }
767
+ /**
768
+ * Force the ORM to flag all the fields in the $data array
769
+ * as "dirty" and therefore update them when save() is called.
770
+ */
771
+ public function force_all_dirty()
772
+ {
773
+ $this->_dirty_fields = $this->_data;
774
+ return $this;
775
+ }
776
+ /**
777
+ * Perform a raw query. The query can contain placeholders in
778
+ * either named or question mark style. If placeholders are
779
+ * used, the parameters should be an array of values which will
780
+ * be bound to the placeholders in the query. If this method
781
+ * is called, all other query building methods will be ignored.
782
+ */
783
+ public function raw_query($query, $parameters = array())
784
+ {
785
+ $this->_is_raw_query = \true;
786
+ $this->_raw_query = $query;
787
+ $this->_raw_parameters = $parameters;
788
+ return $this;
789
+ }
790
+ /**
791
+ * Add an alias for the main table to be used in SELECT queries
792
+ */
793
+ public function table_alias($alias)
794
+ {
795
+ $this->_table_alias = $alias;
796
+ return $this;
797
+ }
798
+ /**
799
+ * Internal method to add an unquoted expression to the set
800
+ * of columns returned by the SELECT query. The second optional
801
+ * argument is the alias to return the expression as.
802
+ */
803
+ protected function _add_result_column($expr, $alias = null)
804
+ {
805
+ if (!\is_null($alias)) {
806
+ $expr .= " AS " . $this->_quote_identifier($alias);
807
+ }
808
+ if ($this->_using_default_result_columns) {
809
+ $this->_result_columns = array($expr);
810
+ $this->_using_default_result_columns = \false;
811
+ } else {
812
+ $this->_result_columns[] = $expr;
813
+ }
814
+ return $this;
815
+ }
816
+ /**
817
+ * Counts the number of columns that belong to the primary
818
+ * key and their value is null.
819
+ */
820
+ public function count_null_id_columns()
821
+ {
822
+ if (\is_array($this->_get_id_column_name())) {
823
+ return \count(\array_filter($this->id(), 'is_null'));
824
+ } else {
825
+ return \is_null($this->id()) ? 1 : 0;
826
+ }
827
+ }
828
+ /**
829
+ * Add a column to the list of columns returned by the SELECT
830
+ * query. This defaults to '*'. The second optional argument is
831
+ * the alias to return the column as.
832
+ */
833
+ public function select($column, $alias = null)
834
+ {
835
+ $column = $this->_quote_identifier($column);
836
+ return $this->_add_result_column($column, $alias);
837
+ }
838
+ /**
839
+ * Add an unquoted expression to the list of columns returned
840
+ * by the SELECT query. The second optional argument is
841
+ * the alias to return the column as.
842
+ */
843
+ public function select_expr($expr, $alias = null)
844
+ {
845
+ return $this->_add_result_column($expr, $alias);
846
+ }
847
+ /**
848
+ * Add columns to the list of columns returned by the SELECT
849
+ * query. This defaults to '*'. Many columns can be supplied
850
+ * as either an array or as a list of parameters to the method.
851
+ *
852
+ * Note that the alias must not be numeric - if you want a
853
+ * numeric alias then prepend it with some alpha chars. eg. a1
854
+ *
855
+ * @example select_many(array('alias' => 'column', 'column2', 'alias2' => 'column3'), 'column4', 'column5');
856
+ * @example select_many('column', 'column2', 'column3');
857
+ * @example select_many(array('column', 'column2', 'column3'), 'column4', 'column5');
858
+ *
859
+ * @return \ORM
860
+ */
861
+ public function select_many()
862
+ {
863
+ $columns = \func_get_args();
864
+ if (!empty($columns)) {
865
+ $columns = $this->_normalise_select_many_columns($columns);
866
+ foreach ($columns as $alias => $column) {
867
+ if (\is_numeric($alias)) {
868
+ $alias = null;
869
+ }
870
+ $this->select($column, $alias);
871
+ }
872
+ }
873
+ return $this;
874
+ }
875
+ /**
876
+ * Add an unquoted expression to the list of columns returned
877
+ * by the SELECT query. Many columns can be supplied as either
878
+ * an array or as a list of parameters to the method.
879
+ *
880
+ * Note that the alias must not be numeric - if you want a
881
+ * numeric alias then prepend it with some alpha chars. eg. a1
882
+ *
883
+ * @example select_many_expr(array('alias' => 'column', 'column2', 'alias2' => 'column3'), 'column4', 'column5')
884
+ * @example select_many_expr('column', 'column2', 'column3')
885
+ * @example select_many_expr(array('column', 'column2', 'column3'), 'column4', 'column5')
886
+ *
887
+ * @return \ORM
888
+ */
889
+ public function select_many_expr()
890
+ {
891
+ $columns = \func_get_args();
892
+ if (!empty($columns)) {
893
+ $columns = $this->_normalise_select_many_columns($columns);
894
+ foreach ($columns as $alias => $column) {
895
+ if (\is_numeric($alias)) {
896
+ $alias = null;
897
+ }
898
+ $this->select_expr($column, $alias);
899
+ }
900
+ }
901
+ return $this;
902
+ }
903
+ /**
904
+ * Take a column specification for the select many methods and convert it
905
+ * into a normalised array of columns and aliases.
906
+ *
907
+ * It is designed to turn the following styles into a normalised array:
908
+ *
909
+ * array(array('alias' => 'column', 'column2', 'alias2' => 'column3'), 'column4', 'column5'))
910
+ *
911
+ * @param array $columns
912
+ * @return array
913
+ */
914
+ protected function _normalise_select_many_columns($columns)
915
+ {
916
+ $return = array();
917
+ foreach ($columns as $column) {
918
+ if (\is_array($column)) {
919
+ foreach ($column as $key => $value) {
920
+ if (!\is_numeric($key)) {
921
+ $return[$key] = $value;
922
+ } else {
923
+ $return[] = $value;
924
+ }
925
+ }
926
+ } else {
927
+ $return[] = $column;
928
+ }
929
+ }
930
+ return $return;
931
+ }
932
+ /**
933
+ * Add a DISTINCT keyword before the list of columns in the SELECT query
934
+ */
935
+ public function distinct()
936
+ {
937
+ $this->_distinct = \true;
938
+ return $this;
939
+ }
940
+ /**
941
+ * Internal method to add a JOIN source to the query.
942
+ *
943
+ * The join_operator should be one of INNER, LEFT OUTER, CROSS etc - this
944
+ * will be prepended to JOIN.
945
+ *
946
+ * The table should be the name of the table to join to.
947
+ *
948
+ * The constraint may be either a string or an array with three elements. If it
949
+ * is a string, it will be compiled into the query as-is, with no escaping. The
950
+ * recommended way to supply the constraint is as an array with three elements:
951
+ *
952
+ * first_column, operator, second_column
953
+ *
954
+ * Example: array('user.id', '=', 'profile.user_id')
955
+ *
956
+ * will compile to
957
+ *
958
+ * ON `user`.`id` = `profile`.`user_id`
959
+ *
960
+ * The final (optional) argument specifies an alias for the joined table.
961
+ */
962
+ protected function _add_join_source($join_operator, $table, $constraint, $table_alias = null)
963
+ {
964
+ $join_operator = \trim("{$join_operator} JOIN");
965
+ $table = $this->_quote_identifier($table);
966
+ // Add table alias if present
967
+ if (!\is_null($table_alias)) {
968
+ $table_alias = $this->_quote_identifier($table_alias);
969
+ $table .= " {$table_alias}";
970
+ }
971
+ // Build the constraint
972
+ if (\is_array($constraint)) {
973
+ list($first_column, $operator, $second_column) = $constraint;
974
+ $first_column = $this->_quote_identifier($first_column);
975
+ $second_column = $this->_quote_identifier($second_column);
976
+ $constraint = "{$first_column} {$operator} {$second_column}";
977
+ }
978
+ $this->_join_sources[] = "{$join_operator} {$table} ON {$constraint}";
979
+ return $this;
980
+ }
981
+ /**
982
+ * Add a RAW JOIN source to the query
983
+ */
984
+ public function raw_join($table, $constraint, $table_alias, $parameters = array())
985
+ {
986
+ // Add table alias if present
987
+ if (!\is_null($table_alias)) {
988
+ $table_alias = $this->_quote_identifier($table_alias);
989
+ $table .= " {$table_alias}";
990
+ }
991
+ $this->_values = \array_merge($this->_values, $parameters);
992
+ // Build the constraint
993
+ if (\is_array($constraint)) {
994
+ list($first_column, $operator, $second_column) = $constraint;
995
+ $first_column = $this->_quote_identifier($first_column);
996
+ $second_column = $this->_quote_identifier($second_column);
997
+ $constraint = "{$first_column} {$operator} {$second_column}";
998
+ }
999
+ $this->_join_sources[] = "{$table} ON {$constraint}";
1000
+ return $this;
1001
+ }
1002
+ /**
1003
+ * Add a simple JOIN source to the query
1004
+ */
1005
+ public function join($table, $constraint, $table_alias = null)
1006
+ {
1007
+ return $this->_add_join_source("", $table, $constraint, $table_alias);
1008
+ }
1009
+ /**
1010
+ * Add an INNER JOIN souce to the query
1011
+ */
1012
+ public function inner_join($table, $constraint, $table_alias = null)
1013
+ {
1014
+ return $this->_add_join_source("INNER", $table, $constraint, $table_alias);
1015
+ }
1016
+ /**
1017
+ * Add a LEFT OUTER JOIN souce to the query
1018
+ */
1019
+ public function left_outer_join($table, $constraint, $table_alias = null)
1020
+ {
1021
+ return $this->_add_join_source("LEFT OUTER", $table, $constraint, $table_alias);
1022
+ }
1023
+ /**
1024
+ * Add an RIGHT OUTER JOIN souce to the query
1025
+ */
1026
+ public function right_outer_join($table, $constraint, $table_alias = null)
1027
+ {
1028
+ return $this->_add_join_source("RIGHT OUTER", $table, $constraint, $table_alias);
1029
+ }
1030
+ /**
1031
+ * Add an FULL OUTER JOIN souce to the query
1032
+ */
1033
+ public function full_outer_join($table, $constraint, $table_alias = null)
1034
+ {
1035
+ return $this->_add_join_source("FULL OUTER", $table, $constraint, $table_alias);
1036
+ }
1037
+ /**
1038
+ * Internal method to add a HAVING condition to the query
1039
+ */
1040
+ protected function _add_having($fragment, $values = array())
1041
+ {
1042
+ return $this->_add_condition('having', $fragment, $values);
1043
+ }
1044
+ /**
1045
+ * Internal method to add a HAVING condition to the query
1046
+ */
1047
+ protected function _add_simple_having($column_name, $separator, $value)
1048
+ {
1049
+ return $this->_add_simple_condition('having', $column_name, $separator, $value);
1050
+ }
1051
+ /**
1052
+ * Internal method to add a HAVING clause with multiple values (like IN and NOT IN)
1053
+ */
1054
+ public function _add_having_placeholder($column_name, $separator, $values)
1055
+ {
1056
+ if (!\is_array($column_name)) {
1057
+ $data = array($column_name => $values);
1058
+ } else {
1059
+ $data = $column_name;
1060
+ }
1061
+ $result = $this;
1062
+ foreach ($data as $key => $val) {
1063
+ $column = $result->_quote_identifier($key);
1064
+ $placeholders = $result->_create_placeholders($val);
1065
+ $result = $result->_add_having("{$column} {$separator} ({$placeholders})", $val);
1066
+ }
1067
+ return $result;
1068
+ }
1069
+ /**
1070
+ * Internal method to add a HAVING clause with no parameters(like IS NULL and IS NOT NULL)
1071
+ */
1072
+ public function _add_having_no_value($column_name, $operator)
1073
+ {
1074
+ $conditions = \is_array($column_name) ? $column_name : array($column_name);
1075
+ $result = $this;
1076
+ foreach ($conditions as $column) {
1077
+ $column = $this->_quote_identifier($column);
1078
+ $result = $result->_add_having("{$column} {$operator}");
1079
+ }
1080
+ return $result;
1081
+ }
1082
+ /**
1083
+ * Internal method to add a WHERE condition to the query
1084
+ */
1085
+ protected function _add_where($fragment, $values = array())
1086
+ {
1087
+ return $this->_add_condition('where', $fragment, $values);
1088
+ }
1089
+ /**
1090
+ * Internal method to add a WHERE condition to the query
1091
+ */
1092
+ protected function _add_simple_where($column_name, $separator, $value)
1093
+ {
1094
+ return $this->_add_simple_condition('where', $column_name, $separator, $value);
1095
+ }
1096
+ /**
1097
+ * Add a WHERE clause with multiple values (like IN and NOT IN)
1098
+ */
1099
+ public function _add_where_placeholder($column_name, $separator, $values)
1100
+ {
1101
+ if (!\is_array($column_name)) {
1102
+ $data = array($column_name => $values);
1103
+ } else {
1104
+ $data = $column_name;
1105
+ }
1106
+ $result = $this;
1107
+ foreach ($data as $key => $val) {
1108
+ $column = $result->_quote_identifier($key);
1109
+ $placeholders = $result->_create_placeholders($val);
1110
+ $result = $result->_add_where("{$column} {$separator} ({$placeholders})", $val);
1111
+ }
1112
+ return $result;
1113
+ }
1114
+ /**
1115
+ * Add a WHERE clause with no parameters(like IS NULL and IS NOT NULL)
1116
+ */
1117
+ public function _add_where_no_value($column_name, $operator)
1118
+ {
1119
+ $conditions = \is_array($column_name) ? $column_name : array($column_name);
1120
+ $result = $this;
1121
+ foreach ($conditions as $column) {
1122
+ $column = $this->_quote_identifier($column);
1123
+ $result = $result->_add_where("{$column} {$operator}");
1124
+ }
1125
+ return $result;
1126
+ }
1127
+ /**
1128
+ * Internal method to add a HAVING or WHERE condition to the query
1129
+ */
1130
+ protected function _add_condition($type, $fragment, $values = array())
1131
+ {
1132
+ $conditions_class_property_name = "_{$type}_conditions";
1133
+ if (!\is_array($values)) {
1134
+ $values = array($values);
1135
+ }
1136
+ \array_push($this->{$conditions_class_property_name}, array(self::CONDITION_FRAGMENT => $fragment, self::CONDITION_VALUES => $values));
1137
+ return $this;
1138
+ }
1139
+ /**
1140
+ * Helper method to compile a simple COLUMN SEPARATOR VALUE
1141
+ * style HAVING or WHERE condition into a string and value ready to
1142
+ * be passed to the _add_condition method. Avoids duplication
1143
+ * of the call to _quote_identifier
1144
+ *
1145
+ * If column_name is an associative array, it will add a condition for each column
1146
+ */
1147
+ protected function _add_simple_condition($type, $column_name, $separator, $value)
1148
+ {
1149
+ $multiple = \is_array($column_name) ? $column_name : array($column_name => $value);
1150
+ $result = $this;
1151
+ foreach ($multiple as $key => $val) {
1152
+ // Add the table name in case of ambiguous columns
1153
+ if (\count($result->_join_sources) > 0 && \strpos($key, '.') === \false) {
1154
+ $table = $result->_table_name;
1155
+ if (!\is_null($result->_table_alias)) {
1156
+ $table = $result->_table_alias;
1157
+ }
1158
+ $key = "{$table}.{$key}";
1159
+ }
1160
+ $key = $result->_quote_identifier($key);
1161
+ $result = $result->_add_condition($type, "{$key} {$separator} ?", $val);
1162
+ }
1163
+ return $result;
1164
+ }
1165
+ /**
1166
+ * Return a string containing the given number of question marks,
1167
+ * separated by commas. Eg "?, ?, ?"
1168
+ */
1169
+ protected function _create_placeholders($fields)
1170
+ {
1171
+ if (!empty($fields)) {
1172
+ $db_fields = array();
1173
+ foreach ($fields as $key => $value) {
1174
+ // Process expression fields directly into the query
1175
+ if (\array_key_exists($key, $this->_expr_fields)) {
1176
+ $db_fields[] = $value;
1177
+ } else {
1178
+ $db_fields[] = '?';
1179
+ }
1180
+ }
1181
+ return \implode(', ', $db_fields);
1182
+ }
1183
+ }
1184
+ /**
1185
+ * Helper method that filters a column/value array returning only those
1186
+ * columns that belong to a compound primary key.
1187
+ *
1188
+ * If the key contains a column that does not exist in the given array,
1189
+ * a null value will be returned for it.
1190
+ */
1191
+ protected function _get_compound_id_column_values($value)
1192
+ {
1193
+ $filtered = array();
1194
+ foreach ($this->_get_id_column_name() as $key) {
1195
+ $filtered[$key] = isset($value[$key]) ? $value[$key] : null;
1196
+ }
1197
+ return $filtered;
1198
+ }
1199
+ /**
1200
+ * Helper method that filters an array containing compound column/value
1201
+ * arrays.
1202
+ */
1203
+ protected function _get_compound_id_column_values_array($values)
1204
+ {
1205
+ $filtered = array();
1206
+ foreach ($values as $value) {
1207
+ $filtered[] = $this->_get_compound_id_column_values($value);
1208
+ }
1209
+ return $filtered;
1210
+ }
1211
+ /**
1212
+ * Add a WHERE column = value clause to your query. Each time
1213
+ * this is called in the chain, an additional WHERE will be
1214
+ * added, and these will be ANDed together when the final query
1215
+ * is built.
1216
+ *
1217
+ * If you use an array in $column_name, a new clause will be
1218
+ * added for each element. In this case, $value is ignored.
1219
+ */
1220
+ public function where($column_name, $value = null)
1221
+ {
1222
+ return $this->where_equal($column_name, $value);
1223
+ }
1224
+ /**
1225
+ * More explicitly named version of for the where() method.
1226
+ * Can be used if preferred.
1227
+ */
1228
+ public function where_equal($column_name, $value = null)
1229
+ {
1230
+ return $this->_add_simple_where($column_name, '=', $value);
1231
+ }
1232
+ /**
1233
+ * Add a WHERE column != value clause to your query.
1234
+ */
1235
+ public function where_not_equal($column_name, $value = null)
1236
+ {
1237
+ return $this->_add_simple_where($column_name, '!=', $value);
1238
+ }
1239
+ /**
1240
+ * Special method to query the table by its primary key
1241
+ *
1242
+ * If primary key is compound, only the columns that
1243
+ * belong to they key will be used for the query
1244
+ */
1245
+ public function where_id_is($id)
1246
+ {
1247
+ return \is_array($this->_get_id_column_name()) ? $this->where($this->_get_compound_id_column_values($id), null) : $this->where($this->_get_id_column_name(), $id);
1248
+ }
1249
+ /**
1250
+ * Allows adding a WHERE clause that matches any of the conditions
1251
+ * specified in the array. Each element in the associative array will
1252
+ * be a different condition, where the key will be the column name.
1253
+ *
1254
+ * By default, an equal operator will be used against all columns, but
1255
+ * it can be overriden for any or every column using the second parameter.
1256
+ *
1257
+ * Each condition will be ORed together when added to the final query.
1258
+ */
1259
+ public function where_any_is($values, $operator = '=')
1260
+ {
1261
+ $data = array();
1262
+ $query = array("((");
1263
+ $first = \true;
1264
+ foreach ($values as $value) {
1265
+ if ($first) {
1266
+ $first = \false;
1267
+ } else {
1268
+ $query[] = ") OR (";
1269
+ }
1270
+ $firstsub = \true;
1271
+ foreach ($value as $key => $item) {
1272
+ $op = \is_string($operator) ? $operator : (isset($operator[$key]) ? $operator[$key] : '=');
1273
+ if ($firstsub) {
1274
+ $firstsub = \false;
1275
+ } else {
1276
+ $query[] = "AND";
1277
+ }
1278
+ $query[] = $this->_quote_identifier($key);
1279
+ $data[] = $item;
1280
+ $query[] = $op . " ?";
1281
+ }
1282
+ }
1283
+ $query[] = "))";
1284
+ return $this->where_raw(\join($query, ' '), $data);
1285
+ }
1286
+ /**
1287
+ * Similar to where_id_is() but allowing multiple primary keys.
1288
+ *
1289
+ * If primary key is compound, only the columns that
1290
+ * belong to they key will be used for the query
1291
+ */
1292
+ public function where_id_in($ids)
1293
+ {
1294
+ return \is_array($this->_get_id_column_name()) ? $this->where_any_is($this->_get_compound_id_column_values_array($ids)) : $this->where_in($this->_get_id_column_name(), $ids);
1295
+ }
1296
+ /**
1297
+ * Add a WHERE ... LIKE clause to your query.
1298
+ */
1299
+ public function where_like($column_name, $value = null)
1300
+ {
1301
+ return $this->_add_simple_where($column_name, 'LIKE', $value);
1302
+ }
1303
+ /**
1304
+ * Add where WHERE ... NOT LIKE clause to your query.
1305
+ */
1306
+ public function where_not_like($column_name, $value = null)
1307
+ {
1308
+ return $this->_add_simple_where($column_name, 'NOT LIKE', $value);
1309
+ }
1310
+ /**
1311
+ * Add a WHERE ... > clause to your query
1312
+ */
1313
+ public function where_gt($column_name, $value = null)
1314
+ {
1315
+ return $this->_add_simple_where($column_name, '>', $value);
1316
+ }
1317
+ /**
1318
+ * Add a WHERE ... < clause to your query
1319
+ */
1320
+ public function where_lt($column_name, $value = null)
1321
+ {
1322
+ return $this->_add_simple_where($column_name, '<', $value);
1323
+ }
1324
+ /**
1325
+ * Add a WHERE ... >= clause to your query
1326
+ */
1327
+ public function where_gte($column_name, $value = null)
1328
+ {
1329
+ return $this->_add_simple_where($column_name, '>=', $value);
1330
+ }
1331
+ /**
1332
+ * Add a WHERE ... <= clause to your query
1333
+ */
1334
+ public function where_lte($column_name, $value = null)
1335
+ {
1336
+ return $this->_add_simple_where($column_name, '<=', $value);
1337
+ }
1338
+ /**
1339
+ * Add a WHERE ... IN clause to your query
1340
+ */
1341
+ public function where_in($column_name, $values)
1342
+ {
1343
+ return $this->_add_where_placeholder($column_name, 'IN', $values);
1344
+ }
1345
+ /**
1346
+ * Add a WHERE ... NOT IN clause to your query
1347
+ */
1348
+ public function where_not_in($column_name, $values)
1349
+ {
1350
+ return $this->_add_where_placeholder($column_name, 'NOT IN', $values);
1351
+ }
1352
+ /**
1353
+ * Add a WHERE column IS NULL clause to your query
1354
+ */
1355
+ public function where_null($column_name)
1356
+ {
1357
+ return $this->_add_where_no_value($column_name, "IS NULL");
1358
+ }
1359
+ /**
1360
+ * Add a WHERE column IS NOT NULL clause to your query
1361
+ */
1362
+ public function where_not_null($column_name)
1363
+ {
1364
+ return $this->_add_where_no_value($column_name, "IS NOT NULL");
1365
+ }
1366
+ /**
1367
+ * Add a raw WHERE clause to the query. The clause should
1368
+ * contain question mark placeholders, which will be bound
1369
+ * to the parameters supplied in the second argument.
1370
+ */
1371
+ public function where_raw($clause, $parameters = array())
1372
+ {
1373
+ return $this->_add_where($clause, $parameters);
1374
+ }
1375
+ /**
1376
+ * Add a LIMIT to the query
1377
+ */
1378
+ public function limit($limit)
1379
+ {
1380
+ $this->_limit = $limit;
1381
+ return $this;
1382
+ }
1383
+ /**
1384
+ * Add an OFFSET to the query
1385
+ */
1386
+ public function offset($offset)
1387
+ {
1388
+ $this->_offset = $offset;
1389
+ return $this;
1390
+ }
1391
+ /**
1392
+ * Add an ORDER BY clause to the query
1393
+ */
1394
+ protected function _add_order_by($column_name, $ordering)
1395
+ {
1396
+ $column_name = $this->_quote_identifier($column_name);
1397
+ $this->_order_by[] = "{$column_name} {$ordering}";
1398
+ return $this;
1399
+ }
1400
+ /**
1401
+ * Add an ORDER BY column DESC clause
1402
+ */
1403
+ public function order_by_desc($column_name)
1404
+ {
1405
+ return $this->_add_order_by($column_name, 'DESC');
1406
+ }
1407
+ /**
1408
+ * Add an ORDER BY column ASC clause
1409
+ */
1410
+ public function order_by_asc($column_name)
1411
+ {
1412
+ return $this->_add_order_by($column_name, 'ASC');
1413
+ }
1414
+ /**
1415
+ * Add an unquoted expression as an ORDER BY clause
1416
+ */
1417
+ public function order_by_expr($clause)
1418
+ {
1419
+ $this->_order_by[] = $clause;
1420
+ return $this;
1421
+ }
1422
+ /**
1423
+ * Add a column to the list of columns to GROUP BY
1424
+ */
1425
+ public function group_by($column_name)
1426
+ {
1427
+ $column_name = $this->_quote_identifier($column_name);
1428
+ $this->_group_by[] = $column_name;
1429
+ return $this;
1430
+ }
1431
+ /**
1432
+ * Add an unquoted expression to the list of columns to GROUP BY
1433
+ */
1434
+ public function group_by_expr($expr)
1435
+ {
1436
+ $this->_group_by[] = $expr;
1437
+ return $this;
1438
+ }
1439
+ /**
1440
+ * Add a HAVING column = value clause to your query. Each time
1441
+ * this is called in the chain, an additional HAVING will be
1442
+ * added, and these will be ANDed together when the final query
1443
+ * is built.
1444
+ *
1445
+ * If you use an array in $column_name, a new clause will be
1446
+ * added for each element. In this case, $value is ignored.
1447
+ */
1448
+ public function having($column_name, $value = null)
1449
+ {
1450
+ return $this->having_equal($column_name, $value);
1451
+ }
1452
+ /**
1453
+ * More explicitly named version of for the having() method.
1454
+ * Can be used if preferred.
1455
+ */
1456
+ public function having_equal($column_name, $value = null)
1457
+ {
1458
+ return $this->_add_simple_having($column_name, '=', $value);
1459
+ }
1460
+ /**
1461
+ * Add a HAVING column != value clause to your query.
1462
+ */
1463
+ public function having_not_equal($column_name, $value = null)
1464
+ {
1465
+ return $this->_add_simple_having($column_name, '!=', $value);
1466
+ }
1467
+ /**
1468
+ * Special method to query the table by its primary key.
1469
+ *
1470
+ * If primary key is compound, only the columns that
1471
+ * belong to they key will be used for the query
1472
+ */
1473
+ public function having_id_is($id)
1474
+ {
1475
+ return \is_array($this->_get_id_column_name()) ? $this->having($this->_get_compound_id_column_values($id), null) : $this->having($this->_get_id_column_name(), $id);
1476
+ }
1477
+ /**
1478
+ * Add a HAVING ... LIKE clause to your query.
1479
+ */
1480
+ public function having_like($column_name, $value = null)
1481
+ {
1482
+ return $this->_add_simple_having($column_name, 'LIKE', $value);
1483
+ }
1484
+ /**
1485
+ * Add where HAVING ... NOT LIKE clause to your query.
1486
+ */
1487
+ public function having_not_like($column_name, $value = null)
1488
+ {
1489
+ return $this->_add_simple_having($column_name, 'NOT LIKE', $value);
1490
+ }
1491
+ /**
1492
+ * Add a HAVING ... > clause to your query
1493
+ */
1494
+ public function having_gt($column_name, $value = null)
1495
+ {
1496
+ return $this->_add_simple_having($column_name, '>', $value);
1497
+ }
1498
+ /**
1499
+ * Add a HAVING ... < clause to your query
1500
+ */
1501
+ public function having_lt($column_name, $value = null)
1502
+ {
1503
+ return $this->_add_simple_having($column_name, '<', $value);
1504
+ }
1505
+ /**
1506
+ * Add a HAVING ... >= clause to your query
1507
+ */
1508
+ public function having_gte($column_name, $value = null)
1509
+ {
1510
+ return $this->_add_simple_having($column_name, '>=', $value);
1511
+ }
1512
+ /**
1513
+ * Add a HAVING ... <= clause to your query
1514
+ */
1515
+ public function having_lte($column_name, $value = null)
1516
+ {
1517
+ return $this->_add_simple_having($column_name, '<=', $value);
1518
+ }
1519
+ /**
1520
+ * Add a HAVING ... IN clause to your query
1521
+ */
1522
+ public function having_in($column_name, $values = null)
1523
+ {
1524
+ return $this->_add_having_placeholder($column_name, 'IN', $values);
1525
+ }
1526
+ /**
1527
+ * Add a HAVING ... NOT IN clause to your query
1528
+ */
1529
+ public function having_not_in($column_name, $values = null)
1530
+ {
1531
+ return $this->_add_having_placeholder($column_name, 'NOT IN', $values);
1532
+ }
1533
+ /**
1534
+ * Add a HAVING column IS NULL clause to your query
1535
+ */
1536
+ public function having_null($column_name)
1537
+ {
1538
+ return $this->_add_having_no_value($column_name, 'IS NULL');
1539
+ }
1540
+ /**
1541
+ * Add a HAVING column IS NOT NULL clause to your query
1542
+ */
1543
+ public function having_not_null($column_name)
1544
+ {
1545
+ return $this->_add_having_no_value($column_name, 'IS NOT NULL');
1546
+ }
1547
+ /**
1548
+ * Add a raw HAVING clause to the query. The clause should
1549
+ * contain question mark placeholders, which will be bound
1550
+ * to the parameters supplied in the second argument.
1551
+ */
1552
+ public function having_raw($clause, $parameters = array())
1553
+ {
1554
+ return $this->_add_having($clause, $parameters);
1555
+ }
1556
+ /**
1557
+ * Build a SELECT statement based on the clauses that have
1558
+ * been passed to this instance by chaining method calls.
1559
+ */
1560
+ protected function _build_select()
1561
+ {
1562
+ // If the query is raw, just set the $this->_values to be
1563
+ // the raw query parameters and return the raw query
1564
+ if ($this->_is_raw_query) {
1565
+ $this->_values = $this->_raw_parameters;
1566
+ return $this->_raw_query;
1567
+ }
1568
+ // Build and return the full SELECT statement by concatenating
1569
+ // the results of calling each separate builder method.
1570
+ return $this->_join_if_not_empty(" ", array($this->_build_select_start(), $this->_build_join(), $this->_build_where(), $this->_build_group_by(), $this->_build_having(), $this->_build_order_by(), $this->_build_limit(), $this->_build_offset()));
1571
+ }
1572
+ /**
1573
+ * Build the start of the SELECT statement
1574
+ */
1575
+ protected function _build_select_start()
1576
+ {
1577
+ $fragment = 'SELECT ';
1578
+ $result_columns = \join(', ', $this->_result_columns);
1579
+ if (!\is_null($this->_limit) && self::$_config[$this->_connection_name]['limit_clause_style'] === \YoastSEO_Vendor\ORM::LIMIT_STYLE_TOP_N) {
1580
+ $fragment .= "TOP {$this->_limit} ";
1581
+ }
1582
+ if ($this->_distinct) {
1583
+ $result_columns = 'DISTINCT ' . $result_columns;
1584
+ }
1585
+ $fragment .= "{$result_columns} FROM " . $this->_quote_identifier($this->_table_name);
1586
+ if (!\is_null($this->_table_alias)) {
1587
+ $fragment .= " " . $this->_quote_identifier($this->_table_alias);
1588
+ }
1589
+ return $fragment;
1590
+ }
1591
+ /**
1592
+ * Build the JOIN sources
1593
+ */
1594
+ protected function _build_join()
1595
+ {
1596
+ if (\count($this->_join_sources) === 0) {
1597
+ return '';
1598
+ }
1599
+ return \join(" ", $this->_join_sources);
1600
+ }
1601
+ /**
1602
+ * Build the WHERE clause(s)
1603
+ */
1604
+ protected function _build_where()
1605
+ {
1606
+ return $this->_build_conditions('where');
1607
+ }
1608
+ /**
1609
+ * Build the HAVING clause(s)
1610
+ */
1611
+ protected function _build_having()
1612
+ {
1613
+ return $this->_build_conditions('having');
1614
+ }
1615
+ /**
1616
+ * Build GROUP BY
1617
+ */
1618
+ protected function _build_group_by()
1619
+ {
1620
+ if (\count($this->_group_by) === 0) {
1621
+ return '';
1622
+ }
1623
+ return "GROUP BY " . \join(", ", $this->_group_by);
1624
+ }
1625
+ /**
1626
+ * Build a WHERE or HAVING clause
1627
+ * @param string $type
1628
+ * @return string
1629
+ */
1630
+ protected function _build_conditions($type)
1631
+ {
1632
+ $conditions_class_property_name = "_{$type}_conditions";
1633
+ // If there are no clauses, return empty string
1634
+ if (\count($this->{$conditions_class_property_name}) === 0) {
1635
+ return '';
1636
+ }
1637
+ $conditions = array();
1638
+ foreach ($this->{$conditions_class_property_name} as $condition) {
1639
+ $conditions[] = $condition[self::CONDITION_FRAGMENT];
1640
+ $this->_values = \array_merge($this->_values, $condition[self::CONDITION_VALUES]);
1641
+ }
1642
+ return \strtoupper($type) . " " . \join(" AND ", $conditions);
1643
+ }
1644
+ /**
1645
+ * Build ORDER BY
1646
+ */
1647
+ protected function _build_order_by()
1648
+ {
1649
+ if (\count($this->_order_by) === 0) {
1650
+ return '';
1651
+ }
1652
+ return "ORDER BY " . \join(", ", $this->_order_by);
1653
+ }
1654
+ /**
1655
+ * Build LIMIT
1656
+ */
1657
+ protected function _build_limit()
1658
+ {
1659
+ $fragment = '';
1660
+ if (!\is_null($this->_limit) && self::$_config[$this->_connection_name]['limit_clause_style'] == \YoastSEO_Vendor\ORM::LIMIT_STYLE_LIMIT) {
1661
+ if (self::get_db($this->_connection_name)->getAttribute(\PDO::ATTR_DRIVER_NAME) == 'firebird') {
1662
+ $fragment = 'ROWS';
1663
+ } else {
1664
+ $fragment = 'LIMIT';
1665
+ }
1666
+ $fragment .= " {$this->_limit}";
1667
+ }
1668
+ return $fragment;
1669
+ }
1670
+ /**
1671
+ * Build OFFSET
1672
+ */
1673
+ protected function _build_offset()
1674
+ {
1675
+ if (!\is_null($this->_offset)) {
1676
+ $clause = 'OFFSET';
1677
+ if (self::get_db($this->_connection_name)->getAttribute(\PDO::ATTR_DRIVER_NAME) == 'firebird') {
1678
+ $clause = 'TO';
1679
+ }
1680
+ return "{$clause} " . $this->_offset;
1681
+ }
1682
+ return '';
1683
+ }
1684
+ /**
1685
+ * Wrapper around PHP's join function which
1686
+ * only adds the pieces if they are not empty.
1687
+ */
1688
+ protected function _join_if_not_empty($glue, $pieces)
1689
+ {
1690
+ $filtered_pieces = array();
1691
+ foreach ($pieces as $piece) {
1692
+ if (\is_string($piece)) {
1693
+ $piece = \trim($piece);
1694
+ }
1695
+ if (!empty($piece)) {
1696
+ $filtered_pieces[] = $piece;
1697
+ }
1698
+ }
1699
+ return \join($glue, $filtered_pieces);
1700
+ }
1701
+ /**
1702
+ * Quote a string that is used as an identifier
1703
+ * (table names, column names etc). This method can
1704
+ * also deal with dot-separated identifiers eg table.column
1705
+ */
1706
+ protected function _quote_one_identifier($identifier)
1707
+ {
1708
+ $parts = \explode('.', $identifier);
1709
+ $parts = \array_map(array($this, '_quote_identifier_part'), $parts);
1710
+ return \join('.', $parts);
1711
+ }
1712
+ /**
1713
+ * Quote a string that is used as an identifier
1714
+ * (table names, column names etc) or an array containing
1715
+ * multiple identifiers. This method can also deal with
1716
+ * dot-separated identifiers eg table.column
1717
+ */
1718
+ protected function _quote_identifier($identifier)
1719
+ {
1720
+ if (\is_array($identifier)) {
1721
+ $result = \array_map(array($this, '_quote_one_identifier'), $identifier);
1722
+ return \join(', ', $result);
1723
+ } else {
1724
+ return $this->_quote_one_identifier($identifier);
1725
+ }
1726
+ }
1727
+ /**
1728
+ * This method performs the actual quoting of a single
1729
+ * part of an identifier, using the identifier quote
1730
+ * character specified in the config (or autodetected).
1731
+ */
1732
+ protected function _quote_identifier_part($part)
1733
+ {
1734
+ if ($part === '*') {
1735
+ return $part;
1736
+ }
1737
+ $quote_character = self::$_config[$this->_connection_name]['identifier_quote_character'];
1738
+ // double up any identifier quotes to escape them
1739
+ return $quote_character . \str_replace($quote_character, $quote_character . $quote_character, $part) . $quote_character;
1740
+ }
1741
+ /**
1742
+ * Create a cache key for the given query and parameters.
1743
+ */
1744
+ protected static function _create_cache_key($query, $parameters, $table_name = null, $connection_name = self::DEFAULT_CONNECTION)
1745
+ {
1746
+ if (isset(self::$_config[$connection_name]['create_cache_key']) and \is_callable(self::$_config[$connection_name]['create_cache_key'])) {
1747
+ return \call_user_func_array(self::$_config[$connection_name]['create_cache_key'], array($query, $parameters, $table_name, $connection_name));
1748
+ }
1749
+ $parameter_string = \join(',', $parameters);
1750
+ $key = $query . ':' . $parameter_string;
1751
+ return \sha1($key);
1752
+ }
1753
+ /**
1754
+ * Check the query cache for the given cache key. If a value
1755
+ * is cached for the key, return the value. Otherwise, return false.
1756
+ */
1757
+ protected static function _check_query_cache($cache_key, $table_name = null, $connection_name = self::DEFAULT_CONNECTION)
1758
+ {
1759
+ if (isset(self::$_config[$connection_name]['check_query_cache']) and \is_callable(self::$_config[$connection_name]['check_query_cache'])) {
1760
+ return \call_user_func_array(self::$_config[$connection_name]['check_query_cache'], array($cache_key, $table_name, $connection_name));
1761
+ } elseif (isset(self::$_query_cache[$connection_name][$cache_key])) {
1762
+ return self::$_query_cache[$connection_name][$cache_key];
1763
+ }
1764
+ return \false;
1765
+ }
1766
+ /**
1767
+ * Clear the query cache
1768
+ */
1769
+ public static function clear_cache($table_name = null, $connection_name = self::DEFAULT_CONNECTION)
1770
+ {
1771
+ self::$_query_cache = array();
1772
+ if (isset(self::$_config[$connection_name]['clear_cache']) and \is_callable(self::$_config[$connection_name]['clear_cache'])) {
1773
+ return \call_user_func_array(self::$_config[$connection_name]['clear_cache'], array($table_name, $connection_name));
1774
+ }
1775
+ }
1776
+ /**
1777
+ * Add the given value to the query cache.
1778
+ */
1779
+ protected static function _cache_query_result($cache_key, $value, $table_name = null, $connection_name = self::DEFAULT_CONNECTION)
1780
+ {
1781
+ if (isset(self::$_config[$connection_name]['cache_query_result']) and \is_callable(self::$_config[$connection_name]['cache_query_result'])) {
1782
+ return \call_user_func_array(self::$_config[$connection_name]['cache_query_result'], array($cache_key, $value, $table_name, $connection_name));
1783
+ } elseif (!isset(self::$_query_cache[$connection_name])) {
1784
+ self::$_query_cache[$connection_name] = array();
1785
+ }
1786
+ self::$_query_cache[$connection_name][$cache_key] = $value;
1787
+ }
1788
+ /**
1789
+ * Execute the SELECT query that has been built up by chaining methods
1790
+ * on this class. Return an array of rows as associative arrays.
1791
+ */
1792
+ protected function _run()
1793
+ {
1794
+ $query = $this->_build_select();
1795
+ $caching_enabled = self::$_config[$this->_connection_name]['caching'];
1796
+ if ($caching_enabled) {
1797
+ $cache_key = self::_create_cache_key($query, $this->_values, $this->_table_name, $this->_connection_name);
1798
+ $cached_result = self::_check_query_cache($cache_key, $this->_table_name, $this->_connection_name);
1799
+ if ($cached_result !== \false) {
1800
+ $this->_reset_idiorm_state();
1801
+ return $cached_result;
1802
+ }
1803
+ }
1804
+ self::_execute($query, $this->_values, $this->_connection_name);
1805
+ $statement = self::get_last_statement();
1806
+ $rows = array();
1807
+ while ($row = $statement->fetch(\PDO::FETCH_ASSOC)) {
1808
+ $rows[] = $row;
1809
+ }
1810
+ if ($caching_enabled) {
1811
+ self::_cache_query_result($cache_key, $rows, $this->_table_name, $this->_connection_name);
1812
+ }
1813
+ $this->_reset_idiorm_state();
1814
+ return $rows;
1815
+ }
1816
+ /**
1817
+ * Reset the Idiorm instance state
1818
+ */
1819
+ private function _reset_idiorm_state()
1820
+ {
1821
+ $this->_values = array();
1822
+ $this->_result_columns = array('*');
1823
+ $this->_using_default_result_columns = \true;
1824
+ }
1825
+ /**
1826
+ * Return the raw data wrapped by this ORM
1827
+ * instance as an associative array. Column
1828
+ * names may optionally be supplied as arguments,
1829
+ * if so, only those keys will be returned.
1830
+ */
1831
+ public function as_array()
1832
+ {
1833
+ if (\func_num_args() === 0) {
1834
+ return $this->_data;
1835
+ }
1836
+ $args = \func_get_args();
1837
+ return \array_intersect_key($this->_data, \array_flip($args));
1838
+ }
1839
+ /**
1840
+ * Return the value of a property of this object (database row)
1841
+ * or null if not present.
1842
+ *
1843
+ * If a column-names array is passed, it will return a associative array
1844
+ * with the value of each column or null if it is not present.
1845
+ */
1846
+ public function get($key)
1847
+ {
1848
+ if (\is_array($key)) {
1849
+ $result = array();
1850
+ foreach ($key as $column) {
1851
+ $result[$column] = isset($this->_data[$column]) ? $this->_data[$column] : null;
1852
+ }
1853
+ return $result;
1854
+ } else {
1855
+ return isset($this->_data[$key]) ? $this->_data[$key] : null;
1856
+ }
1857
+ }
1858
+ /**
1859
+ * Return the name of the column in the database table which contains
1860
+ * the primary key ID of the row.
1861
+ */
1862
+ protected function _get_id_column_name()
1863
+ {
1864
+ if (!\is_null($this->_instance_id_column)) {
1865
+ return $this->_instance_id_column;
1866
+ }
1867
+ if (isset(self::$_config[$this->_connection_name]['id_column_overrides'][$this->_table_name])) {
1868
+ return self::$_config[$this->_connection_name]['id_column_overrides'][$this->_table_name];
1869
+ }
1870
+ return self::$_config[$this->_connection_name]['id_column'];
1871
+ }
1872
+ /**
1873
+ * Get the primary key ID of this object.
1874
+ */
1875
+ public function id($disallow_null = \false)
1876
+ {
1877
+ $id = $this->get($this->_get_id_column_name());
1878
+ if ($disallow_null) {
1879
+ if (\is_array($id)) {
1880
+ foreach ($id as $id_part) {
1881
+ if ($id_part === null) {
1882
+ throw new \Exception('Primary key ID contains null value(s)');
1883
+ }
1884
+ }
1885
+ } else {
1886
+ if ($id === null) {
1887
+ throw new \Exception('Primary key ID missing from row or is null');
1888
+ }
1889
+ }
1890
+ }
1891
+ return $id;
1892
+ }
1893
+ /**
1894
+ * Set a property to a particular value on this object.
1895
+ * To set multiple properties at once, pass an associative array
1896
+ * as the first parameter and leave out the second parameter.
1897
+ * Flags the properties as 'dirty' so they will be saved to the
1898
+ * database when save() is called.
1899
+ */
1900
+ public function set($key, $value = null)
1901
+ {
1902
+ return $this->_set_orm_property($key, $value);
1903
+ }
1904
+ /**
1905
+ * Set a property to a particular value on this object.
1906
+ * To set multiple properties at once, pass an associative array
1907
+ * as the first parameter and leave out the second parameter.
1908
+ * Flags the properties as 'dirty' so they will be saved to the
1909
+ * database when save() is called.
1910
+ * @param string|array $key
1911
+ * @param string|null $value
1912
+ */
1913
+ public function set_expr($key, $value = null)
1914
+ {
1915
+ return $this->_set_orm_property($key, $value, \true);
1916
+ }
1917
+ /**
1918
+ * Set a property on the ORM object.
1919
+ * @param string|array $key
1920
+ * @param string|null $value
1921
+ * @param bool $raw Whether this value should be treated as raw or not
1922
+ */
1923
+ protected function _set_orm_property($key, $value = null, $expr = \false)
1924
+ {
1925
+ if (!\is_array($key)) {
1926
+ $key = array($key => $value);
1927
+ }
1928
+ foreach ($key as $field => $value) {
1929
+ $this->_data[$field] = $value;
1930
+ $this->_dirty_fields[$field] = $value;
1931
+ if (\false === $expr and isset($this->_expr_fields[$field])) {
1932
+ unset($this->_expr_fields[$field]);
1933
+ } else {
1934
+ if (\true === $expr) {
1935
+ $this->_expr_fields[$field] = \true;
1936
+ }
1937
+ }
1938
+ }
1939
+ return $this;
1940
+ }
1941
+ /**
1942
+ * Check whether the given field has been changed since this
1943
+ * object was saved.
1944
+ */
1945
+ public function is_dirty($key)
1946
+ {
1947
+ return \array_key_exists($key, $this->_dirty_fields);
1948
+ }
1949
+ /**
1950
+ * Check whether the model was the result of a call to create() or not
1951
+ * @return bool
1952
+ */
1953
+ public function is_new()
1954
+ {
1955
+ return $this->_is_new;
1956
+ }
1957
+ /**
1958
+ * Save any fields which have been modified on this object
1959
+ * to the database.
1960
+ */
1961
+ public function save()
1962
+ {
1963
+ $query = array();
1964
+ // remove any expression fields as they are already baked into the query
1965
+ $values = \array_values(\array_diff_key($this->_dirty_fields, $this->_expr_fields));
1966
+ if (!$this->_is_new) {
1967
+ // UPDATE
1968
+ // If there are no dirty values, do nothing
1969
+ if (empty($values) && empty($this->_expr_fields)) {
1970
+ return \true;
1971
+ }
1972
+ $query = $this->_build_update();
1973
+ $id = $this->id(\true);
1974
+ if (\is_array($id)) {
1975
+ $values = \array_merge($values, \array_values($id));
1976
+ } else {
1977
+ $values[] = $id;
1978
+ }
1979
+ } else {
1980
+ // INSERT
1981
+ $query = $this->_build_insert();
1982
+ }
1983
+ $success = self::_execute($query, $values, $this->_connection_name);
1984
+ $caching_auto_clear_enabled = self::$_config[$this->_connection_name]['caching_auto_clear'];
1985
+ if ($caching_auto_clear_enabled) {
1986
+ self::clear_cache($this->_table_name, $this->_connection_name);
1987
+ }
1988
+ // If we've just inserted a new record, set the ID of this object
1989
+ if ($this->_is_new) {
1990
+ $this->_is_new = \false;
1991
+ if ($this->count_null_id_columns() != 0) {
1992
+ $db = self::get_db($this->_connection_name);
1993
+ if ($db->getAttribute(\PDO::ATTR_DRIVER_NAME) == 'pgsql') {
1994
+ // it may return several columns if a compound primary
1995
+ // key is used
1996
+ $row = self::get_last_statement()->fetch(\PDO::FETCH_ASSOC);
1997
+ foreach ($row as $key => $value) {
1998
+ $this->_data[$key] = $value;
1999
+ }
2000
+ } else {
2001
+ $column = $this->_get_id_column_name();
2002
+ // if the primary key is compound, assign the last inserted id
2003
+ // to the first column
2004
+ if (\is_array($column)) {
2005
+ $column = \reset($column);
2006
+ }
2007
+ $this->_data[$column] = $db->lastInsertId();
2008
+ }
2009
+ }
2010
+ }
2011
+ $this->_dirty_fields = $this->_expr_fields = array();
2012
+ return $success;
2013
+ }
2014
+ /**
2015
+ * Add a WHERE clause for every column that belongs to the primary key
2016
+ */
2017
+ public function _add_id_column_conditions(&$query)
2018
+ {
2019
+ $query[] = "WHERE";
2020
+ $keys = \is_array($this->_get_id_column_name()) ? $this->_get_id_column_name() : array($this->_get_id_column_name());
2021
+ $first = \true;
2022
+ foreach ($keys as $key) {
2023
+ if ($first) {
2024
+ $first = \false;
2025
+ } else {
2026
+ $query[] = "AND";
2027
+ }
2028
+ $query[] = $this->_quote_identifier($key);
2029
+ $query[] = "= ?";
2030
+ }
2031
+ }
2032
+ /**
2033
+ * Build an UPDATE query
2034
+ */
2035
+ protected function _build_update()
2036
+ {
2037
+ $query = array();
2038
+ $query[] = "UPDATE {$this->_quote_identifier($this->_table_name)} SET";
2039
+ $field_list = array();
2040
+ foreach ($this->_dirty_fields as $key => $value) {
2041
+ if (!\array_key_exists($key, $this->_expr_fields)) {
2042
+ $value = '?';
2043
+ }
2044
+ $field_list[] = "{$this->_quote_identifier($key)} = {$value}";
2045
+ }
2046
+ $query[] = \join(", ", $field_list);
2047
+ $this->_add_id_column_conditions($query);
2048
+ return \join(" ", $query);
2049
+ }
2050
+ /**
2051
+ * Build an INSERT query
2052
+ */
2053
+ protected function _build_insert()
2054
+ {
2055
+ $query[] = "INSERT INTO";
2056
+ $query[] = $this->_quote_identifier($this->_table_name);
2057
+ $field_list = \array_map(array($this, '_quote_identifier'), \array_keys($this->_dirty_fields));
2058
+ $query[] = "(" . \join(", ", $field_list) . ")";
2059
+ $query[] = "VALUES";
2060
+ $placeholders = $this->_create_placeholders($this->_dirty_fields);
2061
+ $query[] = "({$placeholders})";
2062
+ if (self::get_db($this->_connection_name)->getAttribute(\PDO::ATTR_DRIVER_NAME) == 'pgsql') {
2063
+ $query[] = 'RETURNING ' . $this->_quote_identifier($this->_get_id_column_name());
2064
+ }
2065
+ return \join(" ", $query);
2066
+ }
2067
+ /**
2068
+ * Delete this record from the database
2069
+ */
2070
+ public function delete()
2071
+ {
2072
+ $query = array("DELETE FROM", $this->_quote_identifier($this->_table_name));
2073
+ $this->_add_id_column_conditions($query);
2074
+ return self::_execute(\join(" ", $query), \is_array($this->id(\true)) ? \array_values($this->id(\true)) : array($this->id(\true)), $this->_connection_name);
2075
+ }
2076
+ /**
2077
+ * Delete many records from the database
2078
+ */
2079
+ public function delete_many()
2080
+ {
2081
+ // Build and return the full DELETE statement by concatenating
2082
+ // the results of calling each separate builder method.
2083
+ $query = $this->_join_if_not_empty(" ", array("DELETE FROM", $this->_quote_identifier($this->_table_name), $this->_build_where()));
2084
+ return self::_execute($query, $this->_values, $this->_connection_name);
2085
+ }
2086
+ // --------------------- //
2087
+ // --- ArrayAccess --- //
2088
+ // --------------------- //
2089
+ public function offsetExists($key)
2090
+ {
2091
+ return \array_key_exists($key, $this->_data);
2092
+ }
2093
+ public function offsetGet($key)
2094
+ {
2095
+ return $this->get($key);
2096
+ }
2097
+ public function offsetSet($key, $value)
2098
+ {
2099
+ if (\is_null($key)) {
2100
+ throw new \InvalidArgumentException('You must specify a key/array index.');
2101
+ }
2102
+ $this->set($key, $value);
2103
+ }
2104
+ public function offsetUnset($key)
2105
+ {
2106
+ unset($this->_data[$key]);
2107
+ unset($this->_dirty_fields[$key]);
2108
+ }
2109
+ // --------------------- //
2110
+ // --- MAGIC METHODS --- //
2111
+ // --------------------- //
2112
+ public function __get($key)
2113
+ {
2114
+ return $this->offsetGet($key);
2115
+ }
2116
+ public function __set($key, $value)
2117
+ {
2118
+ $this->offsetSet($key, $value);
2119
+ }
2120
+ public function __unset($key)
2121
+ {
2122
+ $this->offsetUnset($key);
2123
+ }
2124
+ public function __isset($key)
2125
+ {
2126
+ return $this->offsetExists($key);
2127
+ }
2128
+ /**
2129
+ * Magic method to capture calls to undefined class methods.
2130
+ * In this case we are attempting to convert camel case formatted
2131
+ * methods into underscore formatted methods.
2132
+ *
2133
+ * This allows us to call ORM methods using camel case and remain
2134
+ * backwards compatible.
2135
+ *
2136
+ * @param string $name
2137
+ * @param array $arguments
2138
+ * @return ORM
2139
+ */
2140
+ public function __call($name, $arguments)
2141
+ {
2142
+ $method = \strtolower(\preg_replace('/([a-z])([A-Z])/', '$1_$2', $name));
2143
+ if (\method_exists($this, $method)) {
2144
+ return \call_user_func_array(array($this, $method), $arguments);
2145
+ } else {
2146
+ throw new \YoastSEO_Vendor\IdiormMethodMissingException("Method {$name}() does not exist in class " . \get_class($this));
2147
+ }
2148
+ }
2149
+ /**
2150
+ * Magic method to capture calls to undefined static class methods.
2151
+ * In this case we are attempting to convert camel case formatted
2152
+ * methods into underscore formatted methods.
2153
+ *
2154
+ * This allows us to call ORM methods using camel case and remain
2155
+ * backwards compatible.
2156
+ *
2157
+ * @param string $name
2158
+ * @param array $arguments
2159
+ * @return ORM
2160
+ */
2161
+ public static function __callStatic($name, $arguments)
2162
+ {
2163
+ $method = \strtolower(\preg_replace('/([a-z])([A-Z])/', '$1_$2', $name));
2164
+ return \call_user_func_array(array('ORM', $method), $arguments);
2165
+ }
2166
+ }
2167
+ /**
2168
+ * A class to handle str_replace operations that involve quoted strings
2169
+ * @example IdiormString::str_replace_outside_quotes('?', '%s', 'columnA = "Hello?" AND columnB = ?');
2170
+ * @example IdiormString::value('columnA = "Hello?" AND columnB = ?')->replace_outside_quotes('?', '%s');
2171
+ * @author Jeff Roberson <ridgerunner@fluxbb.org>
2172
+ * @author Simon Holywell <treffynnon@php.net>
2173
+ * @link http://stackoverflow.com/a/13370709/461813 StackOverflow answer
2174
+ */
2175
+ class IdiormString
2176
+ {
2177
+ protected $subject;
2178
+ protected $search;
2179
+ protected $replace;
2180
+ /**
2181
+ * Get an easy to use instance of the class
2182
+ * @param string $subject
2183
+ * @return \self
2184
+ */
2185
+ public static function value($subject)
2186
+ {
2187
+ return new self($subject);
2188
+ }
2189
+ /**
2190
+ * Shortcut method: Replace all occurrences of the search string with the replacement
2191
+ * string where they appear outside quotes.
2192
+ * @param string $search
2193
+ * @param string $replace
2194
+ * @param string $subject
2195
+ * @return string
2196
+ */
2197
+ public static function str_replace_outside_quotes($search, $replace, $subject)
2198
+ {
2199
+ return self::value($subject)->replace_outside_quotes($search, $replace);
2200
+ }
2201
+ /**
2202
+ * Set the base string object
2203
+ * @param string $subject
2204
+ */
2205
+ public function __construct($subject)
2206
+ {
2207
+ $this->subject = (string) $subject;
2208
+ }
2209
+ /**
2210
+ * Replace all occurrences of the search string with the replacement
2211
+ * string where they appear outside quotes
2212
+ * @param string $search
2213
+ * @param string $replace
2214
+ * @return string
2215
+ */
2216
+ public function replace_outside_quotes($search, $replace)
2217
+ {
2218
+ $this->search = $search;
2219
+ $this->replace = $replace;
2220
+ return $this->_str_replace_outside_quotes();
2221
+ }
2222
+ /**
2223
+ * Validate an input string and perform a replace on all ocurrences
2224
+ * of $this->search with $this->replace
2225
+ * @author Jeff Roberson <ridgerunner@fluxbb.org>
2226
+ * @link http://stackoverflow.com/a/13370709/461813 StackOverflow answer
2227
+ * @return string
2228
+ */
2229
+ protected function _str_replace_outside_quotes()
2230
+ {
2231
+ $re_valid = '/
2232
+ # Validate string having embedded quoted substrings.
2233
+ ^ # Anchor to start of string.
2234
+ (?: # Zero or more string chunks.
2235
+ "[^"\\\\]*(?:\\\\.[^"\\\\]*)*" # Either a double quoted chunk,
2236
+ | \'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\' # or a single quoted chunk,
2237
+ | [^\'"\\\\]+ # or an unquoted chunk (no escapes).
2238
+ )* # Zero or more string chunks.
2239
+ \\z # Anchor to end of string.
2240
+ /sx';
2241
+ if (!\preg_match($re_valid, $this->subject)) {
2242
+ throw new \YoastSEO_Vendor\IdiormStringException("Subject string is not valid in the replace_outside_quotes context.");
2243
+ }
2244
+ $re_parse = '/
2245
+ # Match one chunk of a valid string having embedded quoted substrings.
2246
+ ( # Either $1: Quoted chunk.
2247
+ "[^"\\\\]*(?:\\\\.[^"\\\\]*)*" # Either a double quoted chunk,
2248
+ | \'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\' # or a single quoted chunk.
2249
+ ) # End $1: Quoted chunk.
2250
+ | ([^\'"\\\\]+) # or $2: an unquoted chunk (no escapes).
2251
+ /sx';
2252
+ return \preg_replace_callback($re_parse, array($this, '_str_replace_outside_quotes_cb'), $this->subject);
2253
+ }
2254
+ /**
2255
+ * Process each matching chunk from preg_replace_callback replacing
2256
+ * each occurrence of $this->search with $this->replace
2257
+ * @author Jeff Roberson <ridgerunner@fluxbb.org>
2258
+ * @link http://stackoverflow.com/a/13370709/461813 StackOverflow answer
2259
+ * @param array $matches
2260
+ * @return string
2261
+ */
2262
+ protected function _str_replace_outside_quotes_cb($matches)
2263
+ {
2264
+ // Return quoted string chunks (in group $1) unaltered.
2265
+ if ($matches[1]) {
2266
+ return $matches[1];
2267
+ }
2268
+ // Process only unquoted chunks (in group $2).
2269
+ return \preg_replace('/' . \preg_quote($this->search, '/') . '/', $this->replace, $matches[2]);
2270
+ }
2271
+ }
2272
+ /**
2273
+ * A result set class for working with collections of model instances
2274
+ * @author Simon Holywell <treffynnon@php.net>
2275
+ * @method null setResults(array $results)
2276
+ * @method array getResults()
2277
+ */
2278
+ class IdiormResultSet implements \Countable, \IteratorAggregate, \ArrayAccess, \Serializable
2279
+ {
2280
+ /**
2281
+ * The current result set as an array
2282
+ * @var array
2283
+ */
2284
+ protected $_results = array();
2285
+ /**
2286
+ * Optionally set the contents of the result set by passing in array
2287
+ * @param array $results
2288
+ */
2289
+ public function __construct(array $results = array())
2290
+ {
2291
+ $this->set_results($results);
2292
+ }
2293
+ /**
2294
+ * Set the contents of the result set by passing in array
2295
+ * @param array $results
2296
+ */
2297
+ public function set_results(array $results)
2298
+ {
2299
+ $this->_results = $results;
2300
+ }
2301
+ /**
2302
+ * Get the current result set as an array
2303
+ * @return array
2304
+ */
2305
+ public function get_results()
2306
+ {
2307
+ return $this->_results;
2308
+ }
2309
+ /**
2310
+ * Get the current result set as an array
2311
+ * @return array
2312
+ */
2313
+ public function as_array()
2314
+ {
2315
+ return $this->get_results();
2316
+ }
2317
+ /**
2318
+ * Get the number of records in the result set
2319
+ * @return int
2320
+ */
2321
+ public function count()
2322
+ {
2323
+ return \count($this->_results);
2324
+ }
2325
+ /**
2326
+ * Get an iterator for this object. In this case it supports foreaching
2327
+ * over the result set.
2328
+ * @return \ArrayIterator
2329
+ */
2330
+ public function getIterator()
2331
+ {
2332
+ return new \ArrayIterator($this->_results);
2333
+ }
2334
+ /**
2335
+ * ArrayAccess
2336
+ * @param int|string $offset
2337
+ * @return bool
2338
+ */
2339
+ public function offsetExists($offset)
2340
+ {
2341
+ return isset($this->_results[$offset]);
2342
+ }
2343
+ /**
2344
+ * ArrayAccess
2345
+ * @param int|string $offset
2346
+ * @return mixed
2347
+ */
2348
+ public function offsetGet($offset)
2349
+ {
2350
+ return $this->_results[$offset];
2351
+ }
2352
+ /**
2353
+ * ArrayAccess
2354
+ * @param int|string $offset
2355
+ * @param mixed $value
2356
+ */
2357
+ public function offsetSet($offset, $value)
2358
+ {
2359
+ $this->_results[$offset] = $value;
2360
+ }
2361
+ /**
2362
+ * ArrayAccess
2363
+ * @param int|string $offset
2364
+ */
2365
+ public function offsetUnset($offset)
2366
+ {
2367
+ unset($this->_results[$offset]);
2368
+ }
2369
+ /**
2370
+ * Serializable
2371
+ * @return string
2372
+ */
2373
+ public function serialize()
2374
+ {
2375
+ return \serialize($this->_results);
2376
+ }
2377
+ /**
2378
+ * Serializable
2379
+ * @param string $serialized
2380
+ * @return array
2381
+ */
2382
+ public function unserialize($serialized)
2383
+ {
2384
+ return \unserialize($serialized);
2385
+ }
2386
+ /**
2387
+ * Call a method on all models in a result set. This allows for method
2388
+ * chaining such as setting a property on all models in a result set or
2389
+ * any other batch operation across models.
2390
+ * @example ORM::for_table('Widget')->find_many()->set('field', 'value')->save();
2391
+ * @param string $method
2392
+ * @param array $params
2393
+ * @return \IdiormResultSet
2394
+ */
2395
+ public function __call($method, $params = array())
2396
+ {
2397
+ foreach ($this->_results as $model) {
2398
+ if (\method_exists($model, $method)) {
2399
+ \call_user_func_array(array($model, $method), $params);
2400
+ } else {
2401
+ throw new \YoastSEO_Vendor\IdiormMethodMissingException("Method {$method}() does not exist in class " . \get_class($this));
2402
+ }
2403
+ }
2404
+ return $this;
2405
+ }
2406
+ }
2407
+ /**
2408
+ * A placeholder for exceptions eminating from the IdiormString class
2409
+ */
2410
+ class IdiormStringException extends \Exception
2411
+ {
2412
+ }
2413
+ class IdiormMethodMissingException extends \Exception
2414
+ {
2415
+ }
wp-seo-main.php CHANGED
@@ -15,7 +15,7 @@ if ( ! function_exists( 'add_filter' ) ) {
15
  * {@internal Nobody should be able to overrule the real version number as this can cause
16
  * serious issues with the options, so no if ( ! defined() ).}}
17
  */
18
- define( 'WPSEO_VERSION', '14.0.3' );
19
 
20
 
21
  if ( ! defined( 'WPSEO_PATH' ) ) {
15
  * {@internal Nobody should be able to overrule the real version number as this can cause
16
  * serious issues with the options, so no if ( ! defined() ).}}
17
  */
18
+ define( 'WPSEO_VERSION', '14.0.4' );
19
 
20
 
21
  if ( ! defined( 'WPSEO_PATH' ) ) {
wp-seo.php CHANGED
@@ -8,7 +8,7 @@
8
  *
9
  * @wordpress-plugin
10
  * Plugin Name: Yoast SEO
11
- * Version: 14.0.3
12
  * Plugin URI: https://yoa.st/1uj
13
  * Description: The first true all-in-one SEO solution for WordPress, including on-page content analysis, XML sitemaps and much more.
14
  * Author: Team Yoast
8
  *
9
  * @wordpress-plugin
10
  * Plugin Name: Yoast SEO
11
+ * Version: 14.0.4
12
  * Plugin URI: https://yoa.st/1uj
13
  * Description: The first true all-in-one SEO solution for WordPress, including on-page content analysis, XML sitemaps and much more.
14
  * Author: Team Yoast