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