Version Description
Release Date: April 29th, 2020
Because weve changed the underlying framework of our Indexables technology, weve chosen to rebuild the table. This means you will have to go through the indexing process again. Were sorry. For sites with more than 10,000 posts, we advise using the WP CLI command to do the indexation on the server.
Bugfixes:
- Fixes a bug where a fatal error would be thrown when a title contained more than 191 characters.
- Fixes a bug where a fatal error would be thrown when a focus keyphrase contained more than 191 characters.
- Fixes a bug where a fatal error would be thrown when search engines were disallowed from indexing the site.
- Fixes a bug where a fatal error would be thrown on WooCommerce installations when the
wpseo_metadesc
filter was called with only 1 argument. - Fixes a bug where a fatal error would be thrown when using the
WPSEO_Frontend
class to get the meta description. - Fixes a bug where a fatal error would be thrown when
WPSEO_Frontend
orWPSEO_Breadcrumbs
was called before theinit
action. - Fixes a bug where a non-object property retrieval notice would be thrown when the site's content was being indexed.
- Fixes a bug where a trailing slash would be added to canonical URLs and some
rel="prev"
URLs, even when the permalink structure settings didn't contain that trailing slash. - Fixes a bug where a double breadcrumb would be shown on home pages.
- Fixes a bug where the indexation would continue indefinitely under specific circumstances.
Other:
- Removes all usages of
PDO
andmysqli
directly and useswpdb
everywhere. This should prevent a lot of errors for database installations that have different encodings or configurations than what is generally seen.
Download this release
Release Info
Developer | Yoast |
Plugin | Yoast SEO |
Version | 14.0.2 |
Comparing to | |
See all releases |
Code changes from version 14.0.1 to 14.0.2
- config/php-scoper/idiorm.inc.php +0 -37
- css/dist/{admin-global-1401-rtl.css → admin-global-1402-rtl.css} +0 -0
- css/dist/{admin-global-1401.css → admin-global-1402.css} +0 -0
- css/dist/{adminbar-1401-rtl.css → adminbar-1402-rtl.css} +0 -0
- css/dist/{adminbar-1401.css → adminbar-1402.css} +0 -0
- css/dist/{alerts-1401-rtl.css → alerts-1402-rtl.css} +0 -0
- css/dist/{alerts-1401.css → alerts-1402.css} +0 -0
- css/dist/{dashboard-1401-rtl.css → dashboard-1402-rtl.css} +0 -0
- css/dist/{dashboard-1401.css → dashboard-1402.css} +0 -0
- css/dist/{edit-page-1401-rtl.css → edit-page-1402-rtl.css} +0 -0
- css/dist/{edit-page-1401.css → edit-page-1402.css} +0 -0
- css/dist/{featured-image-1401-rtl.css → featured-image-1402-rtl.css} +0 -0
- css/dist/{featured-image-1401.css → featured-image-1402.css} +0 -0
- css/dist/{filter-explanation-1401-rtl.css → filter-explanation-1402-rtl.css} +0 -0
- css/dist/{filter-explanation-1401.css → filter-explanation-1402.css} +0 -0
- css/dist/{inside-editor-1401-rtl.css → inside-editor-1402-rtl.css} +0 -0
- css/dist/{inside-editor-1401.css → inside-editor-1402.css} +0 -0
- css/dist/{metabox-1401-rtl.css → metabox-1402-rtl.css} +0 -0
- css/dist/{metabox-1401.css → metabox-1402.css} +0 -0
- css/dist/{metabox-primary-category-1401-rtl.css → metabox-primary-category-1402-rtl.css} +0 -0
- css/dist/{metabox-primary-category-1401.css → metabox-primary-category-1402.css} +0 -0
- css/dist/{monorepo-1401-rtl.css → monorepo-1402-rtl.css} +0 -0
- css/dist/{monorepo-1401.css → monorepo-1402.css} +0 -0
- css/dist/{search-appearance-1401-rtl.css → search-appearance-1402-rtl.css} +0 -0
- css/dist/{search-appearance-1401.css → search-appearance-1402.css} +0 -0
- css/dist/{structured-data-blocks-1401-rtl.css → structured-data-blocks-1402-rtl.css} +0 -0
- css/dist/{structured-data-blocks-1401.css → structured-data-blocks-1402.css} +0 -0
- css/dist/{toggle-switch-1401-rtl.css → toggle-switch-1402-rtl.css} +0 -0
- css/dist/{toggle-switch-1401.css → toggle-switch-1402.css} +0 -0
- css/dist/{wpseo-dismissible-1401-rtl.css → wpseo-dismissible-1402-rtl.css} +0 -0
- css/dist/{wpseo-dismissible-1401.css → wpseo-dismissible-1402.css} +0 -0
- css/dist/{yoast-components-1401-rtl.css → yoast-components-1402-rtl.css} +0 -0
- css/dist/{yoast-components-1401.css → yoast-components-1402.css} +0 -0
- css/dist/{yoast-extensions-1401-rtl.css → yoast-extensions-1402-rtl.css} +0 -0
- css/dist/{yoast-extensions-1401.css → yoast-extensions-1402.css} +0 -0
- css/dist/{yst_plugin_tools-1401-rtl.css → yst_plugin_tools-1402-rtl.css} +0 -0
- css/dist/{yst_plugin_tools-1401.css → yst_plugin_tools-1402.css} +0 -0
- css/dist/{yst_seo_score-1401-rtl.css → yst_seo_score-1402-rtl.css} +0 -0
- css/dist/{yst_seo_score-1401.css → yst_seo_score-1402.css} +0 -0
- {src/backwards-compatibility → deprecated/frontend}/breadcrumbs.php +11 -26
- {src/backwards-compatibility → deprecated/frontend}/frontend.php +28 -26
- js/dist/{analysis-1401.js → analysis-1402.js} +0 -0
- js/dist/{babel-polyfill-1401.js → babel-polyfill-1402.js} +0 -0
- js/dist/{commons-1401.js → commons-1402.js} +0 -0
- js/dist/{components-1401.js → components-1402.js} +0 -0
- js/dist/{configuration-wizard-1401.js → configuration-wizard-1402.js} +0 -0
- js/dist/{help-scout-beacon-1401.js → help-scout-beacon-1402.js} +0 -0
- js/dist/{jed-1401.js → jed-1402.js} +0 -0
- js/dist/{redux-1401.js → redux-1402.js} +0 -0
- js/dist/{search-appearance-1401.js → search-appearance-1402.js} +0 -0
- js/dist/{styled-components-1401.js → styled-components-1402.js} +0 -0
- js/dist/{wp-seo-admin-1401.js → wp-seo-admin-1402.js} +0 -0
- js/dist/{wp-seo-admin-global-1401.js → wp-seo-admin-global-1402.js} +0 -0
- js/dist/{wp-seo-admin-gsc-1401.js → wp-seo-admin-gsc-1402.js} +0 -0
- js/dist/{wp-seo-admin-media-1401.js → wp-seo-admin-media-1402.js} +0 -0
- js/dist/{wp-seo-analysis-worker-1401.js → wp-seo-analysis-worker-1402.js} +0 -0
- js/dist/{wp-seo-api-1401.js → wp-seo-api-1402.js} +0 -0
- js/dist/{wp-seo-bulk-editor-1401.js → wp-seo-bulk-editor-1402.js} +0 -0
- js/dist/{wp-seo-dashboard-widget-1401.js → wp-seo-dashboard-widget-1402.js} +0 -0
- js/dist/{wp-seo-edit-page-1401.js → wp-seo-edit-page-1402.js} +0 -0
- js/dist/{wp-seo-featured-image-1401.js → wp-seo-featured-image-1402.js} +0 -0
- js/dist/{wp-seo-filter-explanation-1401.js → wp-seo-filter-explanation-1402.js} +0 -0
- js/dist/{wp-seo-indexation-1401.js → wp-seo-indexation-1402.js} +0 -0
- js/dist/{wp-seo-metabox-1401.js → wp-seo-metabox-1402.js} +0 -0
- js/dist/{wp-seo-metabox-category-1401.js → wp-seo-metabox-category-1402.js} +0 -0
- js/dist/{wp-seo-modal-1401.js → wp-seo-modal-1402.js} +0 -0
- js/dist/{wp-seo-network-admin-1401.js → wp-seo-network-admin-1402.js} +0 -0
- js/dist/{wp-seo-post-scraper-1401.js → wp-seo-post-scraper-1402.js} +0 -0
- js/dist/{wp-seo-quick-edit-handler-1401.js → wp-seo-quick-edit-handler-1402.js} +0 -0
- js/dist/{wp-seo-recalculate-1401.js → wp-seo-recalculate-1402.js} +0 -0
- js/dist/{wp-seo-reindex-links-1401.js → wp-seo-reindex-links-1402.js} +0 -0
- js/dist/{wp-seo-replacevar-plugin-1401.js → wp-seo-replacevar-plugin-1402.js} +0 -0
- js/dist/{wp-seo-shortcode-plugin-1401.js → wp-seo-shortcode-plugin-1402.js} +0 -0
- js/dist/{wp-seo-structured-data-blocks-1401.js → wp-seo-structured-data-blocks-1402.js} +0 -0
- js/dist/{wp-seo-term-scraper-1401.js → wp-seo-term-scraper-1402.js} +0 -0
- js/dist/{wp-seo-used-keywords-assessment-1401.js → wp-seo-used-keywords-assessment-1402.js} +0 -0
- languages/wordpress-seojs-de_DE.json +1 -1
- languages/yoast-components-de_DE.json +1 -1
- src/orm/yoast-model.php → lib/model.php +28 -80
- lib/orm.php +2342 -0
- lib/ruckusing-adapter.php +1084 -0
- lib/ruckusing-framework-runner.php +266 -0
- migrations/20171228151840_WpYoastIndexable.php +2 -2
- migrations/20171228151841_WpYoastPrimaryTerm.php +2 -2
- migrations/20190529075038_WpYoastDropIndexableMetaTableIfExists.php +2 -2
- migrations/20191011111109_WpYoastIndexableHierarchy.php +2 -2
- migrations/20200408101900_AddCollationToTables.php +5 -5
- migrations/20200420073606_AddColumnsToIndexables.php +4 -4
- migrations/20200428123747_BreadcrumbTitleAndHierarchyReset.php +3 -3
- migrations/20200428194858_ExpandIndexableColumnLengths.php +71 -0
- migrations/20200429105310_TruncateIndexableTables.php +48 -0
- polyfills/pdo/pdo-mysqli-polyfill.php +0 -297
- polyfills/pdo/pdo-mysqli-statement-polyfill.php +0 -448
- readme.txt +23 -1
- src/actions/indexation/indexable-post-indexation-action.php +3 -6
- src/actions/indexation/indexable-term-indexation-action.php +3 -6
- src/builders/indexable-builder.php +11 -3
- src/builders/indexable-hierarchy-builder.php +3 -3
- src/config/ruckusing-framework.php +4 -41
- src/generated/container.php +6 -33
- src/generators/breadcrumbs-generator.php +3 -3
- src/helpers/author-archive-helper.php +3 -3
- src/helpers/post-helper.php +4 -4
- src/helpers/robots-helper.php +13 -6
- src/initializers/database-setup.php +0 -115
- src/initializers/migration-runner.php +4 -42
- src/integrations/third-party/woocommerce.php +41 -7
- src/integrations/watchers/indexable-permalink-watcher.php +2 -2
- src/integrations/watchers/indexable-post-watcher.php +0 -4
- src/integrations/watchers/option-titles-watcher.php +5 -5
- src/loggers/database-logger.php +0 -173
- src/models/indexable-extension.php +2 -2
- src/models/indexable-hierarchy.php +2 -2
- src/models/indexable.php +9 -3
- src/models/primary-term.php +2 -2
- src/models/seo-links.php +2 -2
- src/models/seo-meta.php +2 -2
- src/orm/yoast-orm-wrapper.php +0 -234
- src/presenters/admin/indexation-warning-presenter.php +2 -1
- src/repositories/indexable-hierarchy-repository.php +3 -3
- src/repositories/indexable-repository.php +4 -11
- src/repositories/primary-term-repository.php +2 -2
- src/repositories/seo-links-repository.php +2 -2
- src/repositories/seo-meta-repository.php +2 -2
- vendor/composer/autoload_classmap.php +6 -6
- vendor/composer/autoload_static.php +6 -6
- wp-seo-main.php +1 -6
- wp-seo.php +1 -1
config/php-scoper/idiorm.inc.php
DELETED
@@ -1,37 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
declare(strict_types = 1);
|
4 |
-
|
5 |
-
use Isolated\Symfony\Component\Finder\Finder;
|
6 |
-
|
7 |
-
return array(
|
8 |
-
|
9 |
-
/*
|
10 |
-
* By default when running php-scoper add-prefix, it will prefix all relevant code found in the current working
|
11 |
-
* directory. You can however define which files should be scoped by defining a collection of Finders in the
|
12 |
-
* following configuration key.
|
13 |
-
*
|
14 |
-
* For more see: https://github.com/humbug/php-scoper#finders-and-paths
|
15 |
-
*/
|
16 |
-
'finders' => array(
|
17 |
-
Finder::create()->files()->in( 'vendor/j4mie/idiorm' )->name( [ 'idiorm.php', 'LICENSE', 'composer.json' ] ),
|
18 |
-
),
|
19 |
-
|
20 |
-
/*
|
21 |
-
* When scoping PHP files, there will be scenarios where some of the code being scoped indirectly references the
|
22 |
-
* original namespace. These will include, for example, strings or string manipulations. PHP-Scoper has limited
|
23 |
-
* support for prefixing such strings. To circumvent that, you can define patchers to manipulate the file to your
|
24 |
-
* heart contents.
|
25 |
-
*
|
26 |
-
* For more see: https://github.com/humbug/php-scoper#patchers
|
27 |
-
*/
|
28 |
-
'patchers' => array(),
|
29 |
-
|
30 |
-
/*
|
31 |
-
* By default, PHP-Scoper will not prefix the user defined constants, classes and functions belonging to the global
|
32 |
-
* namespace. You can however change that setting for them to be prefixed as usual unless explicitly whitelisted.
|
33 |
-
*
|
34 |
-
* https://github.com/humbug/php-scoper#whitelist
|
35 |
-
*/
|
36 |
-
'whitelist-global-classes' => false,
|
37 |
-
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
css/dist/{admin-global-1401-rtl.css → admin-global-1402-rtl.css}
RENAMED
File without changes
|
css/dist/{admin-global-1401.css → admin-global-1402.css}
RENAMED
File without changes
|
css/dist/{adminbar-1401-rtl.css → adminbar-1402-rtl.css}
RENAMED
File without changes
|
css/dist/{adminbar-1401.css → adminbar-1402.css}
RENAMED
File without changes
|
css/dist/{alerts-1401-rtl.css → alerts-1402-rtl.css}
RENAMED
File without changes
|
css/dist/{alerts-1401.css → alerts-1402.css}
RENAMED
File without changes
|
css/dist/{dashboard-1401-rtl.css → dashboard-1402-rtl.css}
RENAMED
File without changes
|
css/dist/{dashboard-1401.css → dashboard-1402.css}
RENAMED
File without changes
|
css/dist/{edit-page-1401-rtl.css → edit-page-1402-rtl.css}
RENAMED
File without changes
|
css/dist/{edit-page-1401.css → edit-page-1402.css}
RENAMED
File without changes
|
css/dist/{featured-image-1401-rtl.css → featured-image-1402-rtl.css}
RENAMED
File without changes
|
css/dist/{featured-image-1401.css → featured-image-1402.css}
RENAMED
File without changes
|
css/dist/{filter-explanation-1401-rtl.css → filter-explanation-1402-rtl.css}
RENAMED
File without changes
|
css/dist/{filter-explanation-1401.css → filter-explanation-1402.css}
RENAMED
File without changes
|
css/dist/{inside-editor-1401-rtl.css → inside-editor-1402-rtl.css}
RENAMED
File without changes
|
css/dist/{inside-editor-1401.css → inside-editor-1402.css}
RENAMED
File without changes
|
css/dist/{metabox-1401-rtl.css → metabox-1402-rtl.css}
RENAMED
File without changes
|
css/dist/{metabox-1401.css → metabox-1402.css}
RENAMED
File without changes
|
css/dist/{metabox-primary-category-1401-rtl.css → metabox-primary-category-1402-rtl.css}
RENAMED
File without changes
|
css/dist/{metabox-primary-category-1401.css → metabox-primary-category-1402.css}
RENAMED
File without changes
|
css/dist/{monorepo-1401-rtl.css → monorepo-1402-rtl.css}
RENAMED
File without changes
|
css/dist/{monorepo-1401.css → monorepo-1402.css}
RENAMED
File without changes
|
css/dist/{search-appearance-1401-rtl.css → search-appearance-1402-rtl.css}
RENAMED
File without changes
|
css/dist/{search-appearance-1401.css → search-appearance-1402.css}
RENAMED
File without changes
|
css/dist/{structured-data-blocks-1401-rtl.css → structured-data-blocks-1402-rtl.css}
RENAMED
File without changes
|
css/dist/{structured-data-blocks-1401.css → structured-data-blocks-1402.css}
RENAMED
File without changes
|
css/dist/{toggle-switch-1401-rtl.css → toggle-switch-1402-rtl.css}
RENAMED
File without changes
|
css/dist/{toggle-switch-1401.css → toggle-switch-1402.css}
RENAMED
File without changes
|
css/dist/{wpseo-dismissible-1401-rtl.css → wpseo-dismissible-1402-rtl.css}
RENAMED
File without changes
|
css/dist/{wpseo-dismissible-1401.css → wpseo-dismissible-1402.css}
RENAMED
File without changes
|
css/dist/{yoast-components-1401-rtl.css → yoast-components-1402-rtl.css}
RENAMED
File without changes
|
css/dist/{yoast-components-1401.css → yoast-components-1402.css}
RENAMED
File without changes
|
css/dist/{yoast-extensions-1401-rtl.css → yoast-extensions-1402-rtl.css}
RENAMED
File without changes
|
css/dist/{yoast-extensions-1401.css → yoast-extensions-1402.css}
RENAMED
File without changes
|
css/dist/{yst_plugin_tools-1401-rtl.css → yst_plugin_tools-1402-rtl.css}
RENAMED
File without changes
|
css/dist/{yst_plugin_tools-1401.css → yst_plugin_tools-1402.css}
RENAMED
File without changes
|
css/dist/{yst_seo_score-1401-rtl.css → yst_seo_score-1402-rtl.css}
RENAMED
File without changes
|
css/dist/{yst_seo_score-1401.css → yst_seo_score-1402.css}
RENAMED
File without changes
|
{src/backwards-compatibility → deprecated/frontend}/breadcrumbs.php
RENAMED
@@ -5,8 +5,6 @@
|
|
5 |
* @package Yoast\YoastSEO\Backwards_Compatibility
|
6 |
*/
|
7 |
|
8 |
-
use Yoast\WP\SEO\Conditionals\No_Conditionals;
|
9 |
-
use Yoast\WP\SEO\Initializers\Initializer_Interface;
|
10 |
use Yoast\WP\SEO\Memoizers\Meta_Tags_Context_Memoizer;
|
11 |
use Yoast\WP\SEO\Presenters\Breadcrumbs_Presenter;
|
12 |
use Yoast\WP\SEO\Surfaces\Helpers_Surface;
|
@@ -16,9 +14,7 @@ use Yoast\WP\SEO\Surfaces\Helpers_Surface;
|
|
16 |
*
|
17 |
* @codeCoverageIgnore Because of deprecation.
|
18 |
*/
|
19 |
-
class WPSEO_Breadcrumbs
|
20 |
-
|
21 |
-
use No_Conditionals;
|
22 |
|
23 |
/**
|
24 |
* Instance of this class.
|
@@ -64,26 +60,11 @@ class WPSEO_Breadcrumbs implements Initializer_Interface {
|
|
64 |
|
65 |
/**
|
66 |
* WPSEO_Breadcrumbs constructor.
|
67 |
-
*
|
68 |
-
* @param Meta_Tags_Context_Memoizer $context_memoizer The context memoizer.
|
69 |
-
* @param Helpers_Surface $helpers The helpers surface.
|
70 |
-
* @param WPSEO_Replace_Vars $replace_vars The replace vars helper.
|
71 |
-
*/
|
72 |
-
public function __construct(
|
73 |
-
Meta_Tags_Context_Memoizer $context_memoizer,
|
74 |
-
Helpers_Surface $helpers,
|
75 |
-
WPSEO_Replace_Vars $replace_vars
|
76 |
-
) {
|
77 |
-
$this->context_memoizer = $context_memoizer;
|
78 |
-
$this->helpers = $helpers;
|
79 |
-
$this->replace_vars = $replace_vars;
|
80 |
-
}
|
81 |
-
|
82 |
-
/**
|
83 |
-
* We use an initializer so the static functions will work right as our plugin is loaded just as they normally would.
|
84 |
*/
|
85 |
-
public function
|
86 |
-
|
|
|
|
|
87 |
}
|
88 |
|
89 |
/**
|
@@ -99,7 +80,7 @@ class WPSEO_Breadcrumbs implements Initializer_Interface {
|
|
99 |
// Remember the last used before/after for use in case the object goes __toString().
|
100 |
self::$before = $before;
|
101 |
self::$after = $after;
|
102 |
-
$output = $before . self
|
103 |
|
104 |
if ( $display === true ) {
|
105 |
echo $output;
|
@@ -122,9 +103,13 @@ class WPSEO_Breadcrumbs implements Initializer_Interface {
|
|
122 |
/**
|
123 |
* Retrieves an instance of the class.
|
124 |
*
|
125 |
-
* @return
|
126 |
*/
|
127 |
public static function get_instance() {
|
|
|
|
|
|
|
|
|
128 |
return self::$instance;
|
129 |
}
|
130 |
|
5 |
* @package Yoast\YoastSEO\Backwards_Compatibility
|
6 |
*/
|
7 |
|
|
|
|
|
8 |
use Yoast\WP\SEO\Memoizers\Meta_Tags_Context_Memoizer;
|
9 |
use Yoast\WP\SEO\Presenters\Breadcrumbs_Presenter;
|
10 |
use Yoast\WP\SEO\Surfaces\Helpers_Surface;
|
14 |
*
|
15 |
* @codeCoverageIgnore Because of deprecation.
|
16 |
*/
|
17 |
+
class WPSEO_Breadcrumbs {
|
|
|
|
|
18 |
|
19 |
/**
|
20 |
* Instance of this class.
|
60 |
|
61 |
/**
|
62 |
* WPSEO_Breadcrumbs constructor.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
63 |
*/
|
64 |
+
public function __construct() {
|
65 |
+
$this->context_memoizer = YoastSEO()->classes->get( Meta_Tags_Context_Memoizer::class );
|
66 |
+
$this->helpers = YoastSEO()->classes->get( Helpers_Surface::class );
|
67 |
+
$this->replace_vars = YoastSEO()->classes->get( WPSEO_Replace_Vars::class );
|
68 |
}
|
69 |
|
70 |
/**
|
80 |
// Remember the last used before/after for use in case the object goes __toString().
|
81 |
self::$before = $before;
|
82 |
self::$after = $after;
|
83 |
+
$output = $before . self::get_instance()->render() . $after;
|
84 |
|
85 |
if ( $display === true ) {
|
86 |
echo $output;
|
103 |
/**
|
104 |
* Retrieves an instance of the class.
|
105 |
*
|
106 |
+
* @return static The instance.
|
107 |
*/
|
108 |
public static function get_instance() {
|
109 |
+
if ( is_null( self::$instance ) ) {
|
110 |
+
self::$instance = new self();
|
111 |
+
}
|
112 |
+
|
113 |
return self::$instance;
|
114 |
}
|
115 |
|
{src/backwards-compatibility → deprecated/frontend}/frontend.php
RENAMED
@@ -5,20 +5,20 @@
|
|
5 |
* @package Yoast\YoastSEO\Backwards_Compatibility
|
6 |
*/
|
7 |
|
8 |
-
use Yoast\WP\SEO\Initializers\Initializer_Interface;
|
9 |
use Yoast\WP\SEO\Memoizers\Meta_Tags_Context_Memoizer;
|
10 |
use Yoast\WP\SEO\Presenters\Canonical_Presenter;
|
11 |
use Yoast\WP\SEO\Presenters\Meta_Description_Presenter;
|
12 |
use Yoast\WP\SEO\Presenters\Rel_Next_Presenter;
|
13 |
use Yoast\WP\SEO\Presenters\Rel_Prev_Presenter;
|
14 |
use Yoast\WP\SEO\Presenters\Robots_Presenter;
|
|
|
15 |
|
16 |
/**
|
17 |
* Class WPSEO_Frontend
|
18 |
*
|
19 |
* @codeCoverageIgnore Because of deprecation.
|
20 |
*/
|
21 |
-
class WPSEO_Frontend
|
22 |
/**
|
23 |
* Instance of this class.
|
24 |
*
|
@@ -41,31 +41,19 @@ class WPSEO_Frontend implements Initializer_Interface {
|
|
41 |
private $replace_vars;
|
42 |
|
43 |
/**
|
44 |
-
*
|
|
|
|
|
45 |
*/
|
46 |
-
|
47 |
-
self::$instance = $this;
|
48 |
-
}
|
49 |
|
50 |
/**
|
51 |
-
*
|
52 |
*/
|
53 |
-
public
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
/**
|
58 |
-
* WPSEO_Breadcrumbs constructor.
|
59 |
-
*
|
60 |
-
* @param Meta_Tags_Context_Memoizer $context_memoizer The context memoizer.
|
61 |
-
* @param \WPSEO_Replace_Vars $replace_vars The replace vars helper.
|
62 |
-
*/
|
63 |
-
public function __construct(
|
64 |
-
Meta_Tags_Context_Memoizer $context_memoizer,
|
65 |
-
WPSEO_Replace_Vars $replace_vars
|
66 |
-
) {
|
67 |
-
$this->context_memoizer = $context_memoizer;
|
68 |
-
$this->replace_vars = $replace_vars;
|
69 |
}
|
70 |
|
71 |
/**
|
@@ -101,6 +89,10 @@ class WPSEO_Frontend implements Initializer_Interface {
|
|
101 |
* @return static The instance.
|
102 |
*/
|
103 |
public static function get_instance() {
|
|
|
|
|
|
|
|
|
104 |
return self::$instance;
|
105 |
}
|
106 |
|
@@ -121,9 +113,11 @@ class WPSEO_Frontend implements Initializer_Interface {
|
|
121 |
return $context->presentation->canonical;
|
122 |
}
|
123 |
|
124 |
-
$
|
125 |
-
$
|
126 |
-
|
|
|
|
|
127 |
}
|
128 |
|
129 |
/**
|
@@ -148,6 +142,8 @@ class WPSEO_Frontend implements Initializer_Interface {
|
|
148 |
$context = $this->context_memoizer->for_current_page();
|
149 |
$presenter = new Robots_Presenter();
|
150 |
$presenter->presentation = $context->presentation;
|
|
|
|
|
151 |
echo $presenter->present();
|
152 |
}
|
153 |
|
@@ -230,10 +226,14 @@ class WPSEO_Frontend implements Initializer_Interface {
|
|
230 |
|
231 |
$rel_prev_presenter = new Rel_Prev_Presenter();
|
232 |
$rel_prev_presenter->presentation = $context->presentation;
|
|
|
|
|
233 |
echo $rel_prev_presenter->present();
|
234 |
|
235 |
$rel_next_presenter = new Rel_Next_Presenter();
|
236 |
$rel_next_presenter->presentation = $context->presentation;
|
|
|
|
|
237 |
echo $rel_next_presenter->present();
|
238 |
}
|
239 |
|
@@ -255,6 +255,8 @@ class WPSEO_Frontend implements Initializer_Interface {
|
|
255 |
|
256 |
$presenter = new Meta_Description_Presenter();
|
257 |
$presenter->presentation = $context->presentation;
|
|
|
|
|
258 |
$presenter->present();
|
259 |
}
|
260 |
}
|
5 |
* @package Yoast\YoastSEO\Backwards_Compatibility
|
6 |
*/
|
7 |
|
|
|
8 |
use Yoast\WP\SEO\Memoizers\Meta_Tags_Context_Memoizer;
|
9 |
use Yoast\WP\SEO\Presenters\Canonical_Presenter;
|
10 |
use Yoast\WP\SEO\Presenters\Meta_Description_Presenter;
|
11 |
use Yoast\WP\SEO\Presenters\Rel_Next_Presenter;
|
12 |
use Yoast\WP\SEO\Presenters\Rel_Prev_Presenter;
|
13 |
use Yoast\WP\SEO\Presenters\Robots_Presenter;
|
14 |
+
use Yoast\WP\SEO\Surfaces\Helpers_Surface;
|
15 |
|
16 |
/**
|
17 |
* Class WPSEO_Frontend
|
18 |
*
|
19 |
* @codeCoverageIgnore Because of deprecation.
|
20 |
*/
|
21 |
+
class WPSEO_Frontend {
|
22 |
/**
|
23 |
* Instance of this class.
|
24 |
*
|
41 |
private $replace_vars;
|
42 |
|
43 |
/**
|
44 |
+
* The helpers surface.
|
45 |
+
*
|
46 |
+
* @var Helpers_Surface
|
47 |
*/
|
48 |
+
private $helpers;
|
|
|
|
|
49 |
|
50 |
/**
|
51 |
+
* WPSEO_Frontend constructor.
|
52 |
*/
|
53 |
+
public function __construct() {
|
54 |
+
$this->context_memoizer = YoastSEO()->classes->get( Meta_Tags_Context_Memoizer::class );
|
55 |
+
$this->replace_vars = YoastSEO()->classes->get( WPSEO_Replace_Vars::class );
|
56 |
+
$this->helpers = YoastSEO()->classes->get( Helpers_Surface::class );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
57 |
}
|
58 |
|
59 |
/**
|
89 |
* @return static The instance.
|
90 |
*/
|
91 |
public static function get_instance() {
|
92 |
+
if ( is_null( self::$instance ) ) {
|
93 |
+
self::$instance = new self();
|
94 |
+
}
|
95 |
+
|
96 |
return self::$instance;
|
97 |
}
|
98 |
|
113 |
return $context->presentation->canonical;
|
114 |
}
|
115 |
|
116 |
+
$presenter = new Canonical_Presenter();
|
117 |
+
$presenter->presentation = $context->presentation;
|
118 |
+
$presenter->helpers = $this->helpers;
|
119 |
+
$presenter->replace_vars = $this->replace_vars;
|
120 |
+
echo $presenter->present();
|
121 |
}
|
122 |
|
123 |
/**
|
142 |
$context = $this->context_memoizer->for_current_page();
|
143 |
$presenter = new Robots_Presenter();
|
144 |
$presenter->presentation = $context->presentation;
|
145 |
+
$presenter->helpers = $this->helpers;
|
146 |
+
$presenter->replace_vars = $this->replace_vars;
|
147 |
echo $presenter->present();
|
148 |
}
|
149 |
|
226 |
|
227 |
$rel_prev_presenter = new Rel_Prev_Presenter();
|
228 |
$rel_prev_presenter->presentation = $context->presentation;
|
229 |
+
$rel_prev_presenter->helpers = $this->helpers;
|
230 |
+
$rel_prev_presenter->replace_vars = $this->replace_vars;
|
231 |
echo $rel_prev_presenter->present();
|
232 |
|
233 |
$rel_next_presenter = new Rel_Next_Presenter();
|
234 |
$rel_next_presenter->presentation = $context->presentation;
|
235 |
+
$rel_next_presenter->helpers = $this->helpers;
|
236 |
+
$rel_next_presenter->replace_vars = $this->replace_vars;
|
237 |
echo $rel_next_presenter->present();
|
238 |
}
|
239 |
|
255 |
|
256 |
$presenter = new Meta_Description_Presenter();
|
257 |
$presenter->presentation = $context->presentation;
|
258 |
+
$presenter->helpers = $this->helpers;
|
259 |
+
$presenter->replace_vars = $this->replace_vars;
|
260 |
$presenter->present();
|
261 |
}
|
262 |
}
|
js/dist/{analysis-1401.js → analysis-1402.js}
RENAMED
File without changes
|
js/dist/{babel-polyfill-1401.js → babel-polyfill-1402.js}
RENAMED
File without changes
|
js/dist/{commons-1401.js → commons-1402.js}
RENAMED
File without changes
|
js/dist/{components-1401.js → components-1402.js}
RENAMED
File without changes
|
js/dist/{configuration-wizard-1401.js → configuration-wizard-1402.js}
RENAMED
File without changes
|
js/dist/{help-scout-beacon-1401.js → help-scout-beacon-1402.js}
RENAMED
File without changes
|
js/dist/{jed-1401.js → jed-1402.js}
RENAMED
File without changes
|
js/dist/{redux-1401.js → redux-1402.js}
RENAMED
File without changes
|
js/dist/{search-appearance-1401.js → search-appearance-1402.js}
RENAMED
File without changes
|
js/dist/{styled-components-1401.js → styled-components-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-admin-1401.js → wp-seo-admin-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-admin-global-1401.js → wp-seo-admin-global-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-admin-gsc-1401.js → wp-seo-admin-gsc-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-admin-media-1401.js → wp-seo-admin-media-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-analysis-worker-1401.js → wp-seo-analysis-worker-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-api-1401.js → wp-seo-api-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-bulk-editor-1401.js → wp-seo-bulk-editor-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-dashboard-widget-1401.js → wp-seo-dashboard-widget-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-edit-page-1401.js → wp-seo-edit-page-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-featured-image-1401.js → wp-seo-featured-image-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-filter-explanation-1401.js → wp-seo-filter-explanation-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-indexation-1401.js → wp-seo-indexation-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-metabox-1401.js → wp-seo-metabox-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-metabox-category-1401.js → wp-seo-metabox-category-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-modal-1401.js → wp-seo-modal-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-network-admin-1401.js → wp-seo-network-admin-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-post-scraper-1401.js → wp-seo-post-scraper-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-quick-edit-handler-1401.js → wp-seo-quick-edit-handler-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-recalculate-1401.js → wp-seo-recalculate-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-reindex-links-1401.js → wp-seo-reindex-links-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-replacevar-plugin-1401.js → wp-seo-replacevar-plugin-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-shortcode-plugin-1401.js → wp-seo-shortcode-plugin-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-structured-data-blocks-1401.js → wp-seo-structured-data-blocks-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-term-scraper-1401.js → wp-seo-term-scraper-1402.js}
RENAMED
File without changes
|
js/dist/{wp-seo-used-keywords-assessment-1401.js → wp-seo-used-keywords-assessment-1402.js}
RENAMED
File without changes
|
languages/wordpress-seojs-de_DE.json
CHANGED
@@ -1 +1 @@
|
|
1 |
-
{"domain":"wordpress-seo","locale_data":{"wordpress-seo":{"":{"domain":"wordpress-seo","plural-forms":"nplurals=2; plural=n != 1;","lang":"de"},"Google preview":["Google-Vorschau"],"When you click OK we will open our HelpScout beacon where you can find answers to your questions. This beacon will load our support data and also potentially set cookies.":[],"Schema":["Schema"],"Truly optimize your site for a local audience with our %s plugin! Optimized address details, opening hours, store locator and pickup option!":["Optimiere deine Website für ein lokales Publikum mit unserem %s-Plugin! Optimierte Adressdaten, Öffnungszeiten, Filialfinder und Abhol-Option!"],"Serving local customers?":["Betreuung lokaler Kunden?"],"Get the %s plugin now":["Hol dir jetzt das %s-Plugin"],"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.":["Du kannst die Angaben zu sozialen Profilen, den Namen und die Beschreibung dieses Benutzers, die in den Metadaten sichtbar sind, auf dessen %1$s Profilseite bearbeiten."],"Select a user...":["Wähle einen Benutzer…"],"Name:":["Name:"],"You have selected the user %1$s as the person this site represents. Their user profile information will now be used in search results. %2$sUpdate their profile to make sure the information is correct.%3$s":["Du hast den Benutzer %1$s als die Person ausgewählt, den diese Website repräsentiert. Die Daten aus dem Benutzerprofil dieses Benutzers werden jetzt in den Suchergebnissen verwendet. %2$sAktualisiere dieses Benutzerprofil, um sicherzustellen, dass die Angaben korrekt sind.%3$s"],"Error: Please select a user below to make your site's meta data complete.":["Fehler: Bitte unten einen Benutzer auswählen, um die Metadaten deiner Website zu komplettieren."],"New step added":["Neuer Schritt hinzugefügt"],"New question added":["Neue Frage hinzugefügt"],"Did you know %s also analyzes the different word forms of your keyphrase, like plurals and past tenses?":["Wusstest du schon, dass %s auch Plural- oder Zeitformen deiner Keyphrase analysiert?"],"Help on choosing the perfect focus keyphrase":["Hilfe bei der Auswahl des perfekten Fokus-Schlüsselworts"],"Would you like to add a related keyphrase?":["Möchtest du eine verwandte Keyphrase hinzufügen?"],"Go %s!":["Start %s!"],"Rank better with synonyms & related keyphrases":["Ranke besser mit Synonymen & verwandten Keyphrasen."],"Add related keyphrase":["Ähnliches Keyword hinzufügen"],"Get %s":["Erhalte %s"],"Focus keyphrase":["Fokus-Keyphrase"],"Learn more about the readability analysis":["Lerne mehr über die Lesbarkeitsanalyse"],"Describe the duration of the instruction:":["Beschreibe die Dauer der Anleitung:"],"Optional. Customize how you want to describe the duration of the instruction":["Optional. Passe an, wie du die Dauer der Anleitung beschreiben möchtest. "],"%s, %s and %s":["%s, %s und %s"],"%s and %s":["%s und %s"],"%d minute":["%d Minute","%d Minuten"],"%d hour":["%d Stunde","%d Stunden"],"%d day":["%d Tag","%d Tage"],"Enter a step title":["Schritt-Titel eingeben"],"Optional. This can give you better control over the styling of the steps.":["Optional. Dies kann dir eine bessere Kontrolle über das Styling der Schritte geben."],"CSS class(es) to apply to the steps":["CSS-Klasse(n), die auf die Schritte angewendet werden sollen"],"minutes":["Minuten"],"hours":["Stunden"],"days":["Tage"],"Create a How-to guide in an SEO-friendly way. You can only use one How-to block per post.":["Erstelle eine Anleitung auf SEO-freundliche Weise. Du kannst nur einen How-to-Absatz pro Beitrag verwenden."],"List your Frequently Asked Questions in an SEO-friendly way. You can only use one FAQ block per post.":["Liste deine häufig gestellten Fragen SEO-freundlich auf. Du kannst nur einen FAQ-Absatz pro Bericht verwenden."],"Copy error":["Fehler kopieren"],"An error occurred loading the %s primary taxonomy picker.":["Beim Laden des primären Taxonomie-Pickers %s ist ein Fehler aufgetreten."],"Time needed:":["Benötigte Zeit:"],"Move question down":["Frage nach unten verschieben"],"Move question up":["Frage nach oben verschieben"],"Insert question":["Frage hinzufügen"],"Delete question":["Frage löschen"],"Enter the answer to the question":["Antwort auf die Frage eingeben"],"Enter a question":["Gib eine Frage ein"],"Add question":["Frage hinzufügen"],"Frequently Asked Questions":["Häufig gestellte Fragen (FAQ)"],"Great news: you can, with %s!":["Tolle Neuigkeiten: Du kannst es, mit %s!"],"Select the primary %s":["Wähle die primären %s"],"Mark as cornerstone content":["Als Cornerstone-Inhalt markieren"],"Move step down":["Schritt nach unten verschieben"],"Move step up":["Schritt nach oben verschieben"],"Insert step":["Schritt einfügen"],"Delete step":["Schritt löschen"],"Add image":["Bild hinzufügen"],"Enter a step description":["Gib eine Beschreibung für den Schritt ein"],"Enter a description":["Gib eine Beschreibung ein"],"Unordered list":["Unsortierte Liste"],"Showing step items as an ordered list.":["Schritt-Elemente als geordnete Liste anzeigen."],"Showing step items as an unordered list":["Schritt-Elemente als ungeordnete Liste anzeigen"],"Add step":["Schritt hinzufügen"],"Delete total time":["Gesamtzeit löschen"],"Add total time":["Gesamtzeit hinzufügen"],"How to":["Anleitung"],"How-to":["Anleitung"],"Analysis results":["Analyse-Ergebnisse"],"Enter a focus keyphrase to calculate the SEO score":["Gib ein Fokus-Keyword ein, um den SEO-Wert zu berechnen"],"Learn more about Cornerstone Content.":["Erfahre mehr über Cornerstone-Inhalte."],"Cornerstone content should be the most important and extensive articles on your site.":["Cornerstone-Inhalte sollten die wichtigsten und umfassendsten Artikel deiner Seite sein."],"Add synonyms":["Synonyme hinzufügen"],"Would you like to add keyphrase synonyms?":["Möchtest du Keyphrase-Synonyme hinzufügen?"],"Current year":["Aktuelles Jahr"],"Page":["Seite"],"Tagline":["Untertitel"],"Modify your meta description by editing it right here":["Bearbeite direkt hier deine Meta-Beschreibung "],"ID":["ID"],"Separator":["Trennzeichen"],"Search phrase":["Suchwort"],"Term description":["Begriffsbeschreibung"],"Tag description":["Schlagwortbeschreibung"],"Category description":["Kategoriebeschreibung"],"Primary category":["Primäre Kategorie"],"Category":["Kategorie"],"Excerpt only":["Nur Auszug"],"Excerpt":["Textauszug"],"Site title":["Titel der Website"],"Parent title":["Titel der übergeordneten Seite"],"Date":["Datum"],"24/7 email support":["24/7 E-Mail-Support"],"SEO analysis":["SEO Analyse"],"Other benefits of %s for you:":["Andere Vorteile von %s für dich:"],"Cornerstone content":["Cornerstone-Inhalt"],"Superfast internal linking suggestions":["Superschnelle Vorschläge zur internen Verlinkung"],"Great news: you can, with %1$s!":["Großartige Neuigkeit: Du kannst es, mit %1$s!"],"1 year free support and updates included!":["1 Jahr kostenfreie Updates und Upgrades inbegriffen!"],"%1$sSocial media preview%2$s: Facebook & Twitter":["%1$sSocial Media Vorschau%2$s: Facebook & Twitter"],"%1$sNo more dead links%2$s: easy redirect manager":["%1$sKeine verwaisten Links mehr%2$s: Einfacher Redirect-Manager"],"No ads!":["Keine Werbung!"],"Please provide a meta description by editing the snippet below.":["Bitte lege eine Meta-Beschreibung fest, indem du den Code-Schnipsel bearbeitest."],"The name of the person":["Der Name der Person"],"Readability analysis":["Lesbarkeits-Analyse"],"Open":["Offen"],"Title":["Titel"],"Close":["Schließen"],"FAQ":["FAQ"],"Settings":["Einstellungen"]}}}
|
1 |
+
{"domain":"wordpress-seo","locale_data":{"wordpress-seo":{"":{"domain":"wordpress-seo","plural-forms":"nplurals=2; plural=n != 1;","lang":"de"},"Google preview":["Google-Vorschau"],"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.":["Wenn du auf OK klickst, öffnen wir unseren HelpScout-Beacon, in dem du Antworten auf deine Fragen finden kannst. Dieses Beacon lädt unsere Supportdaten und setzt möglicherweise Cookies."],"Schema":["Schema"],"Truly optimize your site for a local audience with our %s plugin! Optimized address details, opening hours, store locator and pickup option!":["Optimiere deine Website für ein lokales Publikum mit unserem %s-Plugin! Optimierte Adressdaten, Öffnungszeiten, Filialfinder und Abhol-Option!"],"Serving local customers?":["Betreuung lokaler Kunden?"],"Get the %s plugin now":["Hol dir jetzt das %s-Plugin"],"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.":["Du kannst die Angaben zu sozialen Profilen, den Namen und die Beschreibung dieses Benutzers, die in den Metadaten sichtbar sind, auf dessen %1$s Profilseite bearbeiten."],"Select a user...":["Wähle einen Benutzer…"],"Name:":["Name:"],"You have selected the user %1$s as the person this site represents. Their user profile information will now be used in search results. %2$sUpdate their profile to make sure the information is correct.%3$s":["Du hast den Benutzer %1$s als die Person ausgewählt, den diese Website repräsentiert. Die Daten aus dem Benutzerprofil dieses Benutzers werden jetzt in den Suchergebnissen verwendet. %2$sAktualisiere dieses Benutzerprofil, um sicherzustellen, dass die Angaben korrekt sind.%3$s"],"Error: Please select a user below to make your site's meta data complete.":["Fehler: Bitte unten einen Benutzer auswählen, um die Metadaten deiner Website zu komplettieren."],"New step added":["Neuer Schritt hinzugefügt"],"New question added":["Neue Frage hinzugefügt"],"Did you know %s also analyzes the different word forms of your keyphrase, like plurals and past tenses?":["Wusstest du schon, dass %s auch Plural- oder Zeitformen deiner Keyphrase analysiert?"],"Help on choosing the perfect focus keyphrase":["Hilfe bei der Auswahl des perfekten Fokus-Schlüsselworts"],"Would you like to add a related keyphrase?":["Möchtest du eine verwandte Keyphrase hinzufügen?"],"Go %s!":["Start %s!"],"Rank better with synonyms & related keyphrases":["Ranke besser mit Synonymen & verwandten Keyphrasen."],"Add related keyphrase":["Ähnliches Keyword hinzufügen"],"Get %s":["Erhalte %s"],"Focus keyphrase":["Fokus-Keyphrase"],"Learn more about the readability analysis":["Lerne mehr über die Lesbarkeitsanalyse"],"Describe the duration of the instruction:":["Beschreibe die Dauer der Anleitung:"],"Optional. Customize how you want to describe the duration of the instruction":["Optional. Passe an, wie du die Dauer der Anleitung beschreiben möchtest. "],"%s, %s and %s":["%s, %s und %s"],"%s and %s":["%s und %s"],"%d minute":["%d Minute","%d Minuten"],"%d hour":["%d Stunde","%d Stunden"],"%d day":["%d Tag","%d Tage"],"Enter a step title":["Schritt-Titel eingeben"],"Optional. This can give you better control over the styling of the steps.":["Optional. Dies kann dir eine bessere Kontrolle über das Styling der Schritte geben."],"CSS class(es) to apply to the steps":["CSS-Klasse(n), die auf die Schritte angewendet werden sollen"],"minutes":["Minuten"],"hours":["Stunden"],"days":["Tage"],"Create a How-to guide in an SEO-friendly way. You can only use one How-to block per post.":["Erstelle eine Anleitung auf SEO-freundliche Weise. Du kannst nur einen How-to-Absatz pro Beitrag verwenden."],"List your Frequently Asked Questions in an SEO-friendly way. You can only use one FAQ block per post.":["Liste deine häufig gestellten Fragen SEO-freundlich auf. Du kannst nur einen FAQ-Absatz pro Bericht verwenden."],"Copy error":["Fehler kopieren"],"An error occurred loading the %s primary taxonomy picker.":["Beim Laden des primären Taxonomie-Pickers %s ist ein Fehler aufgetreten."],"Time needed:":["Benötigte Zeit:"],"Move question down":["Frage nach unten verschieben"],"Move question up":["Frage nach oben verschieben"],"Insert question":["Frage hinzufügen"],"Delete question":["Frage löschen"],"Enter the answer to the question":["Antwort auf die Frage eingeben"],"Enter a question":["Gib eine Frage ein"],"Add question":["Frage hinzufügen"],"Frequently Asked Questions":["Häufig gestellte Fragen (FAQ)"],"Great news: you can, with %s!":["Tolle Neuigkeiten: Du kannst es, mit %s!"],"Select the primary %s":["Wähle die primären %s"],"Mark as cornerstone content":["Als Cornerstone-Inhalt markieren"],"Move step down":["Schritt nach unten verschieben"],"Move step up":["Schritt nach oben verschieben"],"Insert step":["Schritt einfügen"],"Delete step":["Schritt löschen"],"Add image":["Bild hinzufügen"],"Enter a step description":["Gib eine Beschreibung für den Schritt ein"],"Enter a description":["Gib eine Beschreibung ein"],"Unordered list":["Unsortierte Liste"],"Showing step items as an ordered list.":["Schritt-Elemente als geordnete Liste anzeigen."],"Showing step items as an unordered list":["Schritt-Elemente als ungeordnete Liste anzeigen"],"Add step":["Schritt hinzufügen"],"Delete total time":["Gesamtzeit löschen"],"Add total time":["Gesamtzeit hinzufügen"],"How to":["Anleitung"],"How-to":["Anleitung"],"Analysis results":["Analyse-Ergebnisse"],"Enter a focus keyphrase to calculate the SEO score":["Gib ein Fokus-Keyword ein, um den SEO-Wert zu berechnen"],"Learn more about Cornerstone Content.":["Erfahre mehr über Cornerstone-Inhalte."],"Cornerstone content should be the most important and extensive articles on your site.":["Cornerstone-Inhalte sollten die wichtigsten und umfassendsten Artikel deiner Seite sein."],"Add synonyms":["Synonyme hinzufügen"],"Would you like to add keyphrase synonyms?":["Möchtest du Keyphrase-Synonyme hinzufügen?"],"Current year":["Aktuelles Jahr"],"Page":["Seite"],"Tagline":["Untertitel"],"Modify your meta description by editing it right here":["Bearbeite direkt hier deine Meta-Beschreibung "],"ID":["ID"],"Separator":["Trennzeichen"],"Search phrase":["Suchwort"],"Term description":["Begriffsbeschreibung"],"Tag description":["Schlagwortbeschreibung"],"Category description":["Kategoriebeschreibung"],"Primary category":["Primäre Kategorie"],"Category":["Kategorie"],"Excerpt only":["Nur Auszug"],"Excerpt":["Textauszug"],"Site title":["Titel der Website"],"Parent title":["Titel der übergeordneten Seite"],"Date":["Datum"],"24/7 email support":["24/7 E-Mail-Support"],"SEO analysis":["SEO Analyse"],"Other benefits of %s for you:":["Andere Vorteile von %s für dich:"],"Cornerstone content":["Cornerstone-Inhalt"],"Superfast internal linking suggestions":["Superschnelle Vorschläge zur internen Verlinkung"],"Great news: you can, with %1$s!":["Großartige Neuigkeit: Du kannst es, mit %1$s!"],"1 year free support and updates included!":["1 Jahr kostenfreie Updates und Upgrades inbegriffen!"],"%1$sSocial media preview%2$s: Facebook & Twitter":["%1$sSocial Media Vorschau%2$s: Facebook & Twitter"],"%1$sNo more dead links%2$s: easy redirect manager":["%1$sKeine verwaisten Links mehr%2$s: Einfacher Redirect-Manager"],"No ads!":["Keine Werbung!"],"Please provide a meta description by editing the snippet below.":["Bitte lege eine Meta-Beschreibung fest, indem du den Code-Schnipsel bearbeitest."],"The name of the person":["Der Name der Person"],"Readability analysis":["Lesbarkeits-Analyse"],"Open":["Offen"],"Title":["Titel"],"Close":["Schließen"],"FAQ":["FAQ"],"Settings":["Einstellungen"]}}}
|
languages/yoast-components-de_DE.json
CHANGED
@@ -1 +1 @@
|
|
1 |
-
{"domain":"yoast-components","locale_data":{"yoast-components":{"":{"domain":"yoast-components","plural-forms":"nplurals=2; plural=n != 1;","lang":"de"},"Preview as:":["Vorschau als:"],"Mobile result":[],"Desktop result":[],"Dismiss this alert":["Hinweis ausblenden"],"The following words and word combinations occur the most in the content. These give an indication of what your content focuses on. If the words differ a lot from your topic, you might want to rewrite your content accordingly. ":["Die folgenden Wörter und Wort-Kombinationen kommen im Inhalt am häufigsten vor. Diese geben einen Hinweis darauf, worauf sich dein Inhalt konzentriert. Wenn sich die Wörter stark von deinem Thema unterscheiden, möchtest du vielleicht deinen Inhalt entsprechend umschreiben. "],"Once you add a bit more copy, we'll give you a list of words that occur the most in the content. These give an indication of what your content focuses on.":["Hast du deiner Seite einmal etwas mehr Inhalt hinzugefügt, werden wir dir eine Liste mit Wörtern anzeigen, die am meisten im Inhalt vorkommen. Dies kann eine gute Hilfestellung sein, um herauszufinden, worauf sich dein Inhalt konzentriert."],"%d occurrences":["%d Vorkommen"],"We could not find any relevant articles on your website that you could link to from your post.":["Wir konnten keine relevanten Beiträge auf deiner Website finden, auf die du von deinem Beitrag aus verlinken könntet."],"The image you selected is too small for Facebook":["Das ausgewählte Bild ist zu klein für Facebook."],"The given image url cannot be loaded":["Die angegebene URL zum Bild konnte nicht geladen werden."],"This is a list of related content to which you could link in your post. {{a}}Read our article about site structure{{/a}} to learn more about how internal linking can help improve your SEO.":["Dies ist eine Liste von verwandtem Inhalt auf den du in deinem Beitrag verweisen kannst. {{a}}Lies unseren Artikel über Seitenstruktur{{/a}}, um mehr darüber zu lernen, wie interne Verlinkungen deinen SEO Score verbessern können."],"Are you trying to use multiple keyphrases? You should add them separately below.":["Versuchst du, mehrere Keywords zu verwenden? Du solltest sie unten einzeln hinzufügen."],"Mark as cornerstone content":["Als Cornerstone-Inhalt markieren"],"image preview":["Bildvorschau"],"Copied!":["Kopiert!"],"Not supported!":["Nicht unterstützt!"],"Read {{a}}our article about site structure{{/a}} to learn more about how internal linking can help improve your SEO.":["Lies {{a}}unseren Artikel über Seitenstruktur{{/a}}, um mehr darüber zu erfahren, wie interne Verlinkungen deinen SEO Score verbessern können."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Hast du deiner Seite einmal etwas mehr Inhalt hinzugefügt, werden wir dir eine Liste mit verwandten Inhalten anzeigen, welche du in deinem Beitrag verlinken kannst."],"Consider linking to these {{a}}cornerstone articles:{{/a}}":["Überlege, zu diesen {{a}}Cornerstone-Artikeln{{/a}} zu verlinken. "],"Consider linking to these articles:":["Überlege, auf diese Artikel zu verlinken "],"Copy link":["Link kopieren"],"Copy link to suggested article: %s":["Link zum vorgeschlagenen Artikel kopieren: %s"],"Read our %1$sultimate guide to keyword research%2$s to learn more about keyword research and keyword strategy.":["Lies unser %1$sultimatives Handbuch zur Keyword-Recherche%2$s, um mehr über Keyword-Recherche und Keyword-Strategie zu erfahren."],"Once you add a bit more copy, we'll give you a list of words and word combinations that occur the most in the content. These give an indication of what your content focuses on.":["Hast du deiner Seite einmal etwas mehr Inhalt hinzugefügt, werden wir dir eine Liste mit Wörtern und Wort-Kombinationen anzeigen, die am meisten im Inhalt vorkommen. Dies kann eine gute Hilfestellung sein, um herauszufinden, worauf sich dein Inhalt konzentriert."],"The following words occur the most in the content. These give an indication of what your content focuses on. If the words differ a lot from your topic, you might want to rewrite your content accordingly. ":["Die folgenden Wörter kommen im Inhalt am häufigsten vor. Diese geben einen Hinweis darauf, worauf sich dein Inhalt konzentriert. Wenn sich die Wörter stark von deinem Thema unterscheiden, möchtest du vielleicht deinen Inhalt entsprechend umschreiben. "],"Prominent words":["Prominente Wörter "],"Something went wrong. Please reload the page.":["Das hat nicht funktioniert. Bitte lade die Seite neu."],"Modify your meta description by editing it right here":["Bearbeite direkt hier deine Meta-Beschreibung "],"Url preview":["URL-Vorschau"],"Please provide a meta description by editing the snippet below. If you don’t, Google will try to find a relevant part of your post to show in the search results.":["Bitte bearbeite das Codeschnipsel und richte eine Meta-Beschreibung ein. Wenn du dies nicht tust, wird Google selbständig versuchen, einen relevanten Teil deines Beitrags in den Suchergebnissen anzuzeigen."],"Insert snippet variable":["Codeschnipsel-Variable einsetzen"],"Dismiss this notice":["Ignoriere diese Nachricht"],"No results":["Keine Ergebnisse"],"%d result found, use up and down arrow keys to navigate":["%d Ergebnis gefunden, mit den Pfeiltasten nach oben und unten navigieren","%d Ergebnisse gefunden, mit den Pfeiltasten nach oben und unten navigieren"],"Your site language is set to %s. If this is not correct, contact your site administrator.":["Die Sprache deiner Website ist auf %s eingestellt. Wenn dies nicht korrekt ist, wende dich an deinen Website-Administrator."],"On":["An"],"Off":["Aus"],"Good results":["Gute Ergebnisse"],"Remove highlight from the text":["Text-Markierung entfernen"],"Your site language is set to %s. ":["Die Sprache deiner Website ist auf %s eingestellt."],"Highlight this result in the text":["Markiere dieses Ergebnis im Text"],"Considerations":["Überlegungen"],"Errors":["Fehler"],"Change language":["Sprache ändern"],"(Opens in a new browser tab)":["(Öffnet in einem neuen Browser Tab)"],"Scroll to see the preview content.":["Scrolle, um die Vorschau zu sehen."],"Step %1$d: %2$s":["Schritt %1$d: %2$s"],"Close snippet editor":["Ausschnitt-Editor schließen"],"Slug":["Permalink"],"Marks are disabled in current view":["Markierungen sind in der aktuellen Ansicht deaktiviert."],"Choose an image":["Wähle ein Bild"],"Remove the image":["Bild entfernen"],"MailChimp signup failed:":["MailChimp-Registrierung fehlgeschlagen:"],"Sign Up!":["Anmelden"],"Edit snippet":["Code-Schnipsel bearbeiten"],"SEO title preview":["SEO-Titel Vorschau"],"Meta description preview":["Meta Description Vorschau"],"A problem occurred when saving the current step, {{link}}please file a bug report{{/link}} describing what step you are on and which changes you want to make (if any).":["Beim Speichern des aktuellen Schritts ist ein Problem aufgetreten. {{link}}Bitte erfasse einen Fehlerbericht{{/link}}, der beschreibt in welchen Schritt du warst und welche Änderungen du vorgenommen hast (falls Änderungen gemacht wurden)."],"Close the Wizard":["Schließe den Assistenten "],"%s installation wizard":["%s Installationsassistent"],"SEO title":["SEO Titel"],"Improvements":["Verbesserungen"],"Problems":["Probleme"],"Email":["E-Mail"],"Previous":["Zurück"],"Next":["Weiter"],"Close":["Schließen"],"Meta description":["Meta-Beschreibung"]}}}
|
1 |
+
{"domain":"yoast-components","locale_data":{"yoast-components":{"":{"domain":"yoast-components","plural-forms":"nplurals=2; plural=n != 1;","lang":"de"},"Preview as:":["Vorschau als:"],"Mobile result":["Ergebnis für die mobilen Geräte"],"Desktop result":["Ergebnis für den Desktop"],"Dismiss this alert":["Hinweis ausblenden"],"The following words and word combinations occur the most in the content. These give an indication of what your content focuses on. If the words differ a lot from your topic, you might want to rewrite your content accordingly. ":["Die folgenden Wörter und Wort-Kombinationen kommen im Inhalt am häufigsten vor. Diese geben einen Hinweis darauf, worauf sich dein Inhalt konzentriert. Wenn sich die Wörter stark von deinem Thema unterscheiden, möchtest du vielleicht deinen Inhalt entsprechend umschreiben. "],"Once you add a bit more copy, we'll give you a list of words that occur the most in the content. These give an indication of what your content focuses on.":["Hast du deiner Seite einmal etwas mehr Inhalt hinzugefügt, werden wir dir eine Liste mit Wörtern anzeigen, die am meisten im Inhalt vorkommen. Dies kann eine gute Hilfestellung sein, um herauszufinden, worauf sich dein Inhalt konzentriert."],"%d occurrences":["%d Vorkommen"],"We could not find any relevant articles on your website that you could link to from your post.":["Wir konnten keine relevanten Beiträge auf deiner Website finden, auf die du von deinem Beitrag aus verlinken könntet."],"The image you selected is too small for Facebook":["Das ausgewählte Bild ist zu klein für Facebook."],"The given image url cannot be loaded":["Die angegebene URL zum Bild konnte nicht geladen werden."],"This is a list of related content to which you could link in your post. {{a}}Read our article about site structure{{/a}} to learn more about how internal linking can help improve your SEO.":["Dies ist eine Liste von verwandtem Inhalt auf den du in deinem Beitrag verweisen kannst. {{a}}Lies unseren Artikel über Seitenstruktur{{/a}}, um mehr darüber zu lernen, wie interne Verlinkungen deinen SEO Score verbessern können."],"Are you trying to use multiple keyphrases? You should add them separately below.":["Versuchst du, mehrere Keywords zu verwenden? Du solltest sie unten einzeln hinzufügen."],"Mark as cornerstone content":["Als Cornerstone-Inhalt markieren"],"image preview":["Bildvorschau"],"Copied!":["Kopiert!"],"Not supported!":["Nicht unterstützt!"],"Read {{a}}our article about site structure{{/a}} to learn more about how internal linking can help improve your SEO.":["Lies {{a}}unseren Artikel über Seitenstruktur{{/a}}, um mehr darüber zu erfahren, wie interne Verlinkungen deinen SEO Score verbessern können."],"Once you add a bit more copy, we'll give you a list of related content here to which you could link in your post.":["Hast du deiner Seite einmal etwas mehr Inhalt hinzugefügt, werden wir dir eine Liste mit verwandten Inhalten anzeigen, welche du in deinem Beitrag verlinken kannst."],"Consider linking to these {{a}}cornerstone articles:{{/a}}":["Überlege, zu diesen {{a}}Cornerstone-Artikeln{{/a}} zu verlinken. "],"Consider linking to these articles:":["Überlege, auf diese Artikel zu verlinken "],"Copy link":["Link kopieren"],"Copy link to suggested article: %s":["Link zum vorgeschlagenen Artikel kopieren: %s"],"Read our %1$sultimate guide to keyword research%2$s to learn more about keyword research and keyword strategy.":["Lies unser %1$sultimatives Handbuch zur Keyword-Recherche%2$s, um mehr über Keyword-Recherche und Keyword-Strategie zu erfahren."],"Once you add a bit more copy, we'll give you a list of words and word combinations that occur the most in the content. These give an indication of what your content focuses on.":["Hast du deiner Seite einmal etwas mehr Inhalt hinzugefügt, werden wir dir eine Liste mit Wörtern und Wort-Kombinationen anzeigen, die am meisten im Inhalt vorkommen. Dies kann eine gute Hilfestellung sein, um herauszufinden, worauf sich dein Inhalt konzentriert."],"The following words occur the most in the content. These give an indication of what your content focuses on. If the words differ a lot from your topic, you might want to rewrite your content accordingly. ":["Die folgenden Wörter kommen im Inhalt am häufigsten vor. Diese geben einen Hinweis darauf, worauf sich dein Inhalt konzentriert. Wenn sich die Wörter stark von deinem Thema unterscheiden, möchtest du vielleicht deinen Inhalt entsprechend umschreiben. "],"Prominent words":["Prominente Wörter "],"Something went wrong. Please reload the page.":["Das hat nicht funktioniert. Bitte lade die Seite neu."],"Modify your meta description by editing it right here":["Bearbeite direkt hier deine Meta-Beschreibung "],"Url preview":["URL-Vorschau"],"Please provide a meta description by editing the snippet below. If you don’t, Google will try to find a relevant part of your post to show in the search results.":["Bitte bearbeite das Codeschnipsel und richte eine Meta-Beschreibung ein. Wenn du dies nicht tust, wird Google selbständig versuchen, einen relevanten Teil deines Beitrags in den Suchergebnissen anzuzeigen."],"Insert snippet variable":["Codeschnipsel-Variable einsetzen"],"Dismiss this notice":["Ignoriere diese Nachricht"],"No results":["Keine Ergebnisse"],"%d result found, use up and down arrow keys to navigate":["%d Ergebnis gefunden, mit den Pfeiltasten nach oben und unten navigieren","%d Ergebnisse gefunden, mit den Pfeiltasten nach oben und unten navigieren"],"Your site language is set to %s. If this is not correct, contact your site administrator.":["Die Sprache deiner Website ist auf %s eingestellt. Wenn dies nicht korrekt ist, wende dich an deinen Website-Administrator."],"On":["An"],"Off":["Aus"],"Good results":["Gute Ergebnisse"],"Remove highlight from the text":["Text-Markierung entfernen"],"Your site language is set to %s. ":["Die Sprache deiner Website ist auf %s eingestellt."],"Highlight this result in the text":["Markiere dieses Ergebnis im Text"],"Considerations":["Überlegungen"],"Errors":["Fehler"],"Change language":["Sprache ändern"],"(Opens in a new browser tab)":["(Öffnet in einem neuen Browser Tab)"],"Scroll to see the preview content.":["Scrolle, um die Vorschau zu sehen."],"Step %1$d: %2$s":["Schritt %1$d: %2$s"],"Close snippet editor":["Ausschnitt-Editor schließen"],"Slug":["Permalink"],"Marks are disabled in current view":["Markierungen sind in der aktuellen Ansicht deaktiviert."],"Choose an image":["Wähle ein Bild"],"Remove the image":["Bild entfernen"],"MailChimp signup failed:":["MailChimp-Registrierung fehlgeschlagen:"],"Sign Up!":["Anmelden"],"Edit snippet":["Code-Schnipsel bearbeiten"],"SEO title preview":["SEO-Titel Vorschau"],"Meta description preview":["Meta Description Vorschau"],"A problem occurred when saving the current step, {{link}}please file a bug report{{/link}} describing what step you are on and which changes you want to make (if any).":["Beim Speichern des aktuellen Schritts ist ein Problem aufgetreten. {{link}}Bitte erfasse einen Fehlerbericht{{/link}}, der beschreibt in welchen Schritt du warst und welche Änderungen du vorgenommen hast (falls Änderungen gemacht wurden)."],"Close the Wizard":["Schließe den Assistenten "],"%s installation wizard":["%s Installationsassistent"],"SEO title":["SEO Titel"],"Improvements":["Verbesserungen"],"Problems":["Probleme"],"Email":["E-Mail"],"Previous":["Zurück"],"Next":["Weiter"],"Close":["Schließen"],"Meta description":["Meta-Beschreibung"]}}}
|
src/orm/yoast-model.php → lib/model.php
RENAMED
@@ -1,13 +1,11 @@
|
|
1 |
<?php
|
2 |
/**
|
3 |
-
* Yoast
|
4 |
*
|
5 |
-
* @package Yoast\
|
6 |
*/
|
7 |
|
8 |
-
namespace Yoast\WP\
|
9 |
-
|
10 |
-
use Yoast\WP\SEO\Exceptions\Missing_Method;
|
11 |
|
12 |
/**
|
13 |
* Make Model compatible with WordPress.
|
@@ -18,18 +16,8 @@ use Yoast\WP\SEO\Exceptions\Missing_Method;
|
|
18 |
* class Widget extends Model {
|
19 |
* }
|
20 |
*
|
21 |
-
* The methods documented below are magic methods that conform to PSR-1.
|
22 |
-
* This documentation exposes these methods to doc generators and IDEs.
|
23 |
-
*
|
24 |
-
* @link http://www.php-fig.org/psr/psr-1/
|
25 |
-
*
|
26 |
-
* @method void setOrm($orm)
|
27 |
-
* @method $this setExpr($property, $value = null)
|
28 |
-
* @method bool isDirty($property)
|
29 |
-
* @method bool isNew()
|
30 |
-
* @method Array asArray()
|
31 |
*/
|
32 |
-
class
|
33 |
|
34 |
/**
|
35 |
* Default ID column for all models. Can be overridden by adding
|
@@ -57,13 +45,6 @@ class Yoast_Model {
|
|
57 |
*/
|
58 |
public static $auto_prefix_models = '\Yoast\WP\SEO\Models\\';
|
59 |
|
60 |
-
/**
|
61 |
-
* Set a logger to use for all models.
|
62 |
-
*
|
63 |
-
* @var \YoastSEO_Vendor\Psr\Log\LoggerInterface $logger
|
64 |
-
*/
|
65 |
-
public static $logger;
|
66 |
-
|
67 |
/**
|
68 |
* Set true to to ignore namespace information when computing table names
|
69 |
* from class names.
|
@@ -78,7 +59,7 @@ class Yoast_Model {
|
|
78 |
/**
|
79 |
* The ORM instance used by this model instance to communicate with the database.
|
80 |
*
|
81 |
-
* @var
|
82 |
*/
|
83 |
public $orm;
|
84 |
|
@@ -116,7 +97,7 @@ class Yoast_Model {
|
|
116 |
* @param string $class_name Type of Model to load.
|
117 |
* @param bool $yoast_prefix Optional. True to prefix the table name with the Yoast prefix.
|
118 |
*
|
119 |
-
* @return
|
120 |
*/
|
121 |
public static function of_type( $class_name, $yoast_prefix = true ) {
|
122 |
// Prepend namespace to the class name.
|
@@ -133,7 +114,7 @@ class Yoast_Model {
|
|
133 |
*
|
134 |
* @param string $class_name Type of Model to load.
|
135 |
*
|
136 |
-
* @return
|
137 |
*/
|
138 |
public static function of_wp_type( $class_name ) {
|
139 |
return static::of_type( $class_name, false );
|
@@ -316,18 +297,14 @@ class Yoast_Model {
|
|
316 |
* responsible for returning instances of the correct class when
|
317 |
* its find_one or find_many methods are called.
|
318 |
*
|
319 |
-
* @param string
|
320 |
-
* @param null|string $connection_name The name of the connection.
|
321 |
*
|
322 |
-
* @return
|
323 |
*/
|
324 |
-
public static function factory( $class_name
|
325 |
$class_name = static::$auto_prefix_models . $class_name;
|
326 |
$table_name = static::get_table_name_for_class( $class_name );
|
327 |
-
|
328 |
-
$connection_name = static::get_static_property( $class_name, '_connection_name', ORMWrapper::DEFAULT_CONNECTION );
|
329 |
-
}
|
330 |
-
$wrapper = ORMWrapper::for_table( $table_name, $connection_name );
|
331 |
$wrapper->set_class_name( $class_name );
|
332 |
$wrapper->use_id_column( static::get_id_column_name( $class_name ) );
|
333 |
|
@@ -343,12 +320,11 @@ class Yoast_Model {
|
|
343 |
* @param string $associated_class_name The associated class name.
|
344 |
* @param null|string $foreign_key_name The foreign key name in the associated table.
|
345 |
* @param null|string $foreign_key_name_in_current_models_table The foreign key in the current models table.
|
346 |
-
* @param null|string $connection_name The name of the connection.
|
347 |
*
|
348 |
-
* @return
|
349 |
* @throws \Exception When ID of current model has a null value.
|
350 |
*/
|
351 |
-
protected function has_one_or_many( $associated_class_name, $foreign_key_name = null, $foreign_key_name_in_current_models_table = null
|
352 |
$base_table_name = static::get_table_name_for_class( \get_class( $this ) );
|
353 |
$foreign_key_name = static::build_foreign_key_name( $foreign_key_name, $base_table_name );
|
354 |
|
@@ -365,7 +341,7 @@ class Yoast_Model {
|
|
365 |
$where_value = $this->{$foreign_key_name_in_current_models_table};
|
366 |
}
|
367 |
|
368 |
-
return static::factory( $associated_class_name
|
369 |
}
|
370 |
|
371 |
/**
|
@@ -375,13 +351,12 @@ class Yoast_Model {
|
|
375 |
* @param string $associated_class_name The associated class name.
|
376 |
* @param null|string $foreign_key_name The foreign key name in the associated table.
|
377 |
* @param null|string $foreign_key_name_in_current_models_table The foreign key in the current models table.
|
378 |
-
* @param null|string $connection_name The name of the connection.
|
379 |
*
|
380 |
-
* @return
|
381 |
* @throws \Exception When ID of current model has a null value.
|
382 |
*/
|
383 |
-
protected function has_one( $associated_class_name, $foreign_key_name = null, $foreign_key_name_in_current_models_table = null
|
384 |
-
return $this->has_one_or_many( $associated_class_name, $foreign_key_name, $foreign_key_name_in_current_models_table
|
385 |
}
|
386 |
|
387 |
/**
|
@@ -391,15 +366,14 @@ class Yoast_Model {
|
|
391 |
* @param string $associated_class_name The associated class name.
|
392 |
* @param null|string $foreign_key_name The foreign key name in the associated table.
|
393 |
* @param null|string $foreign_key_name_in_current_models_table The foreign key in the current models table.
|
394 |
-
* @param null|string $connection_name The name of the connection.
|
395 |
*
|
396 |
-
* @return
|
397 |
* @throws \Exception When ID has a null value.
|
398 |
*/
|
399 |
-
protected function has_many( $associated_class_name, $foreign_key_name = null, $foreign_key_name_in_current_models_table = null
|
400 |
$this->set_table_name( $associated_class_name );
|
401 |
|
402 |
-
return $this->has_one_or_many( $associated_class_name, $foreign_key_name, $foreign_key_name_in_current_models_table
|
403 |
}
|
404 |
|
405 |
/**
|
@@ -409,11 +383,10 @@ class Yoast_Model {
|
|
409 |
* @param string $associated_class_name The associated class name.
|
410 |
* @param null|string $foreign_key_name The foreign key in the current models table.
|
411 |
* @param null|string $foreign_key_name_in_associated_models_table The foreign key in the associated table.
|
412 |
-
* @param null|string $connection_name The name of the connection.
|
413 |
*
|
414 |
* @return $this|null Instance of the foreign model.
|
415 |
*/
|
416 |
-
protected function belongs_to( $associated_class_name, $foreign_key_name = null, $foreign_key_name_in_associated_models_table = null
|
417 |
$this->set_table_name( $associated_class_name );
|
418 |
|
419 |
$associated_table_name = static::get_table_name_for_class( static::$auto_prefix_models . $associated_class_name );
|
@@ -426,11 +399,11 @@ class Yoast_Model {
|
|
426 |
*
|
427 |
* NOTE: primary_key is a placeholder for the actual primary key column's name in $associated_table_name.
|
428 |
*/
|
429 |
-
return static::factory( $associated_class_name
|
430 |
}
|
431 |
|
432 |
// Comparison: "{$associated_table_name}.{$foreign_key_name_in_associated_models_table} = {$associated_object_id}".
|
433 |
-
return static::factory( $associated_class_name
|
434 |
}
|
435 |
|
436 |
/**
|
@@ -443,11 +416,10 @@ class Yoast_Model {
|
|
443 |
* @param null|string $key_to_associated_table The key to the associated table.
|
444 |
* @param null|string $key_in_base_table The key in the current models table.
|
445 |
* @param null|string $key_in_associated_table The key in the associated table.
|
446 |
-
* @param null|string $connection_name The name of the connection.
|
447 |
*
|
448 |
-
* @return
|
449 |
*/
|
450 |
-
protected function has_many_through( $associated_class_name, $join_class_name = null, $key_to_base_table = null, $key_to_associated_table = null, $key_in_base_table = null, $key_in_associated_table = null
|
451 |
$base_class_name = \get_class( $this );
|
452 |
|
453 |
/*
|
@@ -491,7 +463,7 @@ class Yoast_Model {
|
|
491 |
ON {$associated_table_name}.{$associated_table_id_column} = {$join_table_name}.{$key_to_associated_table}
|
492 |
WHERE {$join_table_name}.{$key_to_base_table} = {$this->$base_table_id_column} ;"
|
493 |
*/
|
494 |
-
return static::factory( $associated_class_name
|
495 |
->select( "{$associated_table_name}.*" )
|
496 |
->join(
|
497 |
$join_table_name,
|
@@ -507,7 +479,7 @@ class Yoast_Model {
|
|
507 |
/**
|
508 |
* Set the wrapped ORM instance associated with this Model instance.
|
509 |
*
|
510 |
-
* @param
|
511 |
*
|
512 |
* @return void
|
513 |
*/
|
@@ -696,7 +668,7 @@ class Yoast_Model {
|
|
696 |
}
|
697 |
|
698 |
/**
|
699 |
-
* Calls static methods directly on the
|
700 |
*
|
701 |
* @param string $method The method to call.
|
702 |
* @param array $arguments The arguments to use.
|
@@ -712,28 +684,4 @@ class Yoast_Model {
|
|
712 |
|
713 |
return \call_user_func_array( [ $model, $method ], $arguments );
|
714 |
}
|
715 |
-
|
716 |
-
/**
|
717 |
-
* Magic method to capture calls to undefined class methods.
|
718 |
-
* In this case we are attempting to convert camel case formatted
|
719 |
-
* methods into underscore formatted methods.
|
720 |
-
*
|
721 |
-
* This allows us to call methods using camel case and remain
|
722 |
-
* backwards compatible.
|
723 |
-
*
|
724 |
-
* @param string $name The method to call.
|
725 |
-
* @param array $arguments The arguments to use.
|
726 |
-
*
|
727 |
-
* @throws \Yoast\WP\SEO\Exceptions\Missing_Method When the method does not exist.
|
728 |
-
*
|
729 |
-
* @return bool|\Yoast\WP\SEO\ORMWrapper Result of the call.
|
730 |
-
*/
|
731 |
-
public function __call( $name, $arguments ) {
|
732 |
-
$method = \strtolower( \preg_replace( '/([a-z])([A-Z])/', '$1_$2', $name ) );
|
733 |
-
if ( ! \method_exists( $this, $method ) ) {
|
734 |
-
throw Missing_Method::for_class( \get_class( $this ), $name );
|
735 |
-
}
|
736 |
-
|
737 |
-
return \call_user_func_array( [ $this, $method ], $arguments );
|
738 |
-
}
|
739 |
}
|
1 |
<?php
|
2 |
/**
|
3 |
+
* Yoast model class.
|
4 |
*
|
5 |
+
* @package Yoast\WP\Lib
|
6 |
*/
|
7 |
|
8 |
+
namespace Yoast\WP\Lib;
|
|
|
|
|
9 |
|
10 |
/**
|
11 |
* Make Model compatible with WordPress.
|
16 |
* class Widget extends Model {
|
17 |
* }
|
18 |
*
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
*/
|
20 |
+
class Model {
|
21 |
|
22 |
/**
|
23 |
* Default ID column for all models. Can be overridden by adding
|
45 |
*/
|
46 |
public static $auto_prefix_models = '\Yoast\WP\SEO\Models\\';
|
47 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
48 |
/**
|
49 |
* Set true to to ignore namespace information when computing table names
|
50 |
* from class names.
|
59 |
/**
|
60 |
* The ORM instance used by this model instance to communicate with the database.
|
61 |
*
|
62 |
+
* @var ORM $orm
|
63 |
*/
|
64 |
public $orm;
|
65 |
|
97 |
* @param string $class_name Type of Model to load.
|
98 |
* @param bool $yoast_prefix Optional. True to prefix the table name with the Yoast prefix.
|
99 |
*
|
100 |
+
* @return ORM Wrapper to use.
|
101 |
*/
|
102 |
public static function of_type( $class_name, $yoast_prefix = true ) {
|
103 |
// Prepend namespace to the class name.
|
114 |
*
|
115 |
* @param string $class_name Type of Model to load.
|
116 |
*
|
117 |
+
* @return ORM
|
118 |
*/
|
119 |
public static function of_wp_type( $class_name ) {
|
120 |
return static::of_type( $class_name, false );
|
297 |
* responsible for returning instances of the correct class when
|
298 |
* its find_one or find_many methods are called.
|
299 |
*
|
300 |
+
* @param string $class_name The target class name.
|
|
|
301 |
*
|
302 |
+
* @return ORM Instance of the ORM wrapper.
|
303 |
*/
|
304 |
+
public static function factory( $class_name ) {
|
305 |
$class_name = static::$auto_prefix_models . $class_name;
|
306 |
$table_name = static::get_table_name_for_class( $class_name );
|
307 |
+
$wrapper = ORM::for_table( $table_name );
|
|
|
|
|
|
|
308 |
$wrapper->set_class_name( $class_name );
|
309 |
$wrapper->use_id_column( static::get_id_column_name( $class_name ) );
|
310 |
|
320 |
* @param string $associated_class_name The associated class name.
|
321 |
* @param null|string $foreign_key_name The foreign key name in the associated table.
|
322 |
* @param null|string $foreign_key_name_in_current_models_table The foreign key in the current models table.
|
|
|
323 |
*
|
324 |
+
* @return ORM
|
325 |
* @throws \Exception When ID of current model has a null value.
|
326 |
*/
|
327 |
+
protected function has_one_or_many( $associated_class_name, $foreign_key_name = null, $foreign_key_name_in_current_models_table = null ) {
|
328 |
$base_table_name = static::get_table_name_for_class( \get_class( $this ) );
|
329 |
$foreign_key_name = static::build_foreign_key_name( $foreign_key_name, $base_table_name );
|
330 |
|
341 |
$where_value = $this->{$foreign_key_name_in_current_models_table};
|
342 |
}
|
343 |
|
344 |
+
return static::factory( $associated_class_name )->where( $foreign_key_name, $where_value );
|
345 |
}
|
346 |
|
347 |
/**
|
351 |
* @param string $associated_class_name The associated class name.
|
352 |
* @param null|string $foreign_key_name The foreign key name in the associated table.
|
353 |
* @param null|string $foreign_key_name_in_current_models_table The foreign key in the current models table.
|
|
|
354 |
*
|
355 |
+
* @return ORM Instance of the ORM.
|
356 |
* @throws \Exception When ID of current model has a null value.
|
357 |
*/
|
358 |
+
protected function has_one( $associated_class_name, $foreign_key_name = null, $foreign_key_name_in_current_models_table = null ) {
|
359 |
+
return $this->has_one_or_many( $associated_class_name, $foreign_key_name, $foreign_key_name_in_current_models_table );
|
360 |
}
|
361 |
|
362 |
/**
|
366 |
* @param string $associated_class_name The associated class name.
|
367 |
* @param null|string $foreign_key_name The foreign key name in the associated table.
|
368 |
* @param null|string $foreign_key_name_in_current_models_table The foreign key in the current models table.
|
|
|
369 |
*
|
370 |
+
* @return ORM Instance of the ORM.
|
371 |
* @throws \Exception When ID has a null value.
|
372 |
*/
|
373 |
+
protected function has_many( $associated_class_name, $foreign_key_name = null, $foreign_key_name_in_current_models_table = null ) {
|
374 |
$this->set_table_name( $associated_class_name );
|
375 |
|
376 |
+
return $this->has_one_or_many( $associated_class_name, $foreign_key_name, $foreign_key_name_in_current_models_table );
|
377 |
}
|
378 |
|
379 |
/**
|
383 |
* @param string $associated_class_name The associated class name.
|
384 |
* @param null|string $foreign_key_name The foreign key in the current models table.
|
385 |
* @param null|string $foreign_key_name_in_associated_models_table The foreign key in the associated table.
|
|
|
386 |
*
|
387 |
* @return $this|null Instance of the foreign model.
|
388 |
*/
|
389 |
+
protected function belongs_to( $associated_class_name, $foreign_key_name = null, $foreign_key_name_in_associated_models_table = null ) {
|
390 |
$this->set_table_name( $associated_class_name );
|
391 |
|
392 |
$associated_table_name = static::get_table_name_for_class( static::$auto_prefix_models . $associated_class_name );
|
399 |
*
|
400 |
* NOTE: primary_key is a placeholder for the actual primary key column's name in $associated_table_name.
|
401 |
*/
|
402 |
+
return static::factory( $associated_class_name )->where_id_is( $associated_object_id );
|
403 |
}
|
404 |
|
405 |
// Comparison: "{$associated_table_name}.{$foreign_key_name_in_associated_models_table} = {$associated_object_id}".
|
406 |
+
return static::factory( $associated_class_name )->where( $foreign_key_name_in_associated_models_table, $associated_object_id );
|
407 |
}
|
408 |
|
409 |
/**
|
416 |
* @param null|string $key_to_associated_table The key to the associated table.
|
417 |
* @param null|string $key_in_base_table The key in the current models table.
|
418 |
* @param null|string $key_in_associated_table The key in the associated table.
|
|
|
419 |
*
|
420 |
+
* @return ORM Instance of the ORM.
|
421 |
*/
|
422 |
+
protected function has_many_through( $associated_class_name, $join_class_name = null, $key_to_base_table = null, $key_to_associated_table = null, $key_in_base_table = null, $key_in_associated_table = null ) {
|
423 |
$base_class_name = \get_class( $this );
|
424 |
|
425 |
/*
|
463 |
ON {$associated_table_name}.{$associated_table_id_column} = {$join_table_name}.{$key_to_associated_table}
|
464 |
WHERE {$join_table_name}.{$key_to_base_table} = {$this->$base_table_id_column} ;"
|
465 |
*/
|
466 |
+
return static::factory( $associated_class_name )
|
467 |
->select( "{$associated_table_name}.*" )
|
468 |
->join(
|
469 |
$join_table_name,
|
479 |
/**
|
480 |
* Set the wrapped ORM instance associated with this Model instance.
|
481 |
*
|
482 |
+
* @param ORM $orm The ORM instance to set.
|
483 |
*
|
484 |
* @return void
|
485 |
*/
|
668 |
}
|
669 |
|
670 |
/**
|
671 |
+
* Calls static methods directly on the ORM
|
672 |
*
|
673 |
* @param string $method The method to call.
|
674 |
* @param array $arguments The arguments to use.
|
684 |
|
685 |
return \call_user_func_array( [ $model, $method ], $arguments );
|
686 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
687 |
}
|
lib/orm.php
ADDED
@@ -0,0 +1,2342 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|