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/ornosnippet
. 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 | Yoast SEO |
Version | 14.0.4 |
Comparing to | |
See all releases |
Code changes from version 14.0.3 to 14.0.4
- css/dist/{admin-global-1403-rtl.css → admin-global-1404-rtl.css} +0 -0
- css/dist/{admin-global-1403.css → admin-global-1404.css} +0 -0
- css/dist/{adminbar-1403-rtl.css → adminbar-1404-rtl.css} +0 -0
- css/dist/{adminbar-1403.css → adminbar-1404.css} +0 -0
- css/dist/{alerts-1403-rtl.css → alerts-1404-rtl.css} +0 -0
- css/dist/{alerts-1403.css → alerts-1404.css} +0 -0
- css/dist/{dashboard-1403-rtl.css → dashboard-1404-rtl.css} +0 -0
- css/dist/{dashboard-1403.css → dashboard-1404.css} +0 -0
- css/dist/{edit-page-1403-rtl.css → edit-page-1404-rtl.css} +0 -0
- css/dist/{edit-page-1403.css → edit-page-1404.css} +0 -0
- css/dist/{featured-image-1403-rtl.css → featured-image-1404-rtl.css} +0 -0
- css/dist/{featured-image-1403.css → featured-image-1404.css} +0 -0
- css/dist/{filter-explanation-1403-rtl.css → filter-explanation-1404-rtl.css} +0 -0
- css/dist/{filter-explanation-1403.css → filter-explanation-1404.css} +0 -0
- css/dist/{inside-editor-1403-rtl.css → inside-editor-1404-rtl.css} +0 -0
- css/dist/{inside-editor-1403.css → inside-editor-1404.css} +0 -0
- css/dist/{metabox-1403-rtl.css → metabox-1404-rtl.css} +0 -0
- css/dist/{metabox-1403.css → metabox-1404.css} +0 -0
- css/dist/{metabox-primary-category-1403-rtl.css → metabox-primary-category-1404-rtl.css} +0 -0
- css/dist/{metabox-primary-category-1403.css → metabox-primary-category-1404.css} +0 -0
- css/dist/{monorepo-1403-rtl.css → monorepo-1404-rtl.css} +0 -0
- css/dist/{monorepo-1403.css → monorepo-1404.css} +0 -0
- css/dist/{search-appearance-1403-rtl.css → search-appearance-1404-rtl.css} +0 -0
- css/dist/{search-appearance-1403.css → search-appearance-1404.css} +0 -0
- css/dist/{structured-data-blocks-1403-rtl.css → structured-data-blocks-1404-rtl.css} +0 -0
- css/dist/{structured-data-blocks-1403.css → structured-data-blocks-1404.css} +0 -0
- css/dist/{toggle-switch-1403-rtl.css → toggle-switch-1404-rtl.css} +0 -0
- css/dist/{toggle-switch-1403.css → toggle-switch-1404.css} +0 -0
- css/dist/{wpseo-dismissible-1403-rtl.css → wpseo-dismissible-1404-rtl.css} +0 -0
- css/dist/{wpseo-dismissible-1403.css → wpseo-dismissible-1404.css} +0 -0
- css/dist/{yoast-components-1403-rtl.css → yoast-components-1404-rtl.css} +0 -0
- css/dist/{yoast-components-1403.css → yoast-components-1404.css} +0 -0
- css/dist/{yoast-extensions-1403-rtl.css → yoast-extensions-1404-rtl.css} +0 -0
- css/dist/{yoast-extensions-1403.css → yoast-extensions-1404.css} +0 -0
- css/dist/{yst_plugin_tools-1403-rtl.css → yst_plugin_tools-1404-rtl.css} +0 -0
- css/dist/{yst_plugin_tools-1403.css → yst_plugin_tools-1404.css} +0 -0
- css/dist/{yst_seo_score-1403-rtl.css → yst_seo_score-1404-rtl.css} +0 -0
- css/dist/{yst_seo_score-1403.css → yst_seo_score-1404.css} +0 -0
- inc/class-upgrade.php +9 -2
- inc/options/class-wpseo-option-wpseo.php +6 -1
- js/dist/{analysis-1403.js → analysis-1404.js} +0 -0
- js/dist/{babel-polyfill-1403.js → babel-polyfill-1404.js} +0 -0
- js/dist/{commons-1403.js → commons-1404.js} +0 -0
- js/dist/{components-1403.js → components-1404.js} +0 -0
- js/dist/{configuration-wizard-1403.js → configuration-wizard-1404.js} +0 -0
- js/dist/{help-scout-beacon-1403.js → help-scout-beacon-1404.js} +0 -0
- js/dist/{jed-1403.js → jed-1404.js} +0 -0
- js/dist/{redux-1403.js → redux-1404.js} +0 -0
- js/dist/{search-appearance-1403.js → search-appearance-1404.js} +0 -0
- js/dist/{styled-components-1403.js → styled-components-1404.js} +0 -0
- js/dist/{wp-seo-admin-1403.js → wp-seo-admin-1404.js} +0 -0
- js/dist/{wp-seo-admin-global-1403.js → wp-seo-admin-global-1404.js} +0 -0
- js/dist/{wp-seo-admin-gsc-1403.js → wp-seo-admin-gsc-1404.js} +0 -0
- js/dist/{wp-seo-admin-media-1403.js → wp-seo-admin-media-1404.js} +0 -0
- js/dist/{wp-seo-analysis-worker-1403.js → wp-seo-analysis-worker-1404.js} +0 -0
- js/dist/{wp-seo-api-1403.js → wp-seo-api-1404.js} +0 -0
- js/dist/{wp-seo-bulk-editor-1403.js → wp-seo-bulk-editor-1404.js} +0 -0
- js/dist/{wp-seo-dashboard-widget-1403.js → wp-seo-dashboard-widget-1404.js} +0 -0
- js/dist/{wp-seo-edit-page-1403.js → wp-seo-edit-page-1404.js} +0 -0
- js/dist/{wp-seo-featured-image-1403.js → wp-seo-featured-image-1404.js} +0 -0
- js/dist/{wp-seo-filter-explanation-1403.js → wp-seo-filter-explanation-1404.js} +0 -0
- js/dist/{wp-seo-indexation-1403.js → wp-seo-indexation-1404.js} +0 -0
- js/dist/{wp-seo-metabox-1403.js → wp-seo-metabox-1404.js} +0 -0
- js/dist/{wp-seo-metabox-category-1403.js → wp-seo-metabox-category-1404.js} +0 -0
- js/dist/{wp-seo-modal-1403.js → wp-seo-modal-1404.js} +0 -0
- js/dist/{wp-seo-network-admin-1403.js → wp-seo-network-admin-1404.js} +0 -0
- js/dist/{wp-seo-post-scraper-1403.js → wp-seo-post-scraper-1404.js} +0 -0
- js/dist/{wp-seo-quick-edit-handler-1403.js → wp-seo-quick-edit-handler-1404.js} +0 -0
- js/dist/{wp-seo-recalculate-1403.js → wp-seo-recalculate-1404.js} +0 -0
- js/dist/{wp-seo-reindex-links-1403.js → wp-seo-reindex-links-1404.js} +0 -0
- js/dist/{wp-seo-replacevar-plugin-1403.js → wp-seo-replacevar-plugin-1404.js} +0 -0
- js/dist/{wp-seo-shortcode-plugin-1403.js → wp-seo-shortcode-plugin-1404.js} +0 -0
- js/dist/{wp-seo-structured-data-blocks-1403.js → wp-seo-structured-data-blocks-1404.js} +0 -0
- js/dist/{wp-seo-term-scraper-1403.js → wp-seo-term-scraper-1404.js} +0 -0
- js/dist/{wp-seo-used-keywords-assessment-1403.js → wp-seo-used-keywords-assessment-1404.js} +0 -0
- languages/wordpress-seo-ja.json +1 -1
- languages/wordpress-seo-pl_PL.json +1 -1
- languages/wordpress-seojs-ja.json +1 -1
- languages/yoast-components-ja.json +1 -1
- lib/orm.php +7 -4
- readme.txt +8 -1
- src/config/migrations/20200430150130_ClearIndexableTables.php +48 -0
- vendor/autoload.php +1 -1
- vendor/composer/ClassLoader.php +4 -4
- vendor/composer/autoload_classmap.php +6 -0
- vendor/composer/autoload_real.php +7 -4
- vendor/composer/autoload_static.php +10 -4
- vendor_prefixed/j4mie/idiorm/idiorm.php +2415 -0
- wp-seo-main.php +1 -1
- 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.
|
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
|
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 |
-
$
|
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
|
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('
|
23 |
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
24 |
-
spl_autoload_unregister(array('
|
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\
|
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
|
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 =
|
896 |
-
$loader->prefixDirsPsr4 =
|
897 |
-
$loader->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.
|
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.
|
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
|