From 7c513cc86d91ea27e70b948d55f1aa162fb772e0 Mon Sep 17 00:00:00 2001 From: Miriam Goldman Date: Thu, 22 Aug 2024 09:17:20 -0400 Subject: [PATCH] yoast --- .../admin/admin-settings-changed-listener.php | 89 + .../plugins/wordpress-seo/admin/ajax.php | 419 ++ .../admin/ajax/class-shortcode-filter.php | 54 + .../ajax/class-yoast-dismissable-notice.php | 95 + .../ajax/class-yoast-plugin-conflict-ajax.php | 130 + .../class-abstract-capability-manager.php | 91 + .../class-capability-manager-factory.php | 35 + .../class-capability-manager-integration.php | 121 + .../class-capability-manager-vip.php | 73 + .../class-capability-manager-wp.php | 51 + .../capabilities/class-capability-manager.php | 38 + .../capabilities/class-capability-utils.php | 100 + .../class-register-capabilities.php | 111 + ...s-admin-asset-analysis-worker-location.php | 75 + .../class-admin-asset-dev-server-location.php | 71 + .../admin/class-admin-asset-location.php | 22 + .../admin/class-admin-asset-manager.php | 703 ++ .../admin/class-admin-asset-seo-location.php | 86 + ...ass-admin-editor-specific-replace-vars.php | 227 + ...n-gutenberg-compatibility-notification.php | 105 + .../admin/class-admin-help-panel.php | 104 + .../wordpress-seo/admin/class-admin-init.php | 379 ++ .../class-admin-recommended-replace-vars.php | 205 + .../admin/class-admin-user-profile.php | 87 + .../wordpress-seo/admin/class-admin-utils.php | 82 + .../wordpress-seo/admin/class-admin.php | 403 ++ .../wordpress-seo/admin/class-asset.php | 255 + ...ass-bulk-description-editor-list-table.php | 80 + .../admin/class-bulk-editor-list-table.php | 1049 +++ .../class-bulk-title-editor-list-table.php | 89 + .../wordpress-seo/admin/class-collector.php | 54 + .../wordpress-seo/admin/class-config.php | 160 + .../admin/class-database-proxy.php | 309 + .../wordpress-seo/admin/class-export.php | 164 + .../admin/class-expose-shortlinks.php | 143 + .../admin/class-gutenberg-compatibility.php | 107 + .../admin/class-meta-columns.php | 839 +++ .../admin/class-my-yoast-proxy.php | 219 + .../wordpress-seo/admin/class-option-tab.php | 112 + .../admin/class-option-tabs-formatter.php | 93 + .../wordpress-seo/admin/class-option-tabs.php | 124 + .../admin/class-paper-presenter.php | 141 + .../admin/class-plugin-availability.php | 336 + .../admin/class-plugin-conflict.php | 94 + .../admin/class-premium-popup.php | 105 + .../class-premium-upsell-admin-block.php | 165 + .../admin/class-primary-term-admin.php | 274 + .../admin/class-product-upsell-notice.php | 231 + .../admin/class-remote-request.php | 158 + ...ass-schema-person-upgrade-notification.php | 83 + .../admin/class-suggested-plugins.php | 140 + .../admin/class-wincher-dashboard-widget.php | 136 + .../admin/class-yoast-columns.php | 117 + .../admin/class-yoast-dashboard-widget.php | 160 + .../wordpress-seo/admin/class-yoast-form.php | 1122 ++++ .../admin/class-yoast-input-validation.php | 328 + .../admin/class-yoast-network-admin.php | 334 + .../class-yoast-network-settings-api.php | 164 + .../admin/class-yoast-notification-center.php | 954 +++ .../admin/class-yoast-notification.php | 429 ++ .../admin/class-yoast-notifications.php | 319 + .../admin/class-yoast-plugin-conflict.php | 342 + .../endpoints/class-endpoint-file-size.php | 85 + .../endpoints/class-endpoint-statistics.php | 73 + .../admin/endpoints/class-endpoint.php | 26 + .../exceptions/class-file-size-exception.php | 46 + .../filters/class-abstract-post-filter.php | 197 + .../filters/class-cornerstone-filter.php | 150 + .../formatter/class-metabox-formatter.php | 208 + .../class-post-metabox-formatter.php | 93 + .../class-term-metabox-formatter.php | 98 + .../formatter/interface-metabox-formatter.php | 19 + .../admin/google_search_console/class-gsc.php | 28 + .../views/gsc-display.php | 54 + .../views/gsc-redirect-nopremium.php | 27 + .../admin/import/class-import-detector.php | 36 + .../admin/import/class-import-plugin.php | 63 + .../admin/import/class-import-settings.php | 127 + .../admin/import/class-import-status.php | 131 + .../class-abstract-plugin-importer.php | 329 + .../import/plugins/class-import-aioseo-v4.php | 241 + .../import/plugins/class-import-aioseo.php | 110 + ...class-import-greg-high-performance-seo.php | 42 + .../import/plugins/class-import-headspace.php | 54 + .../import/plugins/class-import-jetpack.php | 40 + .../class-import-platinum-seo-pack.php | 138 + .../plugins/class-import-premium-seo-pack.php | 39 + .../import/plugins/class-import-rankmath.php | 179 + .../plugins/class-import-seo-framework.php | 94 + .../plugins/class-import-seopressor.php | 175 + .../plugins/class-import-smartcrawl.php | 151 + .../import/plugins/class-import-squirrly.php | 224 + .../plugins/class-import-ultimate-seo.php | 64 + .../plugins/class-import-woothemes-seo.php | 138 + .../plugins/class-import-wp-meta-seo.php | 82 + .../import/plugins/class-import-wpseo.php | 310 + .../admin/import/plugins/class-importers.php | 47 + .../plugins/wordpress-seo/admin/index.php | 4 + .../admin/interface-collection.php | 19 + .../admin/interface-installable.php | 19 + .../admin/listeners/class-listener.php | 19 + .../admin/menu/class-admin-menu.php | 133 + .../admin/menu/class-base-menu.php | 287 + .../wordpress-seo/admin/menu/class-menu.php | 96 + .../admin/menu/class-network-admin-menu.php | 97 + .../admin/menu/class-replacevar-editor.php | 159 + .../admin/menu/class-replacevar-field.php | 88 + .../class-submenu-capability-normalize.php | 41 + .../class-abstract-sectioned-metabox-tab.php | 97 + ...ss-metabox-analysis-inclusive-language.php | 58 + .../class-metabox-analysis-readability.php | 39 + .../metabox/class-metabox-analysis-seo.php | 39 + .../metabox/class-metabox-collapsible.php | 84 + .../class-metabox-collapsibles-section.php | 65 + .../admin/metabox/class-metabox-editor.php | 85 + .../admin/metabox/class-metabox-form-tab.php | 135 + .../admin/metabox/class-metabox-null-tab.php | 30 + .../class-metabox-section-additional.php | 109 + ...ass-metabox-section-inclusive-language.php | 46 + .../metabox/class-metabox-section-react.php | 118 + .../class-metabox-section-readability.php | 46 + .../admin/metabox/class-metabox.php | 1215 ++++ .../metabox/interface-metabox-analysis.php | 33 + .../metabox/interface-metabox-section.php | 26 + .../admin/metabox/interface-metabox-tab.php | 26 + .../notifiers/dismissible-notification.php | 126 + .../interface-notification-handler.php | 21 + .../wordpress-seo/admin/pages/dashboard.php | 48 + .../wordpress-seo/admin/pages/licenses.php | 15 + .../wordpress-seo/admin/pages/network.php | 34 + .../wordpress-seo/admin/pages/redirects.php | 15 + .../wordpress-seo/admin/pages/tools.php | 90 + .../roles/class-abstract-role-manager.php | 149 + .../admin/roles/class-register-roles.php | 33 + .../roles/class-role-manager-factory.php | 27 + .../admin/roles/class-role-manager-wp.php | 61 + .../admin/roles/class-role-manager.php | 44 + .../admin/services/class-file-size.php | 106 + .../class-statistics-integration.php | 36 + .../statistics/class-statistics-service.php | 258 + .../admin/taxonomy/class-taxonomy-columns.php | 231 + .../class-taxonomy-fields-presenter.php | 221 + .../admin/taxonomy/class-taxonomy-fields.php | 235 + .../admin/taxonomy/class-taxonomy-metabox.php | 229 + .../admin/taxonomy/class-taxonomy.php | 492 ++ .../tracking/class-tracking-addon-data.php | 126 + .../tracking/class-tracking-default-data.php | 60 + .../tracking/class-tracking-plugin-data.php | 90 + .../tracking/class-tracking-server-data.php | 85 + .../tracking/class-tracking-settings-data.php | 277 + .../tracking/class-tracking-theme-data.php | 51 + .../admin/tracking/class-tracking.php | 240 + .../views/class-yoast-feature-toggle.php | 206 + .../views/class-yoast-feature-toggles.php | 284 + .../admin/views/class-yoast-input-select.php | 146 + .../views/class-yoast-integration-toggles.php | 139 + .../wordpress-seo/admin/views/form/select.php | 26 + .../views/interface-yoast-form-element.php | 19 + .../admin/views/js-templates-primary-term.php | 45 + .../wordpress-seo/admin/views/licenses.php | 395 ++ .../admin/views/paper-collapsible.php | 79 + .../views/partial-notifications-errors.php | 29 + .../views/partial-notifications-template.php | 116 + .../views/partial-notifications-warnings.php | 29 + .../wordpress-seo/admin/views/redirects.php | 237 + .../admin/views/tabs/dashboard/dashboard.php | 44 + .../dashboard/first-time-configuration.php | 14 + .../views/tabs/dashboard/site-analysis.php | 20 + .../views/tabs/network/crawl-settings.php | 50 + .../admin/views/tabs/network/features.php | 115 + .../admin/views/tabs/network/general.php | 56 + .../admin/views/tabs/network/integrations.php | 103 + .../admin/views/tabs/network/restore-site.php | 32 + .../admin/views/tabs/tool/import-seo.php | 127 + .../admin/views/tabs/tool/wpseo-export.php | 39 + .../admin/views/tabs/tool/wpseo-import.php | 46 + .../admin/views/tool-bulk-editor.php | 120 + .../admin/views/tool-file-editor.php | 244 + .../admin/views/tool-import-export.php | 123 + .../admin/views/user-profile.php | 77 + .../watchers/class-slug-change-watcher.php | 256 + .../dynamic-blocks/breadcrumbs/block.json | 25 + .../structured-data-blocks/faq/block.json | 44 + .../structured-data-blocks/how-to/block.json | 76 + .../css/dist/academy-2330-rtl.css | 1 + .../wordpress-seo/css/dist/academy-2330.css | 1 + .../css/dist/admin-global-2330-rtl.css | 1 + .../css/dist/admin-global-2330.css | 1 + .../css/dist/adminbar-2330-rtl.css | 1 + .../wordpress-seo/css/dist/adminbar-2330.css | 1 + .../css/dist/ai-fix-assessments-2330-rtl.css | 1 + .../css/dist/ai-fix-assessments-2330.css | 1 + .../css/dist/ai-generator-2330-rtl.css | 1 + .../css/dist/ai-generator-2330.css | 1 + .../css/dist/alerts-2330-rtl.css | 1 + .../wordpress-seo/css/dist/alerts-2330.css | 1 + .../css/dist/black-friday-banner-2330-rtl.css | 1 + .../css/dist/black-friday-banner-2330.css | 1 + .../css/dist/dashboard-2330-rtl.css | 1 + .../wordpress-seo/css/dist/dashboard-2330.css | 1 + .../css/dist/edit-page-2330-rtl.css | 1 + .../wordpress-seo/css/dist/edit-page-2330.css | 1 + .../css/dist/elementor-2330-rtl.css | 1 + .../wordpress-seo/css/dist/elementor-2330.css | 1 + .../css/dist/featured-image-2330-rtl.css | 1 + .../css/dist/featured-image-2330.css | 1 + .../css/dist/filter-explanation-2330-rtl.css | 1 + .../css/dist/filter-explanation-2330.css | 1 + .../first-time-configuration-2330-rtl.css | 1 + .../dist/first-time-configuration-2330.css | 1 + .../wordpress-seo/css/dist/icons-2330-rtl.css | 1 + .../wordpress-seo/css/dist/icons-2330.css | 1 + .../css/dist/inside-editor-2330-rtl.css | 1 + .../css/dist/inside-editor-2330.css | 1 + .../css/dist/introductions-2330-rtl.css | 1 + .../css/dist/introductions-2330.css | 1 + .../css/dist/metabox-2330-rtl.css | 1 + .../wordpress-seo/css/dist/metabox-2330.css | 3 + .../metabox-primary-category-2330-rtl.css | 1 + .../dist/metabox-primary-category-2330.css | 1 + .../wordpress-seo/css/dist/modal-2330-rtl.css | 1 + .../wordpress-seo/css/dist/modal-2330.css | 1 + .../css/dist/monorepo-2330-rtl.css | 1 + .../wordpress-seo/css/dist/monorepo-2330.css | 1 + .../css/dist/new-settings-2330-rtl.css | 1 + .../css/dist/new-settings-2330.css | 1 + .../css/dist/notifications-2330-rtl.css | 1 + .../css/dist/notifications-2330.css | 1 + .../css/dist/score_icon-2330-rtl.css | 1 + .../css/dist/score_icon-2330.css | 1 + .../dist/structured-data-blocks-2330-rtl.css | 1 + .../css/dist/structured-data-blocks-2330.css | 1 + .../css/dist/support-2330-rtl.css | 1 + .../wordpress-seo/css/dist/support-2330.css | 1 + .../css/dist/tailwind-2330-rtl.css | 1 + .../wordpress-seo/css/dist/tailwind-2330.css | 1 + .../css/dist/toggle-switch-2330-rtl.css | 1 + .../css/dist/toggle-switch-2330.css | 1 + .../css/dist/tooltips-2330-rtl.css | 1 + .../wordpress-seo/css/dist/tooltips-2330.css | 1 + .../css/dist/workouts-2330-rtl.css | 1 + .../wordpress-seo/css/dist/workouts-2330.css | 1 + .../css/dist/wpseo-dismissible-2330-rtl.css | 1 + .../css/dist/wpseo-dismissible-2330.css | 1 + .../css/dist/yoast-extensions-2330-rtl.css | 1 + .../css/dist/yoast-extensions-2330.css | 1 + .../css/dist/yst_plugin_tools-2330-rtl.css | 1 + .../css/dist/yst_plugin_tools-2330.css | 1 + .../css/dist/yst_seo_score-2330-rtl.css | 1 + .../css/dist/yst_seo_score-2330.css | 1 + .../wordpress-seo/css/main-sitemap.xsl | 145 + .../images/Yoast_SEO_negative_icon.svg | 1 + .../academy/ai_for_seo_icon_my_yoast.png | Bin 0 -> 16291 bytes .../images/academy/all_around_seo.png | Bin 0 -> 8249 bytes .../images/academy/block_editor.png | Bin 0 -> 1441 bytes .../images/academy/copywriting.png | Bin 0 -> 5630 bytes .../images/academy/crawlability.png | Bin 0 -> 9760 bytes .../images/academy/ecommerce.png | Bin 0 -> 6167 bytes .../images/academy/hosting_and_server.png | Bin 0 -> 9015 bytes .../images/academy/keyword_research.png | Bin 0 -> 4934 bytes .../wordpress-seo/images/academy/local.png | Bin 0 -> 8257 bytes .../images/academy/multilingual.png | Bin 0 -> 13240 bytes .../images/academy/seo_for_beginners.png | Bin 0 -> 4337 bytes .../images/academy/seo_for_wp.png | Bin 0 -> 7855 bytes .../images/academy/site_structure.png | Bin 0 -> 9948 bytes .../academy/structured_data_for_beginners.png | Bin 0 -> 4309 bytes .../academy/understanding_structured_data.png | Bin 0 -> 4227 bytes .../images/academy/wp_for_beginners.png | Bin 0 -> 10623 bytes .../plugins/wordpress-seo/images/acf-logo.png | Bin 0 -> 3774 bytes .../wordpress-seo/images/admin_bar.png | Bin 0 -> 21035 bytes .../images/ai-fix-assessments-thumbnail.png | Bin 0 -> 46609 bytes .../images/ai-generator-preview.png | Bin 0 -> 17429 bytes .../wordpress-seo/images/ai-generator.png | Bin 0 -> 16253 bytes .../wordpress-seo/images/alert-error-icon.svg | 1 + .../wordpress-seo/images/alert-info-icon.svg | 1 + .../images/alert-success-icon.svg | 1 + .../images/alert-warning-icon.svg | 1 + .../images/cornerstone_content.png | Bin 0 -> 16450 bytes .../wordpress-seo/images/error-icon.svg | 1 + .../images/inclusive_language_analysis.png | Bin 0 -> 20788 bytes .../plugins/wordpress-seo/images/index.php | 4 + .../images/indexables_3_left_bubble_optm.svg | 1 + .../plugins/wordpress-seo/images/indexnow.png | Bin 0 -> 13613 bytes .../plugins/wordpress-seo/images/insights.png | Bin 0 -> 30697 bytes .../wordpress-seo/images/link-in-icon.svg | 1 + .../wordpress-seo/images/link-out-icon.svg | 1 + .../wordpress-seo/images/link_suggestions.png | Bin 0 -> 16987 bytes .../images/local_plugin_assistant.svg | 1 + .../mirrored_fit_bubble_man_1_optim.svg | 1 + .../mirrored_fit_bubble_woman_1_optim.svg | 1 + .../mirrored_fit_bubble_woman_2_optim.svg | 1 + .../images/new-to-configuration-notice.svg | 1 + .../images/news_plugin_assistant.svg | 1 + .../wordpress-seo/images/open_graph.png | Bin 0 -> 22912 bytes .../images/plugin_subscription.svg | 1 + .../wordpress-seo/images/question-mark.png | Bin 0 -> 250 bytes .../wordpress-seo/images/readability-icon.svg | 1 + .../images/readability_analysis.png | Bin 0 -> 18551 bytes .../plugins/wordpress-seo/images/rest_api.png | Bin 0 -> 18100 bytes .../wordpress-seo/images/seo_analysis.png | Bin 0 -> 14291 bytes .../wordpress-seo/images/slack_sharing.png | Bin 0 -> 14496 bytes ...stale-cornerstone-content-in-yoast-seo.png | Bin 0 -> 24197 bytes .../images/succes_marieke_bubble_optm.svg | 1 + .../wordpress-seo/images/support-team.svg | 1 + .../wordpress-seo/images/support/github.png | Bin 0 -> 9480 bytes .../images/support/help_center.png | Bin 0 -> 18458 bytes .../images/support/support_forums.png | Bin 0 -> 16607 bytes .../images/text_link_counter.png | Bin 0 -> 13500 bytes .../wordpress-seo/images/twitter_card.png | Bin 0 -> 16134 bytes .../images/video_plugin_assistant.svg | 1 + .../images/woo_plugin_assistant.svg | 1 + .../wordpress-seo/images/xml_sitemaps.png | Bin 0 -> 24982 bytes .../wordpress-seo/inc/class-addon-manager.php | 878 +++ .../inc/class-my-yoast-api-request.php | 207 + .../wordpress-seo/inc/class-post-type.php | 131 + .../wordpress-seo/inc/class-rewrite.php | 231 + .../inc/class-upgrade-history.php | 136 + .../wordpress-seo/inc/class-upgrade.php | 1831 ++++++ .../inc/class-wpseo-admin-bar-menu.php | 926 +++ .../inc/class-wpseo-content-images.php | 112 + .../inc/class-wpseo-custom-fields.php | 75 + .../inc/class-wpseo-custom-taxonomies.php | 72 + .../inc/class-wpseo-image-utils.php | 537 ++ .../inc/class-wpseo-installation.php | 48 + .../wordpress-seo/inc/class-wpseo-meta.php | 1090 +++ .../inc/class-wpseo-primary-term.php | 86 + .../wordpress-seo/inc/class-wpseo-rank.php | 338 + .../inc/class-wpseo-replace-vars.php | 1646 +++++ .../inc/class-wpseo-replacement-variable.php | 76 + .../inc/class-wpseo-shortlinker.php | 54 + .../inc/class-wpseo-statistics.php | 62 + .../wordpress-seo/inc/class-wpseo-utils.php | 1103 ++++ .../inc/class-yoast-dynamic-rewrites.php | 178 + .../plugins/wordpress-seo/inc/date-helper.php | 61 + .../class-myyoast-bad-request-exception.php | 13 + .../class-myyoast-invalid-json-exception.php | 13 + .../plugins/wordpress-seo/inc/index.php | 4 + ...rface-wpseo-wordpress-ajax-integration.php | 19 + .../interface-wpseo-wordpress-integration.php | 21 + .../wordpress-seo/inc/language-utils.php | 52 + .../inc/options/class-wpseo-option-ms.php | 260 + .../inc/options/class-wpseo-option-social.php | 336 + .../inc/options/class-wpseo-option-titles.php | 1006 +++ .../inc/options/class-wpseo-option-wpseo.php | 654 ++ .../inc/options/class-wpseo-option.php | 894 +++ .../inc/options/class-wpseo-options.php | 596 ++ .../inc/options/class-wpseo-taxonomy-meta.php | 566 ++ .../class-author-sitemap-provider.php | 244 + .../class-post-type-sitemap-provider.php | 766 +++ .../inc/sitemaps/class-sitemap-cache-data.php | 200 + .../sitemaps/class-sitemap-image-parser.php | 509 ++ .../inc/sitemaps/class-sitemaps-admin.php | 125 + .../class-sitemaps-cache-validator.php | 326 + .../inc/sitemaps/class-sitemaps-cache.php | 359 + .../inc/sitemaps/class-sitemaps-renderer.php | 355 + .../inc/sitemaps/class-sitemaps-router.php | 161 + .../inc/sitemaps/class-sitemaps.php | 674 ++ .../class-taxonomy-sitemap-provider.php | 351 + .../sitemaps/interface-sitemap-cache-data.php | 72 + .../sitemaps/interface-sitemap-provider.php | 41 + .../inc/wpseo-functions-deprecated.php | 6 + .../wordpress-seo/inc/wpseo-functions.php | 239 + .../inc/wpseo-non-ajax-functions.php | 57 + wp-content/plugins/wordpress-seo/index.php | 4 + .../plugins/wordpress-seo/js/dist/academy.js | 10 + .../js/dist/addon-installation.js | 7 + .../wordpress-seo/js/dist/admin-global.js | 1 + .../wordpress-seo/js/dist/admin-modules.js | 4 + .../wordpress-seo/js/dist/analysis-worker.js | 1 + .../wordpress-seo/js/dist/api-client.js | 1 + .../wordpress-seo/js/dist/block-editor.js | 601 ++ .../wordpress-seo/js/dist/bulk-editor.js | 1 + .../wordpress-seo/js/dist/classic-editor.js | 548 ++ .../wordpress-seo/js/dist/crawl-settings.js | 1 + .../wordpress-seo/js/dist/dashboard-widget.js | 1 + .../wordpress-seo/js/dist/dynamic-blocks.js | 1 + .../wordpress-seo/js/dist/edit-page.js | 1 + .../wordpress-seo/js/dist/editor-modules.js | 324 + .../wordpress-seo/js/dist/elementor.js | 577 ++ .../js/dist/externals-components.js | 279 + .../js/dist/externals-contexts.js | 1 + .../wordpress-seo/js/dist/externals-redux.js | 1 + .../js/dist/externals/analysis.js | 368 ++ .../js/dist/externals/analysisReport.js | 43 + .../js/dist/externals/chart.js.js | 1 + .../js/dist/externals/componentsNew.js | 1125 ++++ .../js/dist/externals/draftJs.js | 1 + .../js/dist/externals/featureFlag.js | 1 + .../js/dist/externals/helpers.js | 26 + .../wordpress-seo/js/dist/externals/jed.js | 1 + .../js/dist/externals/propTypes.js | 1 + .../js/dist/externals/reactHelmet.js | 1 + .../wordpress-seo/js/dist/externals/redux.js | 1 + .../js/dist/externals/reduxJsToolkit.js | 1 + .../externals/replacementVariableEditor.js | 85 + .../dist/externals/searchMetadataPreviews.js | 317 + .../js/dist/externals/socialMetadataForms.js | 23 + .../js/dist/externals/styleGuide.js | 13 + .../js/dist/externals/styledComponents.js | 1 + .../js/dist/externals/uiLibrary.js | 1 + .../wordpress-seo/js/dist/faq-block.js | 1 + .../js/dist/filter-explanation.js | 1 + .../js/dist/first-time-configuration.js | 18 + .../js/dist/frontend-inspector-resources.js | 1 + .../js/dist/help-scout-beacon.js | 69 + .../wordpress-seo/js/dist/how-to-block.js | 10 + .../plugins/wordpress-seo/js/dist/import.js | 1 + .../wordpress-seo/js/dist/indexation.js | 8 + .../js/dist/installation-success.js | 6 + .../js/dist/integrations-page.js | 43 + .../wordpress-seo/js/dist/introductions.js | 13 + .../wordpress-seo/js/dist/languages/ar.js | 1 + .../wordpress-seo/js/dist/languages/ca.js | 1 + .../wordpress-seo/js/dist/languages/cs.js | 1 + .../wordpress-seo/js/dist/languages/de.js | 1 + .../js/dist/languages/default.js | 1 + .../wordpress-seo/js/dist/languages/el.js | 1 + .../wordpress-seo/js/dist/languages/en.js | 1 + .../wordpress-seo/js/dist/languages/es.js | 1 + .../wordpress-seo/js/dist/languages/fa.js | 1 + .../wordpress-seo/js/dist/languages/fr.js | 1 + .../wordpress-seo/js/dist/languages/he.js | 1 + .../wordpress-seo/js/dist/languages/hu.js | 1 + .../wordpress-seo/js/dist/languages/id.js | 1 + .../wordpress-seo/js/dist/languages/it.js | 1 + .../wordpress-seo/js/dist/languages/ja.js | 1 + .../wordpress-seo/js/dist/languages/nb.js | 1 + .../wordpress-seo/js/dist/languages/nl.js | 1 + .../wordpress-seo/js/dist/languages/pl.js | 1 + .../wordpress-seo/js/dist/languages/pt.js | 1 + .../wordpress-seo/js/dist/languages/ru.js | 1 + .../wordpress-seo/js/dist/languages/sk.js | 1 + .../wordpress-seo/js/dist/languages/sv.js | 1 + .../wordpress-seo/js/dist/languages/tr.js | 1 + .../wordpress-seo/js/dist/network-admin.js | 1 + .../wordpress-seo/js/dist/new-settings.js | 349 + .../wordpress-seo/js/dist/post-edit.js | 25 + .../js/dist/quick-edit-handler.js | 1 + .../wordpress-seo/js/dist/react-select.js | 1 + .../js/dist/redirect-old-features-tab.js | 1 + .../wordpress-seo/js/dist/reindex-links.js | 1 + .../plugins/wordpress-seo/js/dist/settings.js | 3 + .../plugins/wordpress-seo/js/dist/support.js | 25 + .../wordpress-seo/js/dist/term-edit.js | 17 + .../js/dist/used-keywords-assessment.js | 1 + .../js/dist/wincher-dashboard-widget.js | 119 + .../plugins/wordpress-seo/js/dist/workouts.js | 6 + .../wordpress-seo/lib/abstract-main.php | 174 + .../container-registry.php | 72 + .../wordpress-seo/lib/migrations/adapter.php | 1078 +++ .../wordpress-seo/lib/migrations/column.php | 101 + .../lib/migrations/constants.php | 22 + .../lib/migrations/migration.php | 277 + .../wordpress-seo/lib/migrations/table.php | 260 + .../plugins/wordpress-seo/lib/model.php | 730 ++ wp-content/plugins/wordpress-seo/lib/orm.php | 2553 +++++++ wp-content/plugins/wordpress-seo/license.txt | 642 ++ .../packages/js/images/Yoast_SEO_Icon.svg | 1 + .../packages/js/images/Yoast_icon_kader.svg | 1 + .../packages/js/images/algolia-logo.svg | 10 + .../js/images/connection-assistant.svg | 26 + .../packages/js/images/edd-logo.svg | 1 + .../packages/js/images/elementor-logo.svg | 1 + .../packages/js/images/g2_logo_white_optm.svg | 1 + .../packages/js/images/icon-arrow-down.svg | 1 + .../packages/js/images/icon-facebook.svg | 1 + .../packages/js/images/icon-twitter.svg | 1 + .../images/indexables_1_left_bubble_optm.svg | 1 + .../images/indexables_2_left_bubble_optm.svg | 1 + .../images/jetpack-boost-integration-logo.svg | 27 + .../packages/js/images/jetpack-boost-logo.svg | 1 + .../packages/js/images/jetpack-logo.svg | 53 + .../packages/js/images/logo-g2-white.svg | 1 + .../packages/js/images/mastodon-logo.svg | 4 + .../images/motivated_bubble_woman_1_optim.svg | 43 + .../packages/js/images/semrush-logo.svg | 10 + .../packages/js/images/ssp-logo.svg | 12 + .../packages/js/images/star-rating-half.svg | 1 + .../packages/js/images/star-rating-star.svg | 1 + .../js/images/succes_marieke_bubble_optm.svg | 1 + .../packages/js/images/tec-logo.svg | 20 + .../packages/js/images/wincher-logo.svg | 1 + .../js/images/woocommerce-seo-logo.svg | 1 + .../packages/js/images/wordproof-logo.svg | 1 + .../js/images/wp-recipe-maker-logo.svg | 1 + .../packages/js/images/x-logo.svg | 3 + .../js/images/yoast-seo-simple-logo.svg | 1 + .../js/images/yoast_loading_spinner.svg | 1 + wp-content/plugins/wordpress-seo/readme.txt | 306 + .../addon-activate-action.php | 86 + .../addon-install-action.php | 131 + .../src/actions/alert-dismissal-action.php | 215 + .../first-time-configuration-action.php | 344 + .../abstract-aioseo-importing-action.php | 266 + ...tract-aioseo-settings-importing-action.php | 342 + .../aioseo/aioseo-cleanup-action.php | 176 + ...stom-archive-settings-importing-action.php | 111 + ...ault-archive-settings-importing-action.php | 103 + ...oseo-general-settings-importing-action.php | 213 + .../aioseo/aioseo-posts-importing-action.php | 624 ++ ...ype-defaults-settings-importing-action.php | 99 + ...seo-taxonomy-settings-importing-action.php | 108 + .../aioseo/aioseo-validate-data-action.php | 255 + .../deactivate-conflicting-plugins-action.php | 145 + .../importing/importing-action-interface.php | 32 + .../importing-indexation-action-interface.php | 34 + .../indexables/indexable-head-action.php | 174 + .../indexing/abstract-indexing-action.php | 103 + .../abstract-link-indexing-action.php | 123 + .../indexable-general-indexation-action.php | 138 + .../indexable-indexing-complete-action.php | 36 + .../indexable-post-indexation-action.php | 207 + ...le-post-type-archive-indexation-action.php | 212 + .../indexable-term-indexation-action.php | 188 + .../indexing/indexation-action-interface.php | 34 + .../indexing/indexing-complete-action.php | 36 + .../indexing/indexing-prepare-action.php | 40 + .../limited-indexing-action-interface.php | 18 + .../indexing/post-link-indexing-action.php | 142 + .../indexing/term-link-indexing-action.php | 129 + .../src/actions/integrations-action.php | 57 + .../actions/semrush/semrush-login-action.php | 62 + .../semrush/semrush-options-action.php | 51 + .../semrush/semrush-phrases-action.php | 96 + .../wincher/wincher-account-action.php | 105 + .../wincher/wincher-keyphrases-action.php | 363 + .../actions/wincher/wincher-login-action.php | 73 + .../missing-indexables-collector.php | 72 + .../to-be-cleaned-indexables-collector.php | 84 + .../domain/missing-indexable-bucket.php | 48 + .../domain/missing-indexable-count.php | 64 + .../domain/to-be-cleaned-indexable-bucket.php | 48 + .../domain/to-be-cleaned-indexable-count.php | 64 + .../last-completed-indexation-integration.php | 64 + .../src/builders/indexable-author-builder.php | 248 + .../src/builders/indexable-builder.php | 417 ++ .../indexable-date-archive-builder.php | 63 + .../builders/indexable-hierarchy-builder.php | 416 ++ .../builders/indexable-home-page-builder.php | 148 + .../src/builders/indexable-link-builder.php | 732 ++ .../src/builders/indexable-post-builder.php | 433 ++ .../indexable-post-type-archive-builder.php | 168 + .../builders/indexable-social-image-trait.php | 168 + .../indexable-system-page-builder.php | 80 + .../src/builders/indexable-term-builder.php | 291 + .../src/builders/primary-term-builder.php | 107 + .../src/commands/cleanup-command.php | 196 + .../src/commands/command-interface.php | 18 + .../src/commands/index-command.php | 296 + .../addon-installation-conditional.php | 19 + .../src/conditionals/admin-conditional.php | 18 + ...doing-post-quick-edit-save-conditional.php | 37 + .../estimated-reading-time-conditional.php | 60 + .../admin/licenses-page-conditional.php | 31 + .../admin/non-network-admin-conditional.php | 20 + .../conditionals/admin/post-conditional.php | 32 + .../posts-overview-or-ajax-conditional.php | 21 + .../admin/yoast-admin-conditional.php | 41 + ...hment-redirections-enabled-conditional.php | 36 + .../conditionals/conditional-interface.php | 16 + .../deactivating-yoast-seo-conditional.php | 23 + .../conditionals/development-conditional.php | 20 + .../conditionals/feature-flag-conditional.php | 37 + .../conditionals/front-end-conditional.php | 18 + .../conditionals/get-request-conditional.php | 22 + ...ess-rest-endpoints-enabled-conditional.php | 36 + .../import-tool-selected-conditional.php | 19 + .../src/conditionals/jetpack-conditional.php | 19 + .../conditionals/migrations-conditional.php | 36 + .../new-settings-ui-conditional.php | 18 + .../src/conditionals/news-conditional.php | 18 + .../conditionals/no-conditionals-trait.php | 18 + .../no-tool-selected-conditional.php | 19 + .../non-multisite-conditional.php | 18 + .../not-admin-ajax-conditional.php | 18 + .../conditionals/open-graph-conditional.php | 36 + .../premium-active-conditional.php | 18 + .../premium-inactive-conditional.php | 18 + .../primary-category-conditional.php | 49 + .../conditionals/robots-txt-conditional.php | 68 + .../semrush-enabled-conditional.php | 36 + .../src/conditionals/settings-conditional.php | 40 + .../should-index-links-conditional.php | 43 + .../text-formality-conditional.php | 19 + .../elementor-activated-conditional.php | 20 + .../elementor-edit-conditional.php | 39 + .../jetpack-boost-active-conditional.php | 20 + .../jetpack-boost-not-premium-conditional.php | 36 + .../third-party/polylang-conditional.php | 20 + .../translatepress-conditional.php | 20 + .../w3-total-cache-conditional.php | 24 + .../third-party/wpml-conditional.php | 20 + .../third-party/wpml-wpseo-conditional.php | 28 + .../traits/admin-conditional-trait.php | 20 + ...updated-importer-framework-conditional.php | 18 + .../user-can-edit-users-conditional.php | 20 + ...r-can-manage-wpseo-options-conditional.php | 20 + ...an-publish-posts-and-pages-conditional.php | 20 + .../conditionals/user-edit-conditional.php | 24 + .../conditionals/user-profile-conditional.php | 24 + .../conditionals/web-stories-conditional.php | 18 + ...incher-automatically-track-conditional.php | 36 + .../src/conditionals/wincher-conditional.php | 8 + .../wincher-enabled-conditional.php | 36 + .../wincher-token-conditional.php | 36 + .../conditionals/woocommerce-conditional.php | 18 + .../wp-cron-enabled-conditional.php | 18 + .../conditionals/wp-robots-conditional.php | 18 + .../src/conditionals/xmlrpc-conditional.php | 18 + .../yoast-admin-and-dashboard-conditional.php | 55 + .../yoast-tools-page-conditional.php | 28 + .../src/config/badge-group-names.php | 62 + .../src/config/conflicting-plugins.php | 111 + .../src/config/indexing-reasons.php | 49 + .../src/config/migration-status.php | 176 + .../20171228151840_WpYoastIndexable.php | 364 + .../20171228151841_WpYoastPrimaryTerm.php | 102 + ..._WpYoastDropIndexableMetaTableIfExists.php | 49 + ...191011111109_WpYoastIndexableHierarchy.php | 83 + .../20200408101900_AddCollationToTables.php | 53 + .../20200420073606_AddColumnsToIndexables.php | 96 + ...23747_BreadcrumbTitleAndHierarchyReset.php | 64 + ...428194858_ExpandIndexableColumnLengths.php | 84 + ...20200429105310_TruncateIndexableTables.php | 56 + ...75614_AddIndexableObjectIdAndTypeIndex.php | 64 + .../20200430150130_ClearIndexableTables.php | 56 + ...200507054848_DeleteDuplicateIndexables.php | 52 + ...513133401_ResetIndexableHierarchyTable.php | 46 + .../20200609154515_AddHasAncestorsColumn.php | 53 + ...200616130143_ReplacePermalinkHashIndex.php | 126 + .../20200617122511_CreateSEOLinksTable.php | 96 + ...702141921_CreateIndexableSubpagesIndex.php | 72 + ...ddIndexesForProminentWordsOnIndexables.php | 68 + ...20201202144329_AddEstimatedReadingTime.php | 58 + ...6124002_ExpandIndexableIDColumnLengths.php | 63 + ...41134_ExpandPrimaryTermIDColumnLengths.php | 62 + ...817092415_AddVersionColumnToIndexables.php | 56 + .../20211020091404_AddObjectTimestamps.php | 88 + ...230417083836_AddInclusiveLanguageScore.php | 58 + .../wordpress-seo/src/config/oauth-client.php | 308 + .../src/config/researcher-languages.php | 11 + .../wordpress-seo/src/config/schema-ids.php | 59 + .../wordpress-seo/src/config/schema-types.php | 169 + .../src/config/semrush-client.php | 86 + .../src/config/wincher-client.php | 132 + .../src/config/wincher-pkce-provider.php | 257 + ...-type-visibility-dismiss-notifications.php | 128 + ...ontent-type-visibility-watcher-actions.php | 174 + ...tent-type-visibility-dismiss-new-route.php | 155 + .../src/context/meta-tags-context.php | 774 +++ .../src/deprecated/admin/class-customizer.php | 72 + .../src/deprecated/frontend/breadcrumbs.php | 144 + .../src/deprecated/frontend/frontend.php | 282 + .../wordpress-seo/src/deprecated/index.php | 4 + ...rdproof-integration-active-conditional.php | 50 + .../wordproof-plugin-inactive-conditional.php | 28 + .../src/config/wordproof-app-config.php | 42 + .../src/config/wordproof-translations.php | 131 + .../src/helpers/wordproof-helper.php | 110 + .../admin/old-premium-integration.php | 124 + .../src/integrations/third-party/wincher.php | 104 + .../wordproof-integration-toggle.php | 138 + .../integrations/third-party/wordproof.php | 215 + ...s-and-descriptions-introduction-upsell.php | 118 + .../enabled-analysis-features-repository.php | 55 + .../integration-information-repository.php | 43 + .../seo/post-seo-information-repository.php | 62 + .../seo/term-seo-information-repository.php | 63 + .../site/website-information-repository.php | 61 + .../analysis-feature-interface.php | 30 + .../analysis-features/analysis-feature.php | 79 + .../analysis-features-list.php | 40 + .../integration-data-provider-interface.php | 31 + .../src/editors/domain/seo/description.php | 58 + .../src/editors/domain/seo/keyphrase.php | 58 + .../domain/seo/seo-plugin-data-interface.php | 23 + .../src/editors/domain/seo/social.php | 85 + .../src/editors/domain/seo/title.php | 58 + .../editors/framework/cornerstone-content.php | 55 + .../framework/inclusive-language-analysis.php | 116 + .../integrations/jetpack-markdown.php | 70 + .../framework/integrations/multilingual.php | 89 + .../framework/integrations/semrush.php | 90 + .../framework/integrations/wincher.php | 75 + .../editors/framework/keyphrase-analysis.php | 73 + .../framework/previously-used-keyphrase.php | 43 + .../framework/readability-analysis.php | 73 + .../description-data-provider-interface.php | 20 + .../framework/seo/keyphrase-interface.php | 13 + .../posts/abstract-post-seo-data-provider.php | 37 + .../seo/posts/description-data-provider.php | 85 + .../seo/posts/keyphrase-data-provider.php | 88 + .../seo/posts/social-data-provider.php | 133 + .../seo/posts/title-data-provider.php | 74 + .../seo/social-data-provider-interface.php | 34 + .../terms/abstract-term-seo-data-provider.php | 50 + .../seo/terms/description-data-provider.php | 40 + .../seo/terms/keyphrase-data-provider.php | 36 + .../seo/terms/social-data-provider.php | 133 + .../seo/terms/title-data-provider.php | 41 + .../seo/title-data-provider-interface.php | 15 + .../framework/site/base-site-information.php | 106 + .../framework/site/post-site-information.php | 164 + .../framework/site/term-site-information.php | 137 + .../framework/word-form-recognition.php | 55 + .../addon-activation-error-exception.php | 10 + .../addon-already-installed-exception.php | 10 + .../addon-installation-error-exception.php | 10 + ...user-cannot-activate-plugins-exception.php | 10 + .../user-cannot-install-plugins-exception.php | 10 + .../forbidden-property-mutation-exception.php | 34 + .../importing/aioseo-validation-exception.php | 19 + .../indexable/author-not-built-exception.php | 51 + .../indexable/indexable-exception.php | 12 + .../indexable/invalid-term-exception.php | 26 + .../indexable/not-built-exception.php | 23 + .../indexable/post-not-built-exception.php | 34 + .../indexable/post-not-found-exception.php | 18 + .../post-type-not-built-exception.php | 22 + .../exceptions/indexable/source-exception.php | 10 + .../indexable/term-not-built-exception.php | 22 + .../indexable/term-not-found-exception.php | 18 + .../src/exceptions/missing-method.php | 30 + .../oauth/authentication-failed-exception.php | 33 + .../oauth/tokens/empty-property-exception.php | 20 + .../oauth/tokens/empty-token-exception.php | 18 + .../oauth/tokens/failed-storage-exception.php | 24 + .../plugins/wordpress-seo/src/functions.php | 38 + .../src/generated/assets/externals.php | 1 + .../src/generated/assets/languages.php | 1 + .../src/generated/assets/plugin.php | 1 + .../wordpress-seo/src/generated/container.php | 5857 +++++++++++++++++ .../src/generators/breadcrumbs-generator.php | 431 ++ .../src/generators/generator-interface.php | 17 + .../generators/open-graph-image-generator.php | 232 + .../open-graph-locale-generator.php | 221 + .../src/generators/schema-generator.php | 419 ++ .../schema/abstract-schema-piece.php | 49 + .../src/generators/schema/article.php | 234 + .../src/generators/schema/author.php | 113 + .../src/generators/schema/breadcrumb.php | 186 + .../src/generators/schema/faq.php | 113 + .../src/generators/schema/howto.php | 199 + .../src/generators/schema/main-image.php | 46 + .../src/generators/schema/organization.php | 88 + .../src/generators/schema/person.php | 316 + .../src/generators/schema/webpage.php | 163 + .../src/generators/schema/website.php | 98 + .../generators/twitter-image-generator.php | 102 + .../src/helpers/aioseo-helper.php | 66 + .../src/helpers/asset-helper.php | 98 + .../src/helpers/attachment-cleanup-helper.php | 73 + .../src/helpers/author-archive-helper.php | 182 + .../src/helpers/blocks-helper.php | 100 + .../src/helpers/capability-helper.php | 86 + .../src/helpers/crawl-cleanup-helper.php | 314 + .../wordpress-seo/src/helpers/curl-helper.php | 33 + .../src/helpers/current-page-helper.php | 489 ++ .../wordpress-seo/src/helpers/date-helper.php | 120 + .../src/helpers/environment-helper.php | 33 + ...first-time-configuration-notice-helper.php | 179 + .../src/helpers/home-url-helper.php | 49 + .../src/helpers/image-helper.php | 417 ++ .../src/helpers/import-cursor-helper.php | 58 + .../src/helpers/import-helper.php | 31 + .../src/helpers/indexable-helper.php | 319 + .../helpers/indexable-to-postmeta-helper.php | 232 + .../src/helpers/indexing-helper.php | 397 ++ .../src/helpers/language-helper.php | 83 + .../wordpress-seo/src/helpers/meta-helper.php | 79 + .../src/helpers/notification-helper.php | 25 + .../src/helpers/open-graph/image-helper.php | 111 + .../src/helpers/open-graph/values-helper.php | 85 + .../src/helpers/options-helper.php | 141 + .../src/helpers/pagination-helper.php | 207 + .../src/helpers/permalink-helper.php | 46 + .../wordpress-seo/src/helpers/post-helper.php | 228 + .../src/helpers/post-type-helper.php | 251 + .../src/helpers/primary-term-helper.php | 47 + .../src/helpers/product-helper.php | 62 + .../src/helpers/redirect-helper.php | 70 + .../src/helpers/request-helper.php | 18 + .../src/helpers/require-file-helper.php | 18 + .../src/helpers/robots-helper.php | 78 + .../src/helpers/robots-txt-helper.php | 108 + .../src/helpers/sanitization-helper.php | 39 + .../src/helpers/schema/article-helper.php | 35 + .../src/helpers/schema/html-helper.php | 76 + .../src/helpers/schema/id-helper.php | 29 + .../src/helpers/schema/image-helper.php | 205 + .../src/helpers/schema/language-helper.php | 32 + .../helpers/schema/replace-vars-helper.php | 135 + .../src/helpers/score-icon-helper.php | 98 + .../src/helpers/short-link-helper.php | 152 + .../wordpress-seo/src/helpers/site-helper.php | 28 + .../src/helpers/social-profiles-helper.php | 330 + .../src/helpers/string-helper.php | 45 + .../src/helpers/taxonomy-helper.php | 182 + .../src/helpers/twitter/image-helper.php | 58 + .../wordpress-seo/src/helpers/url-helper.php | 295 + .../wordpress-seo/src/helpers/user-helper.php | 109 + .../src/helpers/wincher-helper.php | 93 + .../src/helpers/woocommerce-helper.php | 71 + .../src/helpers/wordpress-helper.php | 22 + .../wordpress-seo/src/helpers/wpdb-helper.php | 44 + .../initializers/crawl-cleanup-permalinks.php | 207 + .../initializers/disable-core-sitemaps.php | 121 + .../initializers/initializer-interface.php | 20 + .../src/initializers/migration-runner.php | 171 + .../src/initializers/woocommerce.php | 34 + .../abstract-exclude-post-type.php | 46 + .../src/integrations/academy-integration.php | 183 + .../admin/activation-cleanup-integration.php | 72 + .../addon-installation/dialog-integration.php | 145 + .../installation-integration.php | 198 + .../admin/admin-columns-cache-integration.php | 279 + .../admin/background-indexing-integration.php | 397 ++ .../admin/crawl-settings-integration.php | 326 + .../integrations/admin/cron-integration.php | 51 + .../admin/deactivated-premium-integration.php | 151 + ...isable-concatenate-scripts-integration.php | 45 + .../first-time-configuration-integration.php | 522 ++ ...-time-configuration-notice-integration.php | 152 + .../fix-news-dependencies-integration.php | 62 + .../admin/health-check-integration.php | 101 + .../integrations/admin/helpscout-beacon.php | 470 ++ .../integrations/admin/import-integration.php | 248 + ...ndexables-exclude-taxonomy-integration.php | 55 + .../indexing-notification-integration.php | 252 + .../admin/indexing-tool-integration.php | 249 + .../installation-success-integration.php | 157 + .../integrations/admin/integrations-page.php | 225 + .../admin/link-count-columns-integration.php | 258 + .../admin/menu-badge-integration.php | 38 + .../admin/migration-error-integration.php | 58 + .../admin/old-configuration-integration.php | 70 + .../admin/redirect-integration.php | 71 + .../admin/redirects-page-integration.php | 65 + .../admin/unsupported-php-version-notice.php | 167 + .../admin/workouts-integration.php | 337 + .../alerts/abstract-dismissable-alert.php | 45 + ...-product-editor-checklist-notification.php | 17 + .../black-friday-promotion-notification.php | 16 + ...-friday-sidebar-checklist-notification.php | 16 + .../alerts/jetpack-boost-pre-publish.php | 26 + .../alerts/trustpilot-review-notification.php | 16 + .../alerts/webinar-promo-notification.php | 16 + .../blocks/abstract-dynamic-block-v3.php | 78 + .../blocks/abstract-dynamic-block.php | 70 + .../integrations/blocks/block-categories.php | 52 + .../integrations/blocks/breadcrumbs-block.php | 138 + .../blocks/structured-data-blocks.php | 425 ++ .../integrations/breadcrumbs-integration.php | 82 + .../src/integrations/cleanup-integration.php | 341 + .../duplicate-post-integration.php | 36 + .../integrations/estimated-reading-time.php | 49 + .../exclude-attachment-post-type.php | 32 + .../exclude-oembed-cache-post-type.php | 32 + .../integrations/feature-flag-integration.php | 106 + .../integrations/front-end-integration.php | 573 ++ .../front-end/backwards-compatibility.php | 72 + .../front-end/category-term-description.php | 51 + .../front-end/comment-link-fixer.php | 140 + .../front-end/crawl-cleanup-basic.php | 138 + .../front-end/crawl-cleanup-rss.php | 201 + .../front-end/crawl-cleanup-searches.php | 206 + .../front-end/feed-improvements.php | 185 + .../front-end/force-rewrite-title.php | 181 + .../src/integrations/front-end/handle-404.php | 126 + .../front-end/indexing-controls.php | 109 + .../front-end/open-graph-oembed.php | 155 + .../src/integrations/front-end/redirects.php | 277 + .../front-end/robots-txt-integration.php | 292 + .../front-end/rss-footer-embed.php | 196 + .../schema-accessibility-feature.php | 80 + .../front-end/wp-robots-integration.php | 203 + .../integrations/integration-interface.php | 22 + .../src/integrations/primary-category.php | 73 + .../src/integrations/settings-integration.php | 989 +++ .../src/integrations/support-integration.php | 174 + .../src/integrations/third-party/amp.php | 61 + .../src/integrations/third-party/bbpress.php | 62 + .../integrations/third-party/elementor.php | 856 +++ .../exclude-elementor-post-types.php | 34 + .../exclude-woocommerce-post-types.php | 34 + .../src/integrations/third-party/jetpack.php | 34 + .../third-party/w3-total-cache.php | 33 + .../third-party/web-stories-post-edit.php | 47 + .../integrations/third-party/web-stories.php | 136 + .../third-party/wincher-publish.php | 162 + .../third-party/woocommerce-permalinks.php | 112 + .../third-party/woocommerce-post-edit.php | 49 + .../integrations/third-party/woocommerce.php | 350 + .../third-party/wpml-wpseo-notification.php | 120 + .../src/integrations/third-party/wpml.php | 70 + .../integrations/uninstall-integration.php | 48 + .../watchers/addon-update-watcher.php | 229 + .../watchers/auto-update-watcher.php | 58 + .../watchers/indexable-ancestor-watcher.php | 242 + .../watchers/indexable-attachment-watcher.php | 144 + .../indexable-author-archive-watcher.php | 78 + .../watchers/indexable-author-watcher.php | 141 + .../indexable-category-permalink-watcher.php | 56 + .../indexable-date-archive-watcher.php | 96 + .../watchers/indexable-home-page-watcher.php | 137 + .../watchers/indexable-homeurl-watcher.php | 114 + .../watchers/indexable-permalink-watcher.php | 279 + .../watchers/indexable-post-meta-watcher.php | 111 + .../indexable-post-type-archive-watcher.php | 147 + .../indexable-post-type-change-watcher.php | 159 + .../watchers/indexable-post-watcher.php | 338 + .../indexable-static-home-page-watcher.php | 97 + .../indexable-system-page-watcher.php | 102 + .../indexable-taxonomy-change-watcher.php | 161 + .../watchers/indexable-term-watcher.php | 152 + .../watchers/option-titles-watcher.php | 130 + .../watchers/option-wpseo-watcher.php | 127 + .../primary-category-quick-edit-watcher.php | 195 + .../watchers/primary-term-watcher.php | 161 + .../search-engines-discouraged-watcher.php | 233 + .../woocommerce-beta-editor-watcher.php | 146 + .../wordpress-seo/src/integrations/xmlrpc.php | 50 + .../application/ai-fix-assessments-upsell.php | 96 + .../application/current-page-trait.php | 43 + .../application/introductions-collector.php | 131 + .../application/user-allowed-trait.php | 23 + .../application/version-trait.php | 21 + .../domain/introduction-interface.php | 40 + .../domain/introduction-item.php | 64 + .../domain/introductions-bucket.php | 49 + .../domain/invalid-user-id-exception.php | 29 + .../introductions-seen-repository.php | 115 + .../wistia-embed-permission-repository.php | 80 + .../wordpress-seo/src/introductions/readme.md | 27 + .../introductions-integration.php | 164 + .../introductions-seen-route.php | 146 + .../wistia-embed-permission-route.php | 154 + .../wordpress-seo/src/loadable-interface.php | 16 + .../plugins/wordpress-seo/src/loader.php | 302 + .../wordpress-seo/src/loggers/logger.php | 51 + wp-content/plugins/wordpress-seo/src/main.php | 82 + .../memoizers/meta-tags-context-memoizer.php | 178 + .../src/memoizers/presentation-memoizer.php | 89 + .../src/models/indexable-extension.php | 31 + .../src/models/indexable-hierarchy.php | 28 + .../wordpress-seo/src/models/indexable.php | 220 + .../wordpress-seo/src/models/primary-term.php | 39 + .../wordpress-seo/src/models/seo-links.php | 75 + .../wordpress-seo/src/models/seo-meta.php | 33 + .../presentations/abstract-presentation.php | 95 + .../presentations/archive-adjacent-trait.php | 79 + .../indexable-author-archive-presentation.php | 173 + .../indexable-date-archive-presentation.php | 123 + .../indexable-error-page-presentation.php | 37 + .../indexable-home-page-presentation.php | 61 + ...dexable-post-type-archive-presentation.php | 72 + .../indexable-post-type-presentation.php | 419 ++ .../presentations/indexable-presentation.php | 767 +++ ...exable-search-result-page-presentation.php | 71 + ...ndexable-static-home-page-presentation.php | 32 + ...dexable-static-posts-page-presentation.php | 50 + .../indexable-term-archive-presentation.php | 228 + .../abstract-indexable-presenter.php | 80 + .../abstract-indexable-tag-presenter.php | 73 + .../src/presenters/abstract-presenter.php | 25 + .../src/presenters/admin/alert-presenter.php | 72 + .../src/presenters/admin/badge-presenter.php | 104 + .../presenters/admin/beta-badge-presenter.php | 59 + .../presenters/admin/help-link-presenter.php | 86 + .../admin/indexing-error-presenter.php | 127 + ...indexing-failed-notification-presenter.php | 98 + .../admin/indexing-list-item-presenter.php | 50 + .../admin/indexing-notification-presenter.php | 147 + .../admin/light-switch-presenter.php | 159 + .../admin/meta-fields-presenter.php | 64 + .../admin/migration-error-presenter.php | 71 + .../src/presenters/admin/notice-presenter.php | 126 + .../admin/premium-badge-presenter.php | 59 + .../search-engines-discouraged-presenter.php | 44 + .../presenters/admin/sidebar-presenter.php | 148 + .../woocommerce-beta-editor-presenter.php | 60 + .../src/presenters/breadcrumbs-presenter.php | 259 + .../src/presenters/canonical-presenter.php | 51 + .../debug/marker-close-presenter.php | 41 + .../debug/marker-open-presenter.php | 65 + .../src/presenters/meta-author-presenter.php | 59 + .../presenters/meta-description-presenter.php | 63 + .../open-graph/article-author-presenter.php | 41 + .../article-modified-time-presenter.php | 34 + .../article-published-time-presenter.php | 34 + .../article-publisher-presenter.php | 41 + .../open-graph/description-presenter.php | 45 + .../presenters/open-graph/image-presenter.php | 145 + .../open-graph/locale-presenter.php | 41 + .../open-graph/site-name-presenter.php | 41 + .../presenters/open-graph/title-presenter.php | 44 + .../presenters/open-graph/type-presenter.php | 41 + .../presenters/open-graph/url-presenter.php | 48 + .../src/presenters/rel-next-presenter.php | 72 + .../src/presenters/rel-prev-presenter.php | 72 + .../src/presenters/robots-presenter.php | 40 + .../src/presenters/robots-txt-presenter.php | 150 + .../src/presenters/schema-presenter.php | 63 + .../src/presenters/score-icon-presenter.php | 48 + .../slack/enhanced-data-presenter.php | 66 + .../src/presenters/title-presenter.php | 79 + .../src/presenters/twitter/card-presenter.php | 34 + .../presenters/twitter/creator-presenter.php | 27 + .../twitter/description-presenter.php | 34 + .../presenters/twitter/image-presenter.php | 41 + .../src/presenters/twitter/site-presenter.php | 59 + .../presenters/twitter/title-presenter.php | 34 + .../src/presenters/url-list-presenter.php | 48 + .../presenters/webmaster/baidu-presenter.php | 27 + .../presenters/webmaster/bing-presenter.php | 27 + .../presenters/webmaster/google-presenter.php | 27 + .../webmaster/pinterest-presenter.php | 27 + .../presenters/webmaster/yandex-presenter.php | 27 + .../promotion-manager-interface.php | 25 + .../application/promotion-manager.php | 74 + .../promotions/domain/abstract-promotion.php | 52 + .../black-friday-checklist-promotion.php | 22 + .../domain/black-friday-promotion.php | 19 + .../promotions/domain/promotion-interface.php | 8 + .../src/promotions/domain/time-interval.php | 71 + .../indexable-cleanup-repository.php | 750 +++ .../indexable-hierarchy-repository.php | 171 + .../src/repositories/indexable-repository.php | 547 ++ .../repositories/primary-term-repository.php | 49 + .../src/repositories/seo-links-repository.php | 214 + .../src/routes/abstract-action-route.php | 30 + .../src/routes/abstract-indexation-route.php | 33 + .../src/routes/alert-dismissal-route.php | 104 + .../routes/first-time-configuration-route.php | 314 + .../src/routes/importing-route.php | 170 + .../src/routes/indexables-head-route.php | 104 + .../src/routes/indexing-route.php | 431 ++ .../src/routes/integrations-route.php | 103 + .../src/routes/meta-search-route.php | 98 + .../src/routes/route-interface.php | 18 + .../src/routes/semrush-route.php | 248 + .../src/routes/supported-features-route.php | 59 + .../src/routes/wincher-route.php | 331 + .../src/routes/workouts-route.php | 129 + .../src/routes/yoast-head-rest-field.php | 223 + .../health-check/default-tagline-check.php | 62 + .../health-check/default-tagline-reports.php | 68 + .../health-check/default-tagline-runner.php | 44 + .../services/health-check/health-check.php | 76 + .../health-check/links-table-check.php | 66 + .../health-check/links-table-reports.php | 105 + .../health-check/links-table-runner.php | 84 + .../myyoast-api-request-factory.php | 22 + .../health-check/page-comments-check.php | 62 + .../health-check/page-comments-reports.php | 63 + .../health-check/page-comments-runner.php | 41 + .../health-check/postname-permalink-check.php | 62 + .../postname-permalink-reports.php | 76 + .../postname-permalink-runner.php | 41 + .../health-check/report-builder-factory.php | 20 + .../services/health-check/report-builder.php | 207 + .../services/health-check/reports-trait.php | 42 + .../health-check/runner-interface.php | 16 + .../aioseo/aioseo-replacevar-service.php | 98 + .../aioseo/aioseo-robots-provider-service.php | 64 + .../aioseo-robots-transformer-service.php | 54 + .../aioseo-social-images-provider-service.php | 175 + .../importing/conflicting-plugins-service.php | 103 + .../importing/importable-detector-service.php | 86 + .../indexables/indexable-version-manager.php | 77 + .../src/surfaces/classes-surface.php | 40 + .../src/surfaces/helpers-surface.php | 164 + .../src/surfaces/meta-surface.php | 388 ++ .../surfaces/open-graph-helpers-surface.php | 96 + .../src/surfaces/schema-helpers-surface.php | 110 + .../src/surfaces/twitter-helpers-surface.php | 96 + .../src/surfaces/values/meta.php | 331 + .../additional-contactmethods-collector.php | 77 + .../user-meta/application/cleanup-service.php | 74 + .../application/custom-meta-collector.php | 54 + .../additional-contactmethod-interface.php | 23 + .../domain/custom-meta-interface.php | 30 + .../additional-contactmethods/facebook.php | 30 + .../additional-contactmethods/instagram.php | 30 + .../additional-contactmethods/linkedin.php | 30 + .../additional-contactmethods/myspace.php | 30 + .../additional-contactmethods/pinterest.php | 30 + .../additional-contactmethods/soundcloud.php | 30 + .../additional-contactmethods/tumblr.php | 30 + .../additional-contactmethods/wikipedia.php | 30 + .../framework/additional-contactmethods/x.php | 30 + .../additional-contactmethods/youtube.php | 30 + .../framework/custom-meta/author-metadesc.php | 39 + .../framework/custom-meta/author-title.php | 39 + .../custom-meta/content-analysis-disable.php | 39 + .../inclusive-language-analysis-disable.php | 39 + .../custom-meta/keyword-analysis-disable.php | 39 + .../framework/custom-meta/noindex-author.php | 39 + .../infrastructure/cleanup-repository.php | 38 + .../additional-contactmethods-integration.php | 77 + .../user-interface/cleanup-integration.php | 58 + .../custom-meta-integration.php | 81 + .../user-profiles-additions-ui.php | 97 + .../wordpress-seo/src/values/images.php | 151 + .../indexables/indexable-builder-versions.php | 44 + .../src/values/oauth/oauth-token.php | 139 + .../src/values/open-graph/images.php | 58 + .../src/values/robots/directive.php | 45 + .../src/values/robots/user-agent-list.php | 88 + .../src/values/robots/user-agent.php | 90 + .../src/values/twitter/images.php | 49 + .../wordpress-seo/src/wordpress/wrapper.php | 74 + .../src/wrappers/wp-query-wrapper.php | 50 + .../src/wrappers/wp-remote-handler.php | 65 + .../src/wrappers/wp-rewrite-wrapper.php | 20 + .../plugins/wordpress-seo/vendor/autoload.php | 7 + .../vendor/composer/ClassLoader.php | 572 ++ .../vendor/composer/InstalledVersions.php | 357 + .../wordpress-seo/vendor/composer/LICENSE | 21 + .../vendor/composer/autoload_classmap.php | 1112 ++++ .../vendor/composer/autoload_files.php | 10 + .../vendor/composer/autoload_namespaces.php | 9 + .../vendor/composer/autoload_psr4.php | 11 + .../vendor/composer/autoload_real.php | 80 + .../vendor/composer/autoload_static.php | 1150 ++++ .../vendor/composer/installed.php | 41 + .../vendor/composer/platform_check.php | 26 + .../vendor/yoast/whip/CHANGELOG.md | 102 + .../wordpress-seo/vendor/yoast/whip/LICENSE | 21 + .../vendor/yoast/whip/src/Configs/default.php | 10 + .../vendor/yoast/whip/src/Configs/version.php | 8 + .../vendor/yoast/whip/src/Configuration.php | 61 + .../whip/src/Exceptions/EmptyProperty.php | 20 + .../src/Exceptions/InvalidOperatorType.php | 27 + .../yoast/whip/src/Exceptions/InvalidType.php | 22 + .../InvalidVersionComparisonString.php | 27 + .../yoast/whip/src/Facades/wordpress.php | 60 + .../vendor/yoast/whip/src/Host.php | 107 + .../whip/src/Interfaces/DismissStorage.php | 25 + .../yoast/whip/src/Interfaces/Listener.php | 16 + .../yoast/whip/src/Interfaces/Message.php | 16 + .../whip/src/Interfaces/MessagePresenter.php | 16 + .../yoast/whip/src/Interfaces/Requirement.php | 30 + .../whip/src/Interfaces/VersionDetector.php | 23 + .../yoast/whip/src/MessageDismisser.php | 75 + .../yoast/whip/src/MessageFormatter.php | 42 + .../yoast/whip/src/Messages/BasicMessage.php | 60 + .../yoast/whip/src/Messages/HostMessage.php | 62 + .../InvalidVersionRequirementMessage.php | 53 + .../yoast/whip/src/Messages/NullMessage.php | 20 + .../whip/src/Messages/UpgradePhpMessage.php | 87 + .../vendor/yoast/whip/src/MessagesManager.php | 91 + .../src/Presenters/WPMessagePresenter.php | 112 + .../yoast/whip/src/RequirementsChecker.php | 181 + .../yoast/whip/src/VersionRequirement.php | 153 + .../vendor/yoast/whip/src/WPDismissOption.php | 45 + .../whip/src/WPMessageDismissListener.php | 66 + .../guzzlehttp/guzzle/src/BodySummarizer.php | 23 + .../guzzle/src/BodySummarizerInterface.php | 12 + .../guzzlehttp/guzzle/src/Client.php | 402 ++ .../guzzlehttp/guzzle/src/ClientInterface.php | 78 + .../guzzlehttp/guzzle/src/ClientTrait.php | 227 + .../guzzle/src/Cookie/CookieJar.php | 240 + .../guzzle/src/Cookie/CookieJarInterface.php | 74 + .../guzzle/src/Cookie/FileCookieJar.php | 92 + .../guzzle/src/Cookie/SessionCookieJar.php | 71 + .../guzzle/src/Cookie/SetCookie.php | 407 ++ .../src/Exception/BadResponseException.php | 31 + .../guzzle/src/Exception/ClientException.php | 10 + .../guzzle/src/Exception/ConnectException.php | 47 + .../guzzle/src/Exception/GuzzleException.php | 8 + .../Exception/InvalidArgumentException.php | 7 + .../guzzle/src/Exception/RequestException.php | 124 + .../guzzle/src/Exception/ServerException.php | 10 + .../Exception/TooManyRedirectsException.php | 7 + .../src/Exception/TransferException.php | 7 + .../guzzle/src/Handler/CurlFactory.php | 496 ++ .../src/Handler/CurlFactoryInterface.php | 23 + .../guzzle/src/Handler/CurlHandler.php | 43 + .../guzzle/src/Handler/CurlMultiHandler.php | 220 + .../guzzle/src/Handler/EasyHandle.php | 91 + .../guzzle/src/Handler/HeaderProcessor.php | 36 + .../guzzle/src/Handler/MockHandler.php | 174 + .../guzzlehttp/guzzle/src/Handler/Proxy.php | 49 + .../guzzle/src/Handler/StreamHandler.php | 455 ++ .../guzzlehttp/guzzle/src/HandlerStack.php | 238 + .../guzzle/src/MessageFormatter.php | 168 + .../guzzle/src/MessageFormatterInterface.php | 17 + .../guzzlehttp/guzzle/src/Middleware.php | 227 + .../guzzlehttp/guzzle/src/Pool.php | 116 + .../guzzle/src/PrepareBodyMiddleware.php | 86 + .../guzzle/src/RedirectMiddleware.php | 162 + .../guzzlehttp/guzzle/src/RequestOptions.php | 244 + .../guzzlehttp/guzzle/src/RetryMiddleware.php | 91 + .../guzzlehttp/guzzle/src/TransferStats.php | 114 + .../guzzlehttp/guzzle/src/Utils.php | 339 + .../guzzlehttp/guzzle/src/functions.php | 158 + .../guzzle/src/functions_include.php | 8 + .../promises/src/AggregateException.php | 15 + .../promises/src/CancellationException.php | 11 + .../guzzlehttp/promises/src/Coroutine.php | 143 + .../guzzlehttp/promises/src/Create.php | 68 + .../guzzlehttp/promises/src/Each.php | 56 + .../guzzlehttp/promises/src/EachPromise.php | 196 + .../promises/src/FulfilledPromise.php | 73 + .../guzzlehttp/promises/src/Is.php | 36 + .../guzzlehttp/promises/src/Promise.php | 236 + .../promises/src/PromiseInterface.php | 80 + .../promises/src/PromisorInterface.php | 15 + .../promises/src/RejectedPromise.php | 78 + .../promises/src/RejectionException.php | 41 + .../guzzlehttp/promises/src/TaskQueue.php | 65 + .../promises/src/TaskQueueInterface.php | 21 + .../guzzlehttp/promises/src/Utils.php | 217 + .../guzzlehttp/psr7/src/AppendStream.php | 203 + .../guzzlehttp/psr7/src/BufferStream.php | 121 + .../guzzlehttp/psr7/src/CachingStream.php | 125 + .../guzzlehttp/psr7/src/DroppingStream.php | 40 + .../src/Exception/MalformedUriException.php | 12 + .../guzzlehttp/psr7/src/FnStream.php | 149 + .../guzzlehttp/psr7/src/Header.php | 117 + .../guzzlehttp/psr7/src/HttpFactory.php | 76 + .../guzzlehttp/psr7/src/InflateStream.php | 33 + .../guzzlehttp/psr7/src/LazyOpenStream.php | 41 + .../guzzlehttp/psr7/src/LimitStream.php | 128 + .../guzzlehttp/psr7/src/Message.php | 189 + .../guzzlehttp/psr7/src/MessageTrait.php | 212 + .../guzzlehttp/psr7/src/MimeType.php | 27 + .../guzzlehttp/psr7/src/MultipartStream.php | 130 + .../guzzlehttp/psr7/src/NoSeekStream.php | 23 + .../guzzlehttp/psr7/src/PumpStream.php | 149 + .../guzzlehttp/psr7/src/Query.php | 104 + .../guzzlehttp/psr7/src/Request.php | 124 + .../guzzlehttp/psr7/src/Response.php | 78 + .../guzzlehttp/psr7/src/Rfc7230.php | 22 + .../guzzlehttp/psr7/src/ServerRequest.php | 266 + .../guzzlehttp/psr7/src/Stream.php | 235 + .../psr7/src/StreamDecoratorTrait.php | 131 + .../guzzlehttp/psr7/src/StreamWrapper.php | 142 + .../guzzlehttp/psr7/src/UploadedFile.php | 152 + .../guzzlehttp/psr7/src/Uri.php | 572 ++ .../guzzlehttp/psr7/src/UriComparator.php | 43 + .../guzzlehttp/psr7/src/UriNormalizer.php | 175 + .../guzzlehttp/psr7/src/UriResolver.php | 180 + .../guzzlehttp/psr7/src/Utils.php | 375 ++ .../oauth2-client/src/Grant/AbstractGrant.php | 72 + .../src/Grant/AuthorizationCode.php | 38 + .../src/Grant/ClientCredentials.php | 38 + .../Grant/Exception/InvalidGrantException.php | 25 + .../oauth2-client/src/Grant/GrantFactory.php | 91 + .../oauth2-client/src/Grant/Password.php | 38 + .../oauth2-client/src/Grant/RefreshToken.php | 38 + .../HttpBasicAuthOptionProvider.php | 38 + .../OptionProviderInterface.php | 30 + .../OptionProvider/PostAuthOptionProvider.php | 46 + .../src/Provider/AbstractProvider.php | 783 +++ .../Exception/IdentityProviderException.php | 45 + .../src/Provider/GenericProvider.php | 201 + .../src/Provider/GenericResourceOwner.php | 57 + .../src/Provider/ResourceOwnerInterface.php | 35 + .../oauth2-client/src/Token/AccessToken.php | 204 + .../src/Token/AccessTokenInterface.php | 67 + .../ResourceOwnerAccessTokenInterface.php | 25 + .../src/Tool/ArrayAccessorTrait.php | 47 + .../src/Tool/BearerAuthorizationTrait.php | 35 + .../src/Tool/GuardedPropertyTrait.php | 66 + .../src/Tool/MacAuthorizationTrait.php | 76 + .../src/Tool/ProviderRedirectTrait.php | 105 + .../src/Tool/QueryBuilderTrait.php | 33 + .../oauth2-client/src/Tool/RequestFactory.php | 67 + .../src/Tool/RequiredParameterTrait.php | 51 + .../src/ContainerExceptionInterface.php | 13 + .../psr/container/src/ContainerInterface.php | 36 + .../src/NotFoundExceptionInterface.php | 13 + .../src/ClientExceptionInterface.php | 10 + .../psr/http-client/src/ClientInterface.php | 19 + .../src/NetworkExceptionInterface.php | 23 + .../src/RequestExceptionInterface.php | 23 + .../src/RequestFactoryInterface.php | 18 + .../src/ResponseFactoryInterface.php | 18 + .../src/ServerRequestFactoryInterface.php | 24 + .../src/StreamFactoryInterface.php | 43 + .../src/UploadedFileFactoryInterface.php | 28 + .../http-factory/src/UriFactoryInterface.php | 17 + .../psr/http-message/src/MessageInterface.php | 177 + .../psr/http-message/src/RequestInterface.php | 124 + .../http-message/src/ResponseInterface.php | 66 + .../src/ServerRequestInterface.php | 249 + .../psr/http-message/src/StreamInterface.php | 144 + .../src/UploadedFileInterface.php | 118 + .../psr/http-message/src/UriInterface.php | 309 + .../psr/log/Psr/Log/AbstractLogger.php | 121 + .../log/Psr/Log/InvalidArgumentException.php | 7 + .../psr/log/Psr/Log/LogLevel.php | 18 + .../psr/log/Psr/Log/LoggerAwareInterface.php | 18 + .../psr/log/Psr/Log/LoggerAwareTrait.php | 25 + .../psr/log/Psr/Log/LoggerInterface.php | 117 + .../psr/log/Psr/Log/LoggerTrait.php | 134 + .../psr/log/Psr/Log/NullLogger.php | 30 + .../Argument/RewindableGenerator.php | 40 + .../dependency-injection/Container.php | 465 ++ .../ContainerInterface.php | 91 + .../Exception/EnvNotFoundException.php | 24 + .../Exception/ExceptionInterface.php | 22 + .../Exception/InvalidArgumentException.php | 20 + .../Exception/LogicException.php | 18 + .../ParameterCircularReferenceException.php | 30 + .../Exception/RuntimeException.php | 20 + .../ServiceCircularReferenceException.php | 36 + .../Exception/ServiceNotFoundException.php | 58 + .../EnvPlaceholderParameterBag.php | 108 + .../ParameterBag/FrozenParameterBag.php | 62 + .../ParameterBag/ParameterBag.php | 263 + .../ParameterBag/ParameterBagInterface.php | 103 + .../ResettableContainerInterface.php | 30 + .../deprecation-contracts/function.php | 27 + .../plugins/wordpress-seo/wp-seo-main.php | 597 ++ wp-content/plugins/wordpress-seo/wp-seo.php | 50 + .../plugins/wordpress-seo/wpml-config.xml | 44 + 1319 files changed, 153656 insertions(+) create mode 100644 wp-content/plugins/wordpress-seo/admin/admin-settings-changed-listener.php create mode 100644 wp-content/plugins/wordpress-seo/admin/ajax.php create mode 100644 wp-content/plugins/wordpress-seo/admin/ajax/class-shortcode-filter.php create mode 100644 wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-dismissable-notice.php create mode 100644 wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-plugin-conflict-ajax.php create mode 100644 wp-content/plugins/wordpress-seo/admin/capabilities/class-abstract-capability-manager.php create mode 100644 wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager-factory.php create mode 100644 wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager-integration.php create mode 100644 wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager-vip.php create mode 100644 wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager-wp.php create mode 100644 wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager.php create mode 100644 wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-utils.php create mode 100644 wp-content/plugins/wordpress-seo/admin/capabilities/class-register-capabilities.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-admin-asset-analysis-worker-location.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-admin-asset-dev-server-location.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-admin-asset-location.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-admin-asset-manager.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-admin-asset-seo-location.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-admin-editor-specific-replace-vars.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-admin-gutenberg-compatibility-notification.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-admin-help-panel.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-admin-init.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-admin-recommended-replace-vars.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-admin-user-profile.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-admin-utils.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-admin.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-asset.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-bulk-description-editor-list-table.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-bulk-editor-list-table.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-bulk-title-editor-list-table.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-collector.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-config.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-database-proxy.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-export.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-expose-shortlinks.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-gutenberg-compatibility.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-meta-columns.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-my-yoast-proxy.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-option-tab.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-option-tabs-formatter.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-option-tabs.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-paper-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-plugin-availability.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-plugin-conflict.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-premium-popup.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-premium-upsell-admin-block.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-primary-term-admin.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-product-upsell-notice.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-remote-request.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-schema-person-upgrade-notification.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-suggested-plugins.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-wincher-dashboard-widget.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-yoast-columns.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-yoast-dashboard-widget.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-yoast-form.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-yoast-input-validation.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-yoast-network-admin.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-yoast-network-settings-api.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-yoast-notification-center.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-yoast-notification.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-yoast-notifications.php create mode 100644 wp-content/plugins/wordpress-seo/admin/class-yoast-plugin-conflict.php create mode 100644 wp-content/plugins/wordpress-seo/admin/endpoints/class-endpoint-file-size.php create mode 100644 wp-content/plugins/wordpress-seo/admin/endpoints/class-endpoint-statistics.php create mode 100644 wp-content/plugins/wordpress-seo/admin/endpoints/class-endpoint.php create mode 100644 wp-content/plugins/wordpress-seo/admin/exceptions/class-file-size-exception.php create mode 100644 wp-content/plugins/wordpress-seo/admin/filters/class-abstract-post-filter.php create mode 100644 wp-content/plugins/wordpress-seo/admin/filters/class-cornerstone-filter.php create mode 100644 wp-content/plugins/wordpress-seo/admin/formatter/class-metabox-formatter.php create mode 100644 wp-content/plugins/wordpress-seo/admin/formatter/class-post-metabox-formatter.php create mode 100644 wp-content/plugins/wordpress-seo/admin/formatter/class-term-metabox-formatter.php create mode 100644 wp-content/plugins/wordpress-seo/admin/formatter/interface-metabox-formatter.php create mode 100644 wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc.php create mode 100644 wp-content/plugins/wordpress-seo/admin/google_search_console/views/gsc-display.php create mode 100644 wp-content/plugins/wordpress-seo/admin/google_search_console/views/gsc-redirect-nopremium.php create mode 100644 wp-content/plugins/wordpress-seo/admin/import/class-import-detector.php create mode 100644 wp-content/plugins/wordpress-seo/admin/import/class-import-plugin.php create mode 100644 wp-content/plugins/wordpress-seo/admin/import/class-import-settings.php create mode 100644 wp-content/plugins/wordpress-seo/admin/import/class-import-status.php create mode 100644 wp-content/plugins/wordpress-seo/admin/import/plugins/class-abstract-plugin-importer.php create mode 100644 wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-aioseo-v4.php create mode 100644 wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-aioseo.php create mode 100644 wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-greg-high-performance-seo.php create mode 100644 wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-headspace.php create mode 100644 wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-jetpack.php create mode 100644 wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-platinum-seo-pack.php create mode 100644 wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-premium-seo-pack.php create mode 100644 wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-rankmath.php create mode 100644 wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-seo-framework.php create mode 100644 wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-seopressor.php create mode 100644 wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-smartcrawl.php create mode 100644 wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-squirrly.php create mode 100644 wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-ultimate-seo.php create mode 100644 wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-woothemes-seo.php create mode 100644 wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-wp-meta-seo.php create mode 100644 wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-wpseo.php create mode 100644 wp-content/plugins/wordpress-seo/admin/import/plugins/class-importers.php create mode 100644 wp-content/plugins/wordpress-seo/admin/index.php create mode 100644 wp-content/plugins/wordpress-seo/admin/interface-collection.php create mode 100644 wp-content/plugins/wordpress-seo/admin/interface-installable.php create mode 100644 wp-content/plugins/wordpress-seo/admin/listeners/class-listener.php create mode 100644 wp-content/plugins/wordpress-seo/admin/menu/class-admin-menu.php create mode 100644 wp-content/plugins/wordpress-seo/admin/menu/class-base-menu.php create mode 100644 wp-content/plugins/wordpress-seo/admin/menu/class-menu.php create mode 100644 wp-content/plugins/wordpress-seo/admin/menu/class-network-admin-menu.php create mode 100644 wp-content/plugins/wordpress-seo/admin/menu/class-replacevar-editor.php create mode 100644 wp-content/plugins/wordpress-seo/admin/menu/class-replacevar-field.php create mode 100644 wp-content/plugins/wordpress-seo/admin/menu/class-submenu-capability-normalize.php create mode 100644 wp-content/plugins/wordpress-seo/admin/metabox/class-abstract-sectioned-metabox-tab.php create mode 100644 wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-inclusive-language.php create mode 100644 wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-readability.php create mode 100644 wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-seo.php create mode 100644 wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-collapsible.php create mode 100644 wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-collapsibles-section.php create mode 100644 wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-editor.php create mode 100644 wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-form-tab.php create mode 100644 wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-null-tab.php create mode 100644 wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-section-additional.php create mode 100644 wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-section-inclusive-language.php create mode 100644 wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-section-react.php create mode 100644 wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-section-readability.php create mode 100644 wp-content/plugins/wordpress-seo/admin/metabox/class-metabox.php create mode 100644 wp-content/plugins/wordpress-seo/admin/metabox/interface-metabox-analysis.php create mode 100644 wp-content/plugins/wordpress-seo/admin/metabox/interface-metabox-section.php create mode 100644 wp-content/plugins/wordpress-seo/admin/metabox/interface-metabox-tab.php create mode 100644 wp-content/plugins/wordpress-seo/admin/notifiers/dismissible-notification.php create mode 100644 wp-content/plugins/wordpress-seo/admin/notifiers/interface-notification-handler.php create mode 100644 wp-content/plugins/wordpress-seo/admin/pages/dashboard.php create mode 100644 wp-content/plugins/wordpress-seo/admin/pages/licenses.php create mode 100644 wp-content/plugins/wordpress-seo/admin/pages/network.php create mode 100644 wp-content/plugins/wordpress-seo/admin/pages/redirects.php create mode 100644 wp-content/plugins/wordpress-seo/admin/pages/tools.php create mode 100644 wp-content/plugins/wordpress-seo/admin/roles/class-abstract-role-manager.php create mode 100644 wp-content/plugins/wordpress-seo/admin/roles/class-register-roles.php create mode 100644 wp-content/plugins/wordpress-seo/admin/roles/class-role-manager-factory.php create mode 100644 wp-content/plugins/wordpress-seo/admin/roles/class-role-manager-wp.php create mode 100644 wp-content/plugins/wordpress-seo/admin/roles/class-role-manager.php create mode 100644 wp-content/plugins/wordpress-seo/admin/services/class-file-size.php create mode 100644 wp-content/plugins/wordpress-seo/admin/statistics/class-statistics-integration.php create mode 100644 wp-content/plugins/wordpress-seo/admin/statistics/class-statistics-service.php create mode 100644 wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-columns.php create mode 100644 wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-fields-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-fields.php create mode 100644 wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-metabox.php create mode 100644 wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy.php create mode 100644 wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-addon-data.php create mode 100644 wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-default-data.php create mode 100644 wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-plugin-data.php create mode 100644 wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-server-data.php create mode 100644 wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-settings-data.php create mode 100644 wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-theme-data.php create mode 100644 wp-content/plugins/wordpress-seo/admin/tracking/class-tracking.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/class-yoast-feature-toggle.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/class-yoast-feature-toggles.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/class-yoast-input-select.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/class-yoast-integration-toggles.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/form/select.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/interface-yoast-form-element.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/js-templates-primary-term.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/licenses.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/paper-collapsible.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/partial-notifications-errors.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/partial-notifications-template.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/partial-notifications-warnings.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/redirects.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/dashboard.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/first-time-configuration.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/site-analysis.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/tabs/network/crawl-settings.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/tabs/network/features.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/tabs/network/general.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/tabs/network/integrations.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/tabs/network/restore-site.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/tabs/tool/import-seo.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/tabs/tool/wpseo-export.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/tabs/tool/wpseo-import.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/tool-bulk-editor.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/tool-file-editor.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/tool-import-export.php create mode 100644 wp-content/plugins/wordpress-seo/admin/views/user-profile.php create mode 100644 wp-content/plugins/wordpress-seo/admin/watchers/class-slug-change-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/blocks/dynamic-blocks/breadcrumbs/block.json create mode 100644 wp-content/plugins/wordpress-seo/blocks/structured-data-blocks/faq/block.json create mode 100644 wp-content/plugins/wordpress-seo/blocks/structured-data-blocks/how-to/block.json create mode 100644 wp-content/plugins/wordpress-seo/css/dist/academy-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/academy-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/admin-global-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/admin-global-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/adminbar-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/adminbar-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/ai-fix-assessments-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/ai-fix-assessments-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/ai-generator-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/ai-generator-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/alerts-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/alerts-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/black-friday-banner-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/black-friday-banner-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/dashboard-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/dashboard-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/edit-page-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/edit-page-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/elementor-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/elementor-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/featured-image-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/featured-image-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/filter-explanation-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/filter-explanation-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/first-time-configuration-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/first-time-configuration-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/icons-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/icons-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/inside-editor-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/inside-editor-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/introductions-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/introductions-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/metabox-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/metabox-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/metabox-primary-category-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/metabox-primary-category-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/modal-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/modal-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/monorepo-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/monorepo-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/new-settings-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/new-settings-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/notifications-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/notifications-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/score_icon-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/score_icon-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/structured-data-blocks-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/structured-data-blocks-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/support-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/support-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/tailwind-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/tailwind-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/toggle-switch-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/toggle-switch-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/tooltips-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/tooltips-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/workouts-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/workouts-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/wpseo-dismissible-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/wpseo-dismissible-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/yoast-extensions-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/yoast-extensions-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/yst_plugin_tools-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/yst_plugin_tools-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/yst_seo_score-2330-rtl.css create mode 100644 wp-content/plugins/wordpress-seo/css/dist/yst_seo_score-2330.css create mode 100644 wp-content/plugins/wordpress-seo/css/main-sitemap.xsl create mode 100644 wp-content/plugins/wordpress-seo/images/Yoast_SEO_negative_icon.svg create mode 100644 wp-content/plugins/wordpress-seo/images/academy/ai_for_seo_icon_my_yoast.png create mode 100644 wp-content/plugins/wordpress-seo/images/academy/all_around_seo.png create mode 100644 wp-content/plugins/wordpress-seo/images/academy/block_editor.png create mode 100644 wp-content/plugins/wordpress-seo/images/academy/copywriting.png create mode 100644 wp-content/plugins/wordpress-seo/images/academy/crawlability.png create mode 100644 wp-content/plugins/wordpress-seo/images/academy/ecommerce.png create mode 100644 wp-content/plugins/wordpress-seo/images/academy/hosting_and_server.png create mode 100644 wp-content/plugins/wordpress-seo/images/academy/keyword_research.png create mode 100644 wp-content/plugins/wordpress-seo/images/academy/local.png create mode 100644 wp-content/plugins/wordpress-seo/images/academy/multilingual.png create mode 100644 wp-content/plugins/wordpress-seo/images/academy/seo_for_beginners.png create mode 100644 wp-content/plugins/wordpress-seo/images/academy/seo_for_wp.png create mode 100644 wp-content/plugins/wordpress-seo/images/academy/site_structure.png create mode 100644 wp-content/plugins/wordpress-seo/images/academy/structured_data_for_beginners.png create mode 100644 wp-content/plugins/wordpress-seo/images/academy/understanding_structured_data.png create mode 100644 wp-content/plugins/wordpress-seo/images/academy/wp_for_beginners.png create mode 100644 wp-content/plugins/wordpress-seo/images/acf-logo.png create mode 100644 wp-content/plugins/wordpress-seo/images/admin_bar.png create mode 100644 wp-content/plugins/wordpress-seo/images/ai-fix-assessments-thumbnail.png create mode 100644 wp-content/plugins/wordpress-seo/images/ai-generator-preview.png create mode 100644 wp-content/plugins/wordpress-seo/images/ai-generator.png create mode 100644 wp-content/plugins/wordpress-seo/images/alert-error-icon.svg create mode 100644 wp-content/plugins/wordpress-seo/images/alert-info-icon.svg create mode 100644 wp-content/plugins/wordpress-seo/images/alert-success-icon.svg create mode 100644 wp-content/plugins/wordpress-seo/images/alert-warning-icon.svg create mode 100644 wp-content/plugins/wordpress-seo/images/cornerstone_content.png create mode 100644 wp-content/plugins/wordpress-seo/images/error-icon.svg create mode 100644 wp-content/plugins/wordpress-seo/images/inclusive_language_analysis.png create mode 100644 wp-content/plugins/wordpress-seo/images/index.php create mode 100644 wp-content/plugins/wordpress-seo/images/indexables_3_left_bubble_optm.svg create mode 100644 wp-content/plugins/wordpress-seo/images/indexnow.png create mode 100644 wp-content/plugins/wordpress-seo/images/insights.png create mode 100644 wp-content/plugins/wordpress-seo/images/link-in-icon.svg create mode 100644 wp-content/plugins/wordpress-seo/images/link-out-icon.svg create mode 100644 wp-content/plugins/wordpress-seo/images/link_suggestions.png create mode 100644 wp-content/plugins/wordpress-seo/images/local_plugin_assistant.svg create mode 100644 wp-content/plugins/wordpress-seo/images/mirrored_fit_bubble_man_1_optim.svg create mode 100644 wp-content/plugins/wordpress-seo/images/mirrored_fit_bubble_woman_1_optim.svg create mode 100644 wp-content/plugins/wordpress-seo/images/mirrored_fit_bubble_woman_2_optim.svg create mode 100644 wp-content/plugins/wordpress-seo/images/new-to-configuration-notice.svg create mode 100644 wp-content/plugins/wordpress-seo/images/news_plugin_assistant.svg create mode 100644 wp-content/plugins/wordpress-seo/images/open_graph.png create mode 100644 wp-content/plugins/wordpress-seo/images/plugin_subscription.svg create mode 100644 wp-content/plugins/wordpress-seo/images/question-mark.png create mode 100644 wp-content/plugins/wordpress-seo/images/readability-icon.svg create mode 100644 wp-content/plugins/wordpress-seo/images/readability_analysis.png create mode 100644 wp-content/plugins/wordpress-seo/images/rest_api.png create mode 100644 wp-content/plugins/wordpress-seo/images/seo_analysis.png create mode 100644 wp-content/plugins/wordpress-seo/images/slack_sharing.png create mode 100644 wp-content/plugins/wordpress-seo/images/stale-cornerstone-content-in-yoast-seo.png create mode 100644 wp-content/plugins/wordpress-seo/images/succes_marieke_bubble_optm.svg create mode 100644 wp-content/plugins/wordpress-seo/images/support-team.svg create mode 100644 wp-content/plugins/wordpress-seo/images/support/github.png create mode 100644 wp-content/plugins/wordpress-seo/images/support/help_center.png create mode 100644 wp-content/plugins/wordpress-seo/images/support/support_forums.png create mode 100644 wp-content/plugins/wordpress-seo/images/text_link_counter.png create mode 100644 wp-content/plugins/wordpress-seo/images/twitter_card.png create mode 100644 wp-content/plugins/wordpress-seo/images/video_plugin_assistant.svg create mode 100644 wp-content/plugins/wordpress-seo/images/woo_plugin_assistant.svg create mode 100644 wp-content/plugins/wordpress-seo/images/xml_sitemaps.png create mode 100644 wp-content/plugins/wordpress-seo/inc/class-addon-manager.php create mode 100644 wp-content/plugins/wordpress-seo/inc/class-my-yoast-api-request.php create mode 100644 wp-content/plugins/wordpress-seo/inc/class-post-type.php create mode 100644 wp-content/plugins/wordpress-seo/inc/class-rewrite.php create mode 100644 wp-content/plugins/wordpress-seo/inc/class-upgrade-history.php create mode 100644 wp-content/plugins/wordpress-seo/inc/class-upgrade.php create mode 100644 wp-content/plugins/wordpress-seo/inc/class-wpseo-admin-bar-menu.php create mode 100644 wp-content/plugins/wordpress-seo/inc/class-wpseo-content-images.php create mode 100644 wp-content/plugins/wordpress-seo/inc/class-wpseo-custom-fields.php create mode 100644 wp-content/plugins/wordpress-seo/inc/class-wpseo-custom-taxonomies.php create mode 100644 wp-content/plugins/wordpress-seo/inc/class-wpseo-image-utils.php create mode 100644 wp-content/plugins/wordpress-seo/inc/class-wpseo-installation.php create mode 100644 wp-content/plugins/wordpress-seo/inc/class-wpseo-meta.php create mode 100644 wp-content/plugins/wordpress-seo/inc/class-wpseo-primary-term.php create mode 100644 wp-content/plugins/wordpress-seo/inc/class-wpseo-rank.php create mode 100644 wp-content/plugins/wordpress-seo/inc/class-wpseo-replace-vars.php create mode 100644 wp-content/plugins/wordpress-seo/inc/class-wpseo-replacement-variable.php create mode 100644 wp-content/plugins/wordpress-seo/inc/class-wpseo-shortlinker.php create mode 100644 wp-content/plugins/wordpress-seo/inc/class-wpseo-statistics.php create mode 100644 wp-content/plugins/wordpress-seo/inc/class-wpseo-utils.php create mode 100644 wp-content/plugins/wordpress-seo/inc/class-yoast-dynamic-rewrites.php create mode 100644 wp-content/plugins/wordpress-seo/inc/date-helper.php create mode 100644 wp-content/plugins/wordpress-seo/inc/exceptions/class-myyoast-bad-request-exception.php create mode 100644 wp-content/plugins/wordpress-seo/inc/exceptions/class-myyoast-invalid-json-exception.php create mode 100644 wp-content/plugins/wordpress-seo/inc/index.php create mode 100644 wp-content/plugins/wordpress-seo/inc/interface-wpseo-wordpress-ajax-integration.php create mode 100644 wp-content/plugins/wordpress-seo/inc/interface-wpseo-wordpress-integration.php create mode 100644 wp-content/plugins/wordpress-seo/inc/language-utils.php create mode 100644 wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-ms.php create mode 100644 wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-social.php create mode 100644 wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-titles.php create mode 100644 wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-wpseo.php create mode 100644 wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option.php create mode 100644 wp-content/plugins/wordpress-seo/inc/options/class-wpseo-options.php create mode 100644 wp-content/plugins/wordpress-seo/inc/options/class-wpseo-taxonomy-meta.php create mode 100644 wp-content/plugins/wordpress-seo/inc/sitemaps/class-author-sitemap-provider.php create mode 100644 wp-content/plugins/wordpress-seo/inc/sitemaps/class-post-type-sitemap-provider.php create mode 100644 wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-cache-data.php create mode 100644 wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-image-parser.php create mode 100644 wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-admin.php create mode 100644 wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-cache-validator.php create mode 100644 wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-cache.php create mode 100644 wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-renderer.php create mode 100644 wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-router.php create mode 100644 wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps.php create mode 100644 wp-content/plugins/wordpress-seo/inc/sitemaps/class-taxonomy-sitemap-provider.php create mode 100644 wp-content/plugins/wordpress-seo/inc/sitemaps/interface-sitemap-cache-data.php create mode 100644 wp-content/plugins/wordpress-seo/inc/sitemaps/interface-sitemap-provider.php create mode 100644 wp-content/plugins/wordpress-seo/inc/wpseo-functions-deprecated.php create mode 100644 wp-content/plugins/wordpress-seo/inc/wpseo-functions.php create mode 100644 wp-content/plugins/wordpress-seo/inc/wpseo-non-ajax-functions.php create mode 100644 wp-content/plugins/wordpress-seo/index.php create mode 100644 wp-content/plugins/wordpress-seo/js/dist/academy.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/addon-installation.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/admin-global.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/admin-modules.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/analysis-worker.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/api-client.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/block-editor.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/bulk-editor.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/classic-editor.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/crawl-settings.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/dashboard-widget.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/dynamic-blocks.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/edit-page.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/editor-modules.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/elementor.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/externals-components.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/externals-contexts.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/externals-redux.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/externals/analysis.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/externals/analysisReport.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/externals/chart.js.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/externals/componentsNew.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/externals/draftJs.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/externals/featureFlag.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/externals/helpers.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/externals/jed.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/externals/propTypes.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/externals/reactHelmet.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/externals/redux.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/externals/reduxJsToolkit.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/externals/replacementVariableEditor.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/externals/searchMetadataPreviews.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/externals/socialMetadataForms.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/externals/styleGuide.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/externals/styledComponents.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/externals/uiLibrary.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/faq-block.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/filter-explanation.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/first-time-configuration.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/frontend-inspector-resources.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/help-scout-beacon.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/how-to-block.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/import.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/indexation.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/installation-success.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/integrations-page.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/introductions.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/languages/ar.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/languages/ca.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/languages/cs.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/languages/de.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/languages/default.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/languages/el.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/languages/en.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/languages/es.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/languages/fa.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/languages/fr.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/languages/he.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/languages/hu.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/languages/id.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/languages/it.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/languages/ja.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/languages/nb.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/languages/nl.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/languages/pl.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/languages/pt.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/languages/ru.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/languages/sk.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/languages/sv.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/languages/tr.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/network-admin.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/new-settings.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/post-edit.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/quick-edit-handler.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/react-select.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/redirect-old-features-tab.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/reindex-links.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/settings.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/support.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/term-edit.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/used-keywords-assessment.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/wincher-dashboard-widget.js create mode 100644 wp-content/plugins/wordpress-seo/js/dist/workouts.js create mode 100644 wp-content/plugins/wordpress-seo/lib/abstract-main.php create mode 100644 wp-content/plugins/wordpress-seo/lib/dependency-injection/container-registry.php create mode 100644 wp-content/plugins/wordpress-seo/lib/migrations/adapter.php create mode 100644 wp-content/plugins/wordpress-seo/lib/migrations/column.php create mode 100644 wp-content/plugins/wordpress-seo/lib/migrations/constants.php create mode 100644 wp-content/plugins/wordpress-seo/lib/migrations/migration.php create mode 100644 wp-content/plugins/wordpress-seo/lib/migrations/table.php create mode 100644 wp-content/plugins/wordpress-seo/lib/model.php create mode 100644 wp-content/plugins/wordpress-seo/lib/orm.php create mode 100644 wp-content/plugins/wordpress-seo/license.txt create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/Yoast_SEO_Icon.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/Yoast_icon_kader.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/algolia-logo.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/connection-assistant.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/edd-logo.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/elementor-logo.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/g2_logo_white_optm.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/icon-arrow-down.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/icon-facebook.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/icon-twitter.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/indexables_1_left_bubble_optm.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/indexables_2_left_bubble_optm.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/jetpack-boost-integration-logo.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/jetpack-boost-logo.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/jetpack-logo.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/logo-g2-white.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/mastodon-logo.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/motivated_bubble_woman_1_optim.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/semrush-logo.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/ssp-logo.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/star-rating-half.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/star-rating-star.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/succes_marieke_bubble_optm.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/tec-logo.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/wincher-logo.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/woocommerce-seo-logo.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/wordproof-logo.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/wp-recipe-maker-logo.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/x-logo.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/yoast-seo-simple-logo.svg create mode 100644 wp-content/plugins/wordpress-seo/packages/js/images/yoast_loading_spinner.svg create mode 100644 wp-content/plugins/wordpress-seo/readme.txt create mode 100644 wp-content/plugins/wordpress-seo/src/actions/addon-installation/addon-activate-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/addon-installation/addon-install-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/alert-dismissal-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/configuration/first-time-configuration-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/importing/abstract-aioseo-importing-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/importing/aioseo/abstract-aioseo-settings-importing-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/importing/aioseo/aioseo-cleanup-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/importing/aioseo/aioseo-custom-archive-settings-importing-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/importing/aioseo/aioseo-default-archive-settings-importing-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/importing/aioseo/aioseo-general-settings-importing-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/importing/aioseo/aioseo-posts-importing-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/importing/aioseo/aioseo-posttype-defaults-settings-importing-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/importing/aioseo/aioseo-taxonomy-settings-importing-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/importing/aioseo/aioseo-validate-data-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/importing/deactivate-conflicting-plugins-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/importing/importing-action-interface.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/importing/importing-indexation-action-interface.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/indexables/indexable-head-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/indexing/abstract-indexing-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/indexing/abstract-link-indexing-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/indexing/indexable-general-indexation-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/indexing/indexable-indexing-complete-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/indexing/indexable-post-indexation-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/indexing/indexable-post-type-archive-indexation-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/indexing/indexable-term-indexation-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/indexing/indexation-action-interface.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/indexing/indexing-complete-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/indexing/indexing-prepare-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/indexing/limited-indexing-action-interface.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/indexing/post-link-indexing-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/indexing/term-link-indexing-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/integrations-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/semrush/semrush-login-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/semrush/semrush-options-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/semrush/semrush-phrases-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/wincher/wincher-account-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/wincher/wincher-keyphrases-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/actions/wincher/wincher-login-action.php create mode 100644 wp-content/plugins/wordpress-seo/src/analytics/application/missing-indexables-collector.php create mode 100644 wp-content/plugins/wordpress-seo/src/analytics/application/to-be-cleaned-indexables-collector.php create mode 100644 wp-content/plugins/wordpress-seo/src/analytics/domain/missing-indexable-bucket.php create mode 100644 wp-content/plugins/wordpress-seo/src/analytics/domain/missing-indexable-count.php create mode 100644 wp-content/plugins/wordpress-seo/src/analytics/domain/to-be-cleaned-indexable-bucket.php create mode 100644 wp-content/plugins/wordpress-seo/src/analytics/domain/to-be-cleaned-indexable-count.php create mode 100644 wp-content/plugins/wordpress-seo/src/analytics/user-interface/last-completed-indexation-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/builders/indexable-author-builder.php create mode 100644 wp-content/plugins/wordpress-seo/src/builders/indexable-builder.php create mode 100644 wp-content/plugins/wordpress-seo/src/builders/indexable-date-archive-builder.php create mode 100644 wp-content/plugins/wordpress-seo/src/builders/indexable-hierarchy-builder.php create mode 100644 wp-content/plugins/wordpress-seo/src/builders/indexable-home-page-builder.php create mode 100644 wp-content/plugins/wordpress-seo/src/builders/indexable-link-builder.php create mode 100644 wp-content/plugins/wordpress-seo/src/builders/indexable-post-builder.php create mode 100644 wp-content/plugins/wordpress-seo/src/builders/indexable-post-type-archive-builder.php create mode 100644 wp-content/plugins/wordpress-seo/src/builders/indexable-social-image-trait.php create mode 100644 wp-content/plugins/wordpress-seo/src/builders/indexable-system-page-builder.php create mode 100644 wp-content/plugins/wordpress-seo/src/builders/indexable-term-builder.php create mode 100644 wp-content/plugins/wordpress-seo/src/builders/primary-term-builder.php create mode 100644 wp-content/plugins/wordpress-seo/src/commands/cleanup-command.php create mode 100644 wp-content/plugins/wordpress-seo/src/commands/command-interface.php create mode 100644 wp-content/plugins/wordpress-seo/src/commands/index-command.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/addon-installation-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/admin-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/admin/doing-post-quick-edit-save-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/admin/estimated-reading-time-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/admin/licenses-page-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/admin/non-network-admin-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/admin/post-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/admin/posts-overview-or-ajax-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/admin/yoast-admin-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/attachment-redirections-enabled-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/conditional-interface.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/deactivating-yoast-seo-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/development-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/feature-flag-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/front-end-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/get-request-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/headless-rest-endpoints-enabled-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/import-tool-selected-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/jetpack-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/migrations-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/new-settings-ui-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/news-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/no-conditionals-trait.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/no-tool-selected-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/non-multisite-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/not-admin-ajax-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/open-graph-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/premium-active-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/premium-inactive-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/primary-category-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/robots-txt-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/semrush-enabled-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/settings-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/should-index-links-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/text-formality-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/third-party/elementor-activated-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/third-party/elementor-edit-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/third-party/jetpack-boost-active-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/third-party/jetpack-boost-not-premium-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/third-party/polylang-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/third-party/translatepress-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/third-party/w3-total-cache-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/third-party/wpml-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/third-party/wpml-wpseo-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/traits/admin-conditional-trait.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/updated-importer-framework-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/user-can-edit-users-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/user-can-manage-wpseo-options-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/user-can-publish-posts-and-pages-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/user-edit-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/user-profile-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/web-stories-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/wincher-automatically-track-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/wincher-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/wincher-enabled-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/wincher-token-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/woocommerce-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/wp-cron-enabled-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/wp-robots-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/xmlrpc-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/yoast-admin-and-dashboard-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/conditionals/yoast-tools-page-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/badge-group-names.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/conflicting-plugins.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/indexing-reasons.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migration-status.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migrations/20171228151840_WpYoastIndexable.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migrations/20171228151841_WpYoastPrimaryTerm.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migrations/20190529075038_WpYoastDropIndexableMetaTableIfExists.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migrations/20191011111109_WpYoastIndexableHierarchy.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migrations/20200408101900_AddCollationToTables.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migrations/20200420073606_AddColumnsToIndexables.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migrations/20200428123747_BreadcrumbTitleAndHierarchyReset.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migrations/20200428194858_ExpandIndexableColumnLengths.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migrations/20200429105310_TruncateIndexableTables.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migrations/20200430075614_AddIndexableObjectIdAndTypeIndex.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migrations/20200430150130_ClearIndexableTables.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migrations/20200507054848_DeleteDuplicateIndexables.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migrations/20200513133401_ResetIndexableHierarchyTable.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migrations/20200609154515_AddHasAncestorsColumn.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migrations/20200616130143_ReplacePermalinkHashIndex.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migrations/20200617122511_CreateSEOLinksTable.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migrations/20200702141921_CreateIndexableSubpagesIndex.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migrations/20200728095334_AddIndexesForProminentWordsOnIndexables.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migrations/20201202144329_AddEstimatedReadingTime.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migrations/20201216124002_ExpandIndexableIDColumnLengths.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migrations/20201216141134_ExpandPrimaryTermIDColumnLengths.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migrations/20210817092415_AddVersionColumnToIndexables.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migrations/20211020091404_AddObjectTimestamps.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/migrations/20230417083836_AddInclusiveLanguageScore.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/oauth-client.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/researcher-languages.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/schema-ids.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/schema-types.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/semrush-client.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/wincher-client.php create mode 100644 wp-content/plugins/wordpress-seo/src/config/wincher-pkce-provider.php create mode 100644 wp-content/plugins/wordpress-seo/src/content-type-visibility/application/content-type-visibility-dismiss-notifications.php create mode 100644 wp-content/plugins/wordpress-seo/src/content-type-visibility/application/content-type-visibility-watcher-actions.php create mode 100644 wp-content/plugins/wordpress-seo/src/content-type-visibility/user-interface/content-type-visibility-dismiss-new-route.php create mode 100644 wp-content/plugins/wordpress-seo/src/context/meta-tags-context.php create mode 100644 wp-content/plugins/wordpress-seo/src/deprecated/admin/class-customizer.php create mode 100644 wp-content/plugins/wordpress-seo/src/deprecated/frontend/breadcrumbs.php create mode 100644 wp-content/plugins/wordpress-seo/src/deprecated/frontend/frontend.php create mode 100644 wp-content/plugins/wordpress-seo/src/deprecated/index.php create mode 100644 wp-content/plugins/wordpress-seo/src/deprecated/src/conditionals/third-party/wordproof-integration-active-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/deprecated/src/conditionals/third-party/wordproof-plugin-inactive-conditional.php create mode 100644 wp-content/plugins/wordpress-seo/src/deprecated/src/config/wordproof-app-config.php create mode 100644 wp-content/plugins/wordpress-seo/src/deprecated/src/config/wordproof-translations.php create mode 100644 wp-content/plugins/wordpress-seo/src/deprecated/src/helpers/wordproof-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/deprecated/src/integrations/admin/old-premium-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/deprecated/src/integrations/third-party/wincher.php create mode 100644 wp-content/plugins/wordpress-seo/src/deprecated/src/integrations/third-party/wordproof-integration-toggle.php create mode 100644 wp-content/plugins/wordpress-seo/src/deprecated/src/integrations/third-party/wordproof.php create mode 100644 wp-content/plugins/wordpress-seo/src/deprecated/src/introductions/application/ai-generate-titles-and-descriptions-introduction-upsell.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/application/analysis-features/enabled-analysis-features-repository.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/application/integrations/integration-information-repository.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/application/seo/post-seo-information-repository.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/application/seo/term-seo-information-repository.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/application/site/website-information-repository.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/domain/analysis-features/analysis-feature-interface.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/domain/analysis-features/analysis-feature.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/domain/analysis-features/analysis-features-list.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/domain/integrations/integration-data-provider-interface.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/domain/seo/description.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/domain/seo/keyphrase.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/domain/seo/seo-plugin-data-interface.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/domain/seo/social.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/domain/seo/title.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/cornerstone-content.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/inclusive-language-analysis.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/integrations/jetpack-markdown.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/integrations/multilingual.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/integrations/semrush.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/integrations/wincher.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/keyphrase-analysis.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/previously-used-keyphrase.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/readability-analysis.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/seo/description-data-provider-interface.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/seo/keyphrase-interface.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/seo/posts/abstract-post-seo-data-provider.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/seo/posts/description-data-provider.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/seo/posts/keyphrase-data-provider.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/seo/posts/social-data-provider.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/seo/posts/title-data-provider.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/seo/social-data-provider-interface.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/seo/terms/abstract-term-seo-data-provider.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/seo/terms/description-data-provider.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/seo/terms/keyphrase-data-provider.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/seo/terms/social-data-provider.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/seo/terms/title-data-provider.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/seo/title-data-provider-interface.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/site/base-site-information.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/site/post-site-information.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/site/term-site-information.php create mode 100644 wp-content/plugins/wordpress-seo/src/editors/framework/word-form-recognition.php create mode 100644 wp-content/plugins/wordpress-seo/src/exceptions/addon-installation/addon-activation-error-exception.php create mode 100644 wp-content/plugins/wordpress-seo/src/exceptions/addon-installation/addon-already-installed-exception.php create mode 100644 wp-content/plugins/wordpress-seo/src/exceptions/addon-installation/addon-installation-error-exception.php create mode 100644 wp-content/plugins/wordpress-seo/src/exceptions/addon-installation/user-cannot-activate-plugins-exception.php create mode 100644 wp-content/plugins/wordpress-seo/src/exceptions/addon-installation/user-cannot-install-plugins-exception.php create mode 100644 wp-content/plugins/wordpress-seo/src/exceptions/forbidden-property-mutation-exception.php create mode 100644 wp-content/plugins/wordpress-seo/src/exceptions/importing/aioseo-validation-exception.php create mode 100644 wp-content/plugins/wordpress-seo/src/exceptions/indexable/author-not-built-exception.php create mode 100644 wp-content/plugins/wordpress-seo/src/exceptions/indexable/indexable-exception.php create mode 100644 wp-content/plugins/wordpress-seo/src/exceptions/indexable/invalid-term-exception.php create mode 100644 wp-content/plugins/wordpress-seo/src/exceptions/indexable/not-built-exception.php create mode 100644 wp-content/plugins/wordpress-seo/src/exceptions/indexable/post-not-built-exception.php create mode 100644 wp-content/plugins/wordpress-seo/src/exceptions/indexable/post-not-found-exception.php create mode 100644 wp-content/plugins/wordpress-seo/src/exceptions/indexable/post-type-not-built-exception.php create mode 100644 wp-content/plugins/wordpress-seo/src/exceptions/indexable/source-exception.php create mode 100644 wp-content/plugins/wordpress-seo/src/exceptions/indexable/term-not-built-exception.php create mode 100644 wp-content/plugins/wordpress-seo/src/exceptions/indexable/term-not-found-exception.php create mode 100644 wp-content/plugins/wordpress-seo/src/exceptions/missing-method.php create mode 100644 wp-content/plugins/wordpress-seo/src/exceptions/oauth/authentication-failed-exception.php create mode 100644 wp-content/plugins/wordpress-seo/src/exceptions/oauth/tokens/empty-property-exception.php create mode 100644 wp-content/plugins/wordpress-seo/src/exceptions/oauth/tokens/empty-token-exception.php create mode 100644 wp-content/plugins/wordpress-seo/src/exceptions/oauth/tokens/failed-storage-exception.php create mode 100644 wp-content/plugins/wordpress-seo/src/functions.php create mode 100644 wp-content/plugins/wordpress-seo/src/generated/assets/externals.php create mode 100644 wp-content/plugins/wordpress-seo/src/generated/assets/languages.php create mode 100644 wp-content/plugins/wordpress-seo/src/generated/assets/plugin.php create mode 100644 wp-content/plugins/wordpress-seo/src/generated/container.php create mode 100644 wp-content/plugins/wordpress-seo/src/generators/breadcrumbs-generator.php create mode 100644 wp-content/plugins/wordpress-seo/src/generators/generator-interface.php create mode 100644 wp-content/plugins/wordpress-seo/src/generators/open-graph-image-generator.php create mode 100644 wp-content/plugins/wordpress-seo/src/generators/open-graph-locale-generator.php create mode 100644 wp-content/plugins/wordpress-seo/src/generators/schema-generator.php create mode 100644 wp-content/plugins/wordpress-seo/src/generators/schema/abstract-schema-piece.php create mode 100644 wp-content/plugins/wordpress-seo/src/generators/schema/article.php create mode 100644 wp-content/plugins/wordpress-seo/src/generators/schema/author.php create mode 100644 wp-content/plugins/wordpress-seo/src/generators/schema/breadcrumb.php create mode 100644 wp-content/plugins/wordpress-seo/src/generators/schema/faq.php create mode 100644 wp-content/plugins/wordpress-seo/src/generators/schema/howto.php create mode 100644 wp-content/plugins/wordpress-seo/src/generators/schema/main-image.php create mode 100644 wp-content/plugins/wordpress-seo/src/generators/schema/organization.php create mode 100644 wp-content/plugins/wordpress-seo/src/generators/schema/person.php create mode 100644 wp-content/plugins/wordpress-seo/src/generators/schema/webpage.php create mode 100644 wp-content/plugins/wordpress-seo/src/generators/schema/website.php create mode 100644 wp-content/plugins/wordpress-seo/src/generators/twitter-image-generator.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/aioseo-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/asset-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/attachment-cleanup-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/author-archive-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/blocks-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/capability-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/crawl-cleanup-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/curl-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/current-page-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/date-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/environment-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/first-time-configuration-notice-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/home-url-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/image-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/import-cursor-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/import-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/indexable-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/indexable-to-postmeta-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/indexing-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/language-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/meta-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/notification-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/open-graph/image-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/open-graph/values-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/options-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/pagination-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/permalink-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/post-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/post-type-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/primary-term-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/product-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/redirect-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/request-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/require-file-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/robots-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/robots-txt-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/sanitization-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/schema/article-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/schema/html-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/schema/id-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/schema/image-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/schema/language-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/schema/replace-vars-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/score-icon-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/short-link-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/site-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/social-profiles-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/string-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/taxonomy-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/twitter/image-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/url-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/user-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/wincher-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/woocommerce-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/wordpress-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/helpers/wpdb-helper.php create mode 100644 wp-content/plugins/wordpress-seo/src/initializers/crawl-cleanup-permalinks.php create mode 100644 wp-content/plugins/wordpress-seo/src/initializers/disable-core-sitemaps.php create mode 100644 wp-content/plugins/wordpress-seo/src/initializers/initializer-interface.php create mode 100644 wp-content/plugins/wordpress-seo/src/initializers/migration-runner.php create mode 100644 wp-content/plugins/wordpress-seo/src/initializers/woocommerce.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/abstract-exclude-post-type.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/academy-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/activation-cleanup-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/addon-installation/dialog-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/addon-installation/installation-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/admin-columns-cache-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/background-indexing-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/crawl-settings-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/cron-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/deactivated-premium-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/disable-concatenate-scripts-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/first-time-configuration-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/first-time-configuration-notice-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/fix-news-dependencies-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/health-check-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/helpscout-beacon.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/import-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/indexables-exclude-taxonomy-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/indexing-notification-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/indexing-tool-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/installation-success-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/integrations-page.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/link-count-columns-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/menu-badge-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/migration-error-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/old-configuration-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/redirect-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/redirects-page-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/unsupported-php-version-notice.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/admin/workouts-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/alerts/abstract-dismissable-alert.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/alerts/black-friday-product-editor-checklist-notification.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/alerts/black-friday-promotion-notification.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/alerts/black-friday-sidebar-checklist-notification.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/alerts/jetpack-boost-pre-publish.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/alerts/trustpilot-review-notification.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/alerts/webinar-promo-notification.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/blocks/abstract-dynamic-block-v3.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/blocks/abstract-dynamic-block.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/blocks/block-categories.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/blocks/breadcrumbs-block.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/blocks/structured-data-blocks.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/breadcrumbs-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/cleanup-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/duplicate-post-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/estimated-reading-time.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/exclude-attachment-post-type.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/exclude-oembed-cache-post-type.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/feature-flag-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/front-end-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/front-end/backwards-compatibility.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/front-end/category-term-description.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/front-end/comment-link-fixer.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/front-end/crawl-cleanup-basic.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/front-end/crawl-cleanup-rss.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/front-end/crawl-cleanup-searches.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/front-end/feed-improvements.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/front-end/force-rewrite-title.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/front-end/handle-404.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/front-end/indexing-controls.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/front-end/open-graph-oembed.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/front-end/redirects.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/front-end/robots-txt-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/front-end/rss-footer-embed.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/front-end/schema-accessibility-feature.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/front-end/wp-robots-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/integration-interface.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/primary-category.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/settings-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/support-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/third-party/amp.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/third-party/bbpress.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/third-party/elementor.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/third-party/exclude-elementor-post-types.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/third-party/exclude-woocommerce-post-types.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/third-party/jetpack.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/third-party/w3-total-cache.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/third-party/web-stories-post-edit.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/third-party/web-stories.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/third-party/wincher-publish.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/third-party/woocommerce-permalinks.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/third-party/woocommerce-post-edit.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/third-party/woocommerce.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/third-party/wpml-wpseo-notification.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/third-party/wpml.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/uninstall-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/addon-update-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/auto-update-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/indexable-ancestor-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/indexable-attachment-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/indexable-author-archive-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/indexable-author-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/indexable-category-permalink-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/indexable-date-archive-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/indexable-home-page-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/indexable-homeurl-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/indexable-permalink-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/indexable-post-meta-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/indexable-post-type-archive-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/indexable-post-type-change-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/indexable-post-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/indexable-static-home-page-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/indexable-system-page-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/indexable-taxonomy-change-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/indexable-term-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/option-titles-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/option-wpseo-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/primary-category-quick-edit-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/primary-term-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/search-engines-discouraged-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/watchers/woocommerce-beta-editor-watcher.php create mode 100644 wp-content/plugins/wordpress-seo/src/integrations/xmlrpc.php create mode 100644 wp-content/plugins/wordpress-seo/src/introductions/application/ai-fix-assessments-upsell.php create mode 100644 wp-content/plugins/wordpress-seo/src/introductions/application/current-page-trait.php create mode 100644 wp-content/plugins/wordpress-seo/src/introductions/application/introductions-collector.php create mode 100644 wp-content/plugins/wordpress-seo/src/introductions/application/user-allowed-trait.php create mode 100644 wp-content/plugins/wordpress-seo/src/introductions/application/version-trait.php create mode 100644 wp-content/plugins/wordpress-seo/src/introductions/domain/introduction-interface.php create mode 100644 wp-content/plugins/wordpress-seo/src/introductions/domain/introduction-item.php create mode 100644 wp-content/plugins/wordpress-seo/src/introductions/domain/introductions-bucket.php create mode 100644 wp-content/plugins/wordpress-seo/src/introductions/domain/invalid-user-id-exception.php create mode 100644 wp-content/plugins/wordpress-seo/src/introductions/infrastructure/introductions-seen-repository.php create mode 100644 wp-content/plugins/wordpress-seo/src/introductions/infrastructure/wistia-embed-permission-repository.php create mode 100644 wp-content/plugins/wordpress-seo/src/introductions/readme.md create mode 100644 wp-content/plugins/wordpress-seo/src/introductions/user-interface/introductions-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/introductions/user-interface/introductions-seen-route.php create mode 100644 wp-content/plugins/wordpress-seo/src/introductions/user-interface/wistia-embed-permission-route.php create mode 100644 wp-content/plugins/wordpress-seo/src/loadable-interface.php create mode 100644 wp-content/plugins/wordpress-seo/src/loader.php create mode 100644 wp-content/plugins/wordpress-seo/src/loggers/logger.php create mode 100644 wp-content/plugins/wordpress-seo/src/main.php create mode 100644 wp-content/plugins/wordpress-seo/src/memoizers/meta-tags-context-memoizer.php create mode 100644 wp-content/plugins/wordpress-seo/src/memoizers/presentation-memoizer.php create mode 100644 wp-content/plugins/wordpress-seo/src/models/indexable-extension.php create mode 100644 wp-content/plugins/wordpress-seo/src/models/indexable-hierarchy.php create mode 100644 wp-content/plugins/wordpress-seo/src/models/indexable.php create mode 100644 wp-content/plugins/wordpress-seo/src/models/primary-term.php create mode 100644 wp-content/plugins/wordpress-seo/src/models/seo-links.php create mode 100644 wp-content/plugins/wordpress-seo/src/models/seo-meta.php create mode 100644 wp-content/plugins/wordpress-seo/src/presentations/abstract-presentation.php create mode 100644 wp-content/plugins/wordpress-seo/src/presentations/archive-adjacent-trait.php create mode 100644 wp-content/plugins/wordpress-seo/src/presentations/indexable-author-archive-presentation.php create mode 100644 wp-content/plugins/wordpress-seo/src/presentations/indexable-date-archive-presentation.php create mode 100644 wp-content/plugins/wordpress-seo/src/presentations/indexable-error-page-presentation.php create mode 100644 wp-content/plugins/wordpress-seo/src/presentations/indexable-home-page-presentation.php create mode 100644 wp-content/plugins/wordpress-seo/src/presentations/indexable-post-type-archive-presentation.php create mode 100644 wp-content/plugins/wordpress-seo/src/presentations/indexable-post-type-presentation.php create mode 100644 wp-content/plugins/wordpress-seo/src/presentations/indexable-presentation.php create mode 100644 wp-content/plugins/wordpress-seo/src/presentations/indexable-search-result-page-presentation.php create mode 100644 wp-content/plugins/wordpress-seo/src/presentations/indexable-static-home-page-presentation.php create mode 100644 wp-content/plugins/wordpress-seo/src/presentations/indexable-static-posts-page-presentation.php create mode 100644 wp-content/plugins/wordpress-seo/src/presentations/indexable-term-archive-presentation.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/abstract-indexable-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/abstract-indexable-tag-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/abstract-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/admin/alert-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/admin/badge-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/admin/beta-badge-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/admin/help-link-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/admin/indexing-error-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/admin/indexing-failed-notification-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/admin/indexing-list-item-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/admin/indexing-notification-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/admin/light-switch-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/admin/meta-fields-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/admin/migration-error-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/admin/notice-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/admin/premium-badge-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/admin/search-engines-discouraged-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/admin/sidebar-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/admin/woocommerce-beta-editor-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/breadcrumbs-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/canonical-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/debug/marker-close-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/debug/marker-open-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/meta-author-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/meta-description-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/open-graph/article-author-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/open-graph/article-modified-time-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/open-graph/article-published-time-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/open-graph/article-publisher-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/open-graph/description-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/open-graph/image-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/open-graph/locale-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/open-graph/site-name-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/open-graph/title-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/open-graph/type-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/open-graph/url-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/rel-next-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/rel-prev-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/robots-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/robots-txt-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/schema-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/score-icon-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/slack/enhanced-data-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/title-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/twitter/card-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/twitter/creator-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/twitter/description-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/twitter/image-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/twitter/site-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/twitter/title-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/url-list-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/webmaster/baidu-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/webmaster/bing-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/webmaster/google-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/webmaster/pinterest-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/presenters/webmaster/yandex-presenter.php create mode 100644 wp-content/plugins/wordpress-seo/src/promotions/application/promotion-manager-interface.php create mode 100644 wp-content/plugins/wordpress-seo/src/promotions/application/promotion-manager.php create mode 100644 wp-content/plugins/wordpress-seo/src/promotions/domain/abstract-promotion.php create mode 100644 wp-content/plugins/wordpress-seo/src/promotions/domain/black-friday-checklist-promotion.php create mode 100644 wp-content/plugins/wordpress-seo/src/promotions/domain/black-friday-promotion.php create mode 100644 wp-content/plugins/wordpress-seo/src/promotions/domain/promotion-interface.php create mode 100644 wp-content/plugins/wordpress-seo/src/promotions/domain/time-interval.php create mode 100644 wp-content/plugins/wordpress-seo/src/repositories/indexable-cleanup-repository.php create mode 100644 wp-content/plugins/wordpress-seo/src/repositories/indexable-hierarchy-repository.php create mode 100644 wp-content/plugins/wordpress-seo/src/repositories/indexable-repository.php create mode 100644 wp-content/plugins/wordpress-seo/src/repositories/primary-term-repository.php create mode 100644 wp-content/plugins/wordpress-seo/src/repositories/seo-links-repository.php create mode 100644 wp-content/plugins/wordpress-seo/src/routes/abstract-action-route.php create mode 100644 wp-content/plugins/wordpress-seo/src/routes/abstract-indexation-route.php create mode 100644 wp-content/plugins/wordpress-seo/src/routes/alert-dismissal-route.php create mode 100644 wp-content/plugins/wordpress-seo/src/routes/first-time-configuration-route.php create mode 100644 wp-content/plugins/wordpress-seo/src/routes/importing-route.php create mode 100644 wp-content/plugins/wordpress-seo/src/routes/indexables-head-route.php create mode 100644 wp-content/plugins/wordpress-seo/src/routes/indexing-route.php create mode 100644 wp-content/plugins/wordpress-seo/src/routes/integrations-route.php create mode 100644 wp-content/plugins/wordpress-seo/src/routes/meta-search-route.php create mode 100644 wp-content/plugins/wordpress-seo/src/routes/route-interface.php create mode 100644 wp-content/plugins/wordpress-seo/src/routes/semrush-route.php create mode 100644 wp-content/plugins/wordpress-seo/src/routes/supported-features-route.php create mode 100644 wp-content/plugins/wordpress-seo/src/routes/wincher-route.php create mode 100644 wp-content/plugins/wordpress-seo/src/routes/workouts-route.php create mode 100644 wp-content/plugins/wordpress-seo/src/routes/yoast-head-rest-field.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/health-check/default-tagline-check.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/health-check/default-tagline-reports.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/health-check/default-tagline-runner.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/health-check/health-check.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/health-check/links-table-check.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/health-check/links-table-reports.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/health-check/links-table-runner.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/health-check/myyoast-api-request-factory.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/health-check/page-comments-check.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/health-check/page-comments-reports.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/health-check/page-comments-runner.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/health-check/postname-permalink-check.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/health-check/postname-permalink-reports.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/health-check/postname-permalink-runner.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/health-check/report-builder-factory.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/health-check/report-builder.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/health-check/reports-trait.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/health-check/runner-interface.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/importing/aioseo/aioseo-replacevar-service.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/importing/aioseo/aioseo-robots-provider-service.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/importing/aioseo/aioseo-robots-transformer-service.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/importing/aioseo/aioseo-social-images-provider-service.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/importing/conflicting-plugins-service.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/importing/importable-detector-service.php create mode 100644 wp-content/plugins/wordpress-seo/src/services/indexables/indexable-version-manager.php create mode 100644 wp-content/plugins/wordpress-seo/src/surfaces/classes-surface.php create mode 100644 wp-content/plugins/wordpress-seo/src/surfaces/helpers-surface.php create mode 100644 wp-content/plugins/wordpress-seo/src/surfaces/meta-surface.php create mode 100644 wp-content/plugins/wordpress-seo/src/surfaces/open-graph-helpers-surface.php create mode 100644 wp-content/plugins/wordpress-seo/src/surfaces/schema-helpers-surface.php create mode 100644 wp-content/plugins/wordpress-seo/src/surfaces/twitter-helpers-surface.php create mode 100644 wp-content/plugins/wordpress-seo/src/surfaces/values/meta.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/application/additional-contactmethods-collector.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/application/cleanup-service.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/application/custom-meta-collector.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/domain/additional-contactmethod-interface.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/domain/custom-meta-interface.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/framework/additional-contactmethods/facebook.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/framework/additional-contactmethods/instagram.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/framework/additional-contactmethods/linkedin.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/framework/additional-contactmethods/myspace.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/framework/additional-contactmethods/pinterest.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/framework/additional-contactmethods/soundcloud.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/framework/additional-contactmethods/tumblr.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/framework/additional-contactmethods/wikipedia.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/framework/additional-contactmethods/x.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/framework/additional-contactmethods/youtube.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/framework/custom-meta/author-metadesc.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/framework/custom-meta/author-title.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/framework/custom-meta/content-analysis-disable.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/framework/custom-meta/inclusive-language-analysis-disable.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/framework/custom-meta/keyword-analysis-disable.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/framework/custom-meta/noindex-author.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/infrastructure/cleanup-repository.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/user-interface/additional-contactmethods-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/user-interface/cleanup-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-meta/user-interface/custom-meta-integration.php create mode 100644 wp-content/plugins/wordpress-seo/src/user-profiles-additions/user-interface/user-profiles-additions-ui.php create mode 100644 wp-content/plugins/wordpress-seo/src/values/images.php create mode 100644 wp-content/plugins/wordpress-seo/src/values/indexables/indexable-builder-versions.php create mode 100644 wp-content/plugins/wordpress-seo/src/values/oauth/oauth-token.php create mode 100644 wp-content/plugins/wordpress-seo/src/values/open-graph/images.php create mode 100644 wp-content/plugins/wordpress-seo/src/values/robots/directive.php create mode 100644 wp-content/plugins/wordpress-seo/src/values/robots/user-agent-list.php create mode 100644 wp-content/plugins/wordpress-seo/src/values/robots/user-agent.php create mode 100644 wp-content/plugins/wordpress-seo/src/values/twitter/images.php create mode 100644 wp-content/plugins/wordpress-seo/src/wordpress/wrapper.php create mode 100644 wp-content/plugins/wordpress-seo/src/wrappers/wp-query-wrapper.php create mode 100644 wp-content/plugins/wordpress-seo/src/wrappers/wp-remote-handler.php create mode 100644 wp-content/plugins/wordpress-seo/src/wrappers/wp-rewrite-wrapper.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/autoload.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/composer/ClassLoader.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/composer/InstalledVersions.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/composer/LICENSE create mode 100644 wp-content/plugins/wordpress-seo/vendor/composer/autoload_classmap.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/composer/autoload_files.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/composer/autoload_namespaces.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/composer/autoload_psr4.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/composer/autoload_real.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/composer/autoload_static.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/composer/installed.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/composer/platform_check.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/CHANGELOG.md create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/LICENSE create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Configs/default.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Configs/version.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Configuration.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Exceptions/EmptyProperty.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Exceptions/InvalidOperatorType.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Exceptions/InvalidType.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Exceptions/InvalidVersionComparisonString.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Facades/wordpress.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Host.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Interfaces/DismissStorage.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Interfaces/Listener.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Interfaces/Message.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Interfaces/MessagePresenter.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Interfaces/Requirement.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Interfaces/VersionDetector.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/MessageDismisser.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/MessageFormatter.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Messages/BasicMessage.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Messages/HostMessage.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Messages/InvalidVersionRequirementMessage.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Messages/NullMessage.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Messages/UpgradePhpMessage.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/MessagesManager.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Presenters/WPMessagePresenter.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/RequirementsChecker.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/VersionRequirement.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/WPDismissOption.php create mode 100644 wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/WPMessageDismissListener.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/BodySummarizer.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/BodySummarizerInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Client.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/ClientInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/ClientTrait.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/CookieJar.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/SetCookie.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Exception/BadResponseException.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Exception/ClientException.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Exception/ConnectException.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Exception/GuzzleException.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Exception/RequestException.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Exception/ServerException.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Exception/TransferException.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Handler/CurlFactory.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Handler/CurlHandler.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Handler/EasyHandle.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Handler/MockHandler.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Handler/Proxy.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Handler/StreamHandler.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/HandlerStack.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/MessageFormatter.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/MessageFormatterInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Middleware.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Pool.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/RedirectMiddleware.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/RequestOptions.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/RetryMiddleware.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/TransferStats.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Utils.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/functions.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/functions_include.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/AggregateException.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/CancellationException.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/Coroutine.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/Create.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/Each.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/EachPromise.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/FulfilledPromise.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/Is.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/Promise.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/PromiseInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/PromisorInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/RejectedPromise.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/RejectionException.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/TaskQueue.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/TaskQueueInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/Utils.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/AppendStream.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/BufferStream.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/CachingStream.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/DroppingStream.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/Exception/MalformedUriException.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/FnStream.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/Header.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/HttpFactory.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/InflateStream.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/LazyOpenStream.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/LimitStream.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/Message.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/MessageTrait.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/MimeType.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/MultipartStream.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/NoSeekStream.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/PumpStream.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/Query.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/Request.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/Response.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/Rfc7230.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/ServerRequest.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/Stream.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/StreamDecoratorTrait.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/StreamWrapper.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/UploadedFile.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/Uri.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/UriComparator.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/UriNormalizer.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/UriResolver.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/Utils.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/Grant/AbstractGrant.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/Grant/AuthorizationCode.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/Grant/ClientCredentials.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/Grant/Exception/InvalidGrantException.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/Grant/GrantFactory.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/Grant/Password.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/Grant/RefreshToken.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/OptionProvider/HttpBasicAuthOptionProvider.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/OptionProvider/OptionProviderInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/OptionProvider/PostAuthOptionProvider.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/Provider/AbstractProvider.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/Provider/Exception/IdentityProviderException.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/Provider/GenericProvider.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/Provider/GenericResourceOwner.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/Provider/ResourceOwnerInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/Token/AccessToken.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/Token/AccessTokenInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/Token/ResourceOwnerAccessTokenInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/Tool/ArrayAccessorTrait.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/Tool/BearerAuthorizationTrait.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/Tool/GuardedPropertyTrait.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/Tool/MacAuthorizationTrait.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/Tool/ProviderRedirectTrait.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/Tool/QueryBuilderTrait.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/Tool/RequestFactory.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/Tool/RequiredParameterTrait.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/container/src/ContainerExceptionInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/container/src/ContainerInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/container/src/NotFoundExceptionInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/http-client/src/ClientExceptionInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/http-client/src/ClientInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/http-client/src/NetworkExceptionInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/http-client/src/RequestExceptionInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/http-factory/src/RequestFactoryInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/http-factory/src/ResponseFactoryInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/http-factory/src/ServerRequestFactoryInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/http-factory/src/StreamFactoryInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/http-factory/src/UploadedFileFactoryInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/http-factory/src/UriFactoryInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/http-message/src/MessageInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/http-message/src/RequestInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/http-message/src/ResponseInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/http-message/src/ServerRequestInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/http-message/src/StreamInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/http-message/src/UploadedFileInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/http-message/src/UriInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/log/Psr/Log/AbstractLogger.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/log/Psr/Log/InvalidArgumentException.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/log/Psr/Log/LogLevel.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/log/Psr/Log/LoggerAwareInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/log/Psr/Log/LoggerAwareTrait.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/log/Psr/Log/LoggerInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/log/Psr/Log/LoggerTrait.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/psr/log/Psr/Log/NullLogger.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/symfony/dependency-injection/Argument/RewindableGenerator.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/symfony/dependency-injection/Container.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/symfony/dependency-injection/ContainerInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/symfony/dependency-injection/Exception/EnvNotFoundException.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/symfony/dependency-injection/Exception/ExceptionInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/symfony/dependency-injection/Exception/InvalidArgumentException.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/symfony/dependency-injection/Exception/LogicException.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/symfony/dependency-injection/Exception/ParameterCircularReferenceException.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/symfony/dependency-injection/Exception/RuntimeException.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/symfony/dependency-injection/Exception/ServiceCircularReferenceException.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/symfony/dependency-injection/Exception/ServiceNotFoundException.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/symfony/dependency-injection/ParameterBag/EnvPlaceholderParameterBag.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/symfony/dependency-injection/ParameterBag/FrozenParameterBag.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/symfony/dependency-injection/ParameterBag/ParameterBag.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/symfony/dependency-injection/ParameterBag/ParameterBagInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/symfony/dependency-injection/ResettableContainerInterface.php create mode 100644 wp-content/plugins/wordpress-seo/vendor_prefixed/symfony/deprecation-contracts/function.php create mode 100644 wp-content/plugins/wordpress-seo/wp-seo-main.php create mode 100644 wp-content/plugins/wordpress-seo/wp-seo.php create mode 100755 wp-content/plugins/wordpress-seo/wpml-config.xml diff --git a/wp-content/plugins/wordpress-seo/admin/admin-settings-changed-listener.php b/wp-content/plugins/wordpress-seo/admin/admin-settings-changed-listener.php new file mode 100644 index 00000000..712c5445 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/admin-settings-changed-listener.php @@ -0,0 +1,89 @@ +helpers->current_page->is_yoast_seo_page() ) { + return; + } + + // Variable name is the same as the global that is set by get_settings_errors. + $wp_settings_errors = get_settings_errors(); + + foreach ( $wp_settings_errors as $key => $wp_settings_error ) { + if ( ! $this->is_settings_updated_notification( $wp_settings_error ) ) { + continue; + } + + self::$settings_saved = true; + unset( $wp_settings_errors[ $key ] ); + // phpcs:ignore WordPress.WP.GlobalVariablesOverride -- Overwrite the global with the list excluding the Changed saved message. + $GLOBALS['wp_settings_errors'] = $wp_settings_errors; + break; + } + } + + /** + * Checks whether the settings notification is a settings_updated notification. + * + * @param array $wp_settings_error The settings object. + * + * @return bool Whether this is a settings updated settings notification. + */ + public function is_settings_updated_notification( $wp_settings_error ) { + return ! empty( $wp_settings_error['code'] ) && $wp_settings_error['code'] === 'settings_updated'; + } + + /** + * Get whether the settings have successfully been saved + * + * @return bool Whether the settings have successfully been saved. + */ + public function have_settings_been_saved() { + return self::$settings_saved; + } + + /** + * Renders a success message if the Yoast SEO settings have been saved. + * + * @return void + */ + public function show_success_message() { + if ( $this->have_settings_been_saved() ) { + echo '

', + esc_html__( 'Settings saved.', 'wordpress-seo' ), + '

'; + } + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/ajax.php b/wp-content/plugins/wordpress-seo/admin/ajax.php new file mode 100644 index 00000000..34a6f886 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/ajax.php @@ -0,0 +1,419 @@ + 'success', + 'post_id' => $post_id, + "new_{$return_key}" => $sanitized_new_meta_value, + "original_{$return_key}" => $orig_meta_value, + ]; + + $the_post = get_post( $post_id ); + if ( empty( $the_post ) ) { + + $upsert_results['status'] = 'failure'; + $upsert_results['results'] = __( 'Post doesn\'t exist.', 'wordpress-seo' ); + + return $upsert_results; + } + + $post_type_object = get_post_type_object( $the_post->post_type ); + if ( ! $post_type_object ) { + + $upsert_results['status'] = 'failure'; + $upsert_results['results'] = sprintf( + /* translators: %s expands to post type. */ + __( 'Post has an invalid Content Type: %s.', 'wordpress-seo' ), + $the_post->post_type + ); + + return $upsert_results; + } + + if ( ! current_user_can( $post_type_object->cap->edit_posts ) ) { + + $upsert_results['status'] = 'failure'; + $upsert_results['results'] = sprintf( + /* translators: %s expands to post type name. */ + __( 'You can\'t edit %s.', 'wordpress-seo' ), + $post_type_object->label + ); + + return $upsert_results; + } + + if ( ! current_user_can( $post_type_object->cap->edit_others_posts ) && (int) $the_post->post_author !== get_current_user_id() ) { + + $upsert_results['status'] = 'failure'; + $upsert_results['results'] = sprintf( + /* translators: %s expands to the name of a post type (plural). */ + __( 'You can\'t edit %s that aren\'t yours.', 'wordpress-seo' ), + $post_type_object->label + ); + + return $upsert_results; + } + + if ( $sanitized_new_meta_value === $orig_meta_value && $sanitized_new_meta_value !== $new_meta_value ) { + $upsert_results['status'] = 'failure'; + $upsert_results['results'] = __( 'You have used HTML in your value which is not allowed.', 'wordpress-seo' ); + + return $upsert_results; + } + + $res = update_post_meta( $post_id, $meta_key, $sanitized_new_meta_value ); + + $upsert_results['status'] = ( $res !== false ) ? 'success' : 'failure'; + $upsert_results['results'] = $res; + + return $upsert_results; +} + +/** + * Save all titles sent from the Bulk Editor. + * + * @return void + */ +function wpseo_save_all_titles() { + wpseo_save_all( 'title' ); +} + +add_action( 'wp_ajax_wpseo_save_all_titles', 'wpseo_save_all_titles' ); + +/** + * Save all description sent from the Bulk Editor. + * + * @return void + */ +function wpseo_save_all_descriptions() { + wpseo_save_all( 'metadesc' ); +} + +add_action( 'wp_ajax_wpseo_save_all_descriptions', 'wpseo_save_all_descriptions' ); + +/** + * Utility function to save values. + * + * @param string $what Type of item so save. + * + * @return void + */ +function wpseo_save_all( $what ) { + check_ajax_referer( 'wpseo-bulk-editor' ); + + $results = []; + if ( ! isset( $_POST['items'], $_POST['existingItems'] ) ) { + wpseo_ajax_json_echo_die( $results ); + } + + $new_values = array_map( [ 'WPSEO_Utils', 'sanitize_text_field' ], wp_unslash( (array) $_POST['items'] ) ); + $original_values = array_map( [ 'WPSEO_Utils', 'sanitize_text_field' ], wp_unslash( (array) $_POST['existingItems'] ) ); + + foreach ( $new_values as $post_id => $new_value ) { + $original_value = $original_values[ $post_id ]; + $results[] = wpseo_upsert_new( $what, $post_id, $new_value, $original_value ); + } + + wpseo_ajax_json_echo_die( $results ); +} + +/** + * Insert a new value. + * + * @param string $what Item type (such as title). + * @param int $post_id Post ID. + * @param string $new_value New value to record. + * @param string $original Original value. + * + * @return string + */ +function wpseo_upsert_new( $what, $post_id, $new_value, $original ) { + $meta_key = WPSEO_Meta::$meta_prefix . $what; + + return wpseo_upsert_meta( $post_id, $new_value, $original, $meta_key, $what ); +} + +/** + * Retrieves the post ids where the keyword is used before as well as the types of those posts. + * + * @return void + */ +function ajax_get_keyword_usage_and_post_types() { + check_ajax_referer( 'wpseo-keyword-usage-and-post-types', 'nonce' ); + + if ( ! isset( $_POST['post_id'], $_POST['keyword'] ) || ! is_string( $_POST['keyword'] ) ) { + die( '-1' ); + } + + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- We are casting to an integer. + $post_id = (int) wp_unslash( $_POST['post_id'] ); + + if ( $post_id === 0 || ! current_user_can( 'edit_post', $post_id ) ) { + die( '-1' ); + } + + $keyword = sanitize_text_field( wp_unslash( $_POST['keyword'] ) ); + + $post_ids = WPSEO_Meta::keyword_usage( $keyword, $post_id ); + + if ( ! empty( $post_ids ) ) { + $post_types = WPSEO_Meta::post_types_for_ids( $post_ids ); + } + else { + $post_types = []; + } + + $return_object = [ + 'keyword_usage' => $post_ids, + 'post_types' => $post_types, + ]; + + wp_die( + // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: WPSEO_Utils::format_json_encode is safe. + WPSEO_Utils::format_json_encode( $return_object ) + ); +} + +add_action( 'wp_ajax_get_focus_keyword_usage_and_post_types', 'ajax_get_keyword_usage_and_post_types' ); + + +/** + * Retrieves the keyword for the keyword doubles of the termpages. + * + * @return void + */ +function ajax_get_term_keyword_usage() { + check_ajax_referer( 'wpseo-keyword-usage', 'nonce' ); + + if ( ! isset( $_POST['post_id'], $_POST['keyword'], $_POST['taxonomy'] ) || ! is_string( $_POST['keyword'] ) || ! is_string( $_POST['taxonomy'] ) ) { + wp_die( -1 ); + } + + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are casting the unsafe input to an integer. + $post_id = (int) wp_unslash( $_POST['post_id'] ); + + if ( $post_id === 0 ) { + wp_die( -1 ); + } + + $keyword = sanitize_text_field( wp_unslash( $_POST['keyword'] ) ); + $taxonomy_name = sanitize_text_field( wp_unslash( $_POST['taxonomy'] ) ); + + $taxonomy = get_taxonomy( $taxonomy_name ); + + if ( ! $taxonomy ) { + wp_die( 0 ); + } + + if ( ! current_user_can( $taxonomy->cap->edit_terms ) ) { + wp_die( -1 ); + } + + $usage = WPSEO_Taxonomy_Meta::get_keyword_usage( $keyword, $post_id, $taxonomy_name ); + + // Normalize the result so it is the same as the post keyword usage AJAX request. + $usage = $usage[ $keyword ]; + + wp_die( + // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: WPSEO_Utils::format_json_encode is safe. + WPSEO_Utils::format_json_encode( $usage ) + ); +} + +add_action( 'wp_ajax_get_term_keyword_usage', 'ajax_get_term_keyword_usage' ); + +/** + * Registers hooks for all AJAX integrations. + * + * @return void + */ +function wpseo_register_ajax_integrations() { + $integrations = [ new Yoast_Network_Admin() ]; + + foreach ( $integrations as $integration ) { + $integration->register_ajax_hooks(); + } +} + +wpseo_register_ajax_integrations(); + +new WPSEO_Shortcode_Filter(); + +new WPSEO_Taxonomy_Columns(); + +/* ********************* DEPRECATED FUNCTIONS ********************* */ + +/** + * Retrieves the keyword for the keyword doubles. + * + * @return void + */ +function ajax_get_keyword_usage() { + _deprecated_function( __METHOD__, 'WPSEO 20.4' ); + check_ajax_referer( 'wpseo-keyword-usage', 'nonce' ); + + if ( ! isset( $_POST['post_id'], $_POST['keyword'] ) || ! is_string( $_POST['keyword'] ) ) { + die( '-1' ); + } + + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- We are casting to an integer. + $post_id = (int) wp_unslash( $_POST['post_id'] ); + + if ( $post_id === 0 || ! current_user_can( 'edit_post', $post_id ) ) { + die( '-1' ); + } + + $keyword = sanitize_text_field( wp_unslash( $_POST['keyword'] ) ); + + wp_die( + // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: WPSEO_Utils::format_json_encode is safe. + WPSEO_Utils::format_json_encode( WPSEO_Meta::keyword_usage( $keyword, $post_id ) ) + ); +} diff --git a/wp-content/plugins/wordpress-seo/admin/ajax/class-shortcode-filter.php b/wp-content/plugins/wordpress-seo/admin/ajax/class-shortcode-filter.php new file mode 100644 index 00000000..c9f5f3db --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/ajax/class-shortcode-filter.php @@ -0,0 +1,54 @@ + $shortcode, + 'output' => do_shortcode( $shortcode ), + ]; + } + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: WPSEO_Utils::format_json_encode is considered safe. + wp_die( WPSEO_Utils::format_json_encode( $parsed_shortcodes ) ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-dismissable-notice.php b/wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-dismissable-notice.php new file mode 100644 index 00000000..c847ba62 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-dismissable-notice.php @@ -0,0 +1,95 @@ +notice_name = $notice_name; + $this->notice_type = $notice_type; + + add_action( 'wp_ajax_wpseo_dismiss_' . $notice_name, [ $this, 'dismiss_notice' ] ); + } + + /** + * Handles the dismiss notice request. + * + * @return void + */ + public function dismiss_notice() { + check_ajax_referer( 'wpseo-dismiss-' . $this->notice_name ); + + $this->save_dismissed(); + + wp_die( 'true' ); + } + + /** + * Storing the dismissed value in the database. The target location is based on the set notification type. + * + * @return void + */ + private function save_dismissed() { + if ( $this->notice_type === self::FOR_SITE ) { + update_option( 'wpseo_dismiss_' . $this->notice_name, 1 ); + + return; + } + + if ( $this->notice_type === self::FOR_NETWORK ) { + update_site_option( 'wpseo_dismiss_' . $this->notice_name, 1 ); + + return; + } + + update_user_meta( get_current_user_id(), 'wpseo_dismiss_' . $this->notice_name, 1 ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-plugin-conflict-ajax.php b/wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-plugin-conflict-ajax.php new file mode 100644 index 00000000..9778c5e7 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-plugin-conflict-ajax.php @@ -0,0 +1,130 @@ + sanitize_text_field( $conflict_data['section'] ), + 'plugins' => sanitize_text_field( $conflict_data['plugins'] ), + ]; + + $this->dismissed_conflicts = $this->get_dismissed_conflicts( $conflict_data['section'] ); + + $this->compare_plugins( $conflict_data['plugins'] ); + + $this->save_dismissed_conflicts( $conflict_data['section'] ); + + wp_die( 'true' ); + } + + /** + * Getting the user option from the database. + * + * @return bool|array + */ + private function get_dismissed_option() { + return get_user_meta( get_current_user_id(), $this->option_name, true ); + } + + /** + * Getting the dismissed conflicts from the database + * + * @param string $plugin_section Type of conflict group (such as Open Graph or sitemap). + * + * @return array + */ + private function get_dismissed_conflicts( $plugin_section ) { + $dismissed_conflicts = $this->get_dismissed_option(); + + if ( is_array( $dismissed_conflicts ) && array_key_exists( $plugin_section, $dismissed_conflicts ) ) { + return $dismissed_conflicts[ $plugin_section ]; + } + + return []; + } + + /** + * Storing the conflicting plugins as an user option in the database. + * + * @param string $plugin_section Plugin conflict type (such as Open Graph or sitemap). + * + * @return void + */ + private function save_dismissed_conflicts( $plugin_section ) { + $dismissed_conflicts = $this->get_dismissed_option(); + + $dismissed_conflicts[ $plugin_section ] = $this->dismissed_conflicts; + + update_user_meta( get_current_user_id(), $this->option_name, $dismissed_conflicts ); + } + + /** + * Loop through the plugins to compare them with the already stored dismissed plugin conflicts. + * + * @param array $posted_plugins Plugin set to check. + * + * @return void + */ + public function compare_plugins( array $posted_plugins ) { + foreach ( $posted_plugins as $posted_plugin ) { + $this->compare_plugin( $posted_plugin ); + } + } + + /** + * Check if plugin is already dismissed, if not store it in the array that will be saved later. + * + * @param string $posted_plugin Plugin to check against dismissed conflicts. + * + * @return void + */ + private function compare_plugin( $posted_plugin ) { + if ( ! in_array( $posted_plugin, $this->dismissed_conflicts, true ) ) { + $this->dismissed_conflicts[] = $posted_plugin; + } + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/capabilities/class-abstract-capability-manager.php b/wp-content/plugins/wordpress-seo/admin/capabilities/class-abstract-capability-manager.php new file mode 100644 index 00000000..8f290d81 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/capabilities/class-abstract-capability-manager.php @@ -0,0 +1,91 @@ +capabilities[ $capability ] ) ) { + $this->capabilities[ $capability ] = $roles; + + return; + } + + // Combine configurations. + $this->capabilities[ $capability ] = array_merge( $roles, $this->capabilities[ $capability ] ); + + // Remove doubles. + $this->capabilities[ $capability ] = array_unique( $this->capabilities[ $capability ] ); + } + + /** + * Returns the list of registered capabilitities. + * + * @return string[] Registered capabilities. + */ + public function get_capabilities() { + return array_keys( $this->capabilities ); + } + + /** + * Returns a list of WP_Role roles. + * + * The string array of role names are converted to actual WP_Role objects. + * These are needed to be able to use the API on them. + * + * @param array $roles Roles to retrieve the objects for. + * + * @return WP_Role[] List of WP_Role objects. + */ + protected function get_wp_roles( array $roles ) { + $wp_roles = array_map( 'get_role', $roles ); + + return array_filter( $wp_roles ); + } + + /** + * Filter capability roles. + * + * @param string $capability Capability to filter roles for. + * @param array $roles List of roles which can be filtered. + * + * @return array Filtered list of roles for the capability. + */ + protected function filter_roles( $capability, array $roles ) { + /** + * Filter: Allow changing roles that a capability is added to. + * + * @param array $roles The default roles to be filtered. + */ + $filtered = apply_filters( $capability . '_roles', $roles ); + + // Make sure we have the expected type. + if ( ! is_array( $filtered ) ) { + return []; + } + + return $filtered; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager-factory.php b/wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager-factory.php new file mode 100644 index 00000000..e265bee1 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager-factory.php @@ -0,0 +1,35 @@ +manager = $manager; + } + + /** + * Registers the hooks. + * + * @return void + */ + public function register_hooks() { + add_filter( 'members_get_capabilities', [ $this, 'get_capabilities' ] ); + add_action( 'members_register_cap_groups', [ $this, 'action_members_register_cap_group' ] ); + + add_filter( 'ure_capabilities_groups_tree', [ $this, 'filter_ure_capabilities_groups_tree' ] ); + add_filter( 'ure_custom_capability_groups', [ $this, 'filter_ure_custom_capability_groups' ], 10, 2 ); + } + + /** + * Get the Yoast SEO capabilities. + * Optionally append them to an existing array. + * + * @param array $caps Optional existing capability list. + * @return array + */ + public function get_capabilities( array $caps = [] ) { + if ( ! did_action( 'wpseo_register_capabilities' ) ) { + do_action( 'wpseo_register_capabilities' ); + } + + return array_merge( $caps, $this->manager->get_capabilities() ); + } + + /** + * Add capabilities to its own group in the Members plugin. + * + * @see members_register_cap_group() + * + * @return void + */ + public function action_members_register_cap_group() { + if ( ! function_exists( 'members_register_cap_group' ) ) { + return; + } + + // Register the yoast group. + $args = [ + 'label' => esc_html__( 'Yoast SEO', 'wordpress-seo' ), + 'caps' => $this->get_capabilities(), + 'icon' => 'dashicons-admin-plugins', + 'diff_added' => true, + ]; + members_register_cap_group( 'wordpress-seo', $args ); + } + + /** + * Adds Yoast SEO capability group in the User Role Editor plugin. + * + * @see URE_Capabilities_Groups_Manager::get_groups_tree() + * + * @param array $groups Current groups. + * + * @return array Filtered list of capabilty groups. + */ + public function filter_ure_capabilities_groups_tree( $groups = [] ) { + $groups = (array) $groups; + + $groups['wordpress-seo'] = [ + 'caption' => 'Yoast SEO', + 'parent' => 'custom', + 'level' => 3, + ]; + + return $groups; + } + + /** + * Adds capabilities to the Yoast SEO group in the User Role Editor plugin. + * + * @see URE_Capabilities_Groups_Manager::get_cap_groups() + * + * @param array $groups Current capability groups. + * @param string $cap_id Capability identifier. + * + * @return array List of filtered groups. + */ + public function filter_ure_custom_capability_groups( $groups = [], $cap_id = '' ) { + if ( in_array( $cap_id, $this->get_capabilities(), true ) ) { + $groups = (array) $groups; + $groups[] = 'wordpress-seo'; + } + + return $groups; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager-vip.php b/wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager-vip.php new file mode 100644 index 00000000..4f56e8e4 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager-vip.php @@ -0,0 +1,73 @@ +capabilities as $capability => $roles ) { + $role_capabilities = $this->get_role_capabilities( $role_capabilities, $capability, $roles ); + } + + foreach ( $role_capabilities as $role => $capabilities ) { + wpcom_vip_add_role_caps( $role, $capabilities ); + } + } + + /** + * Removes the registered capabilities from the system + * + * @return void + */ + public function remove() { + // Remove from any role it has been added to. + $roles = wp_roles()->get_names(); + $roles = array_keys( $roles ); + + $role_capabilities = []; + foreach ( array_keys( $this->capabilities ) as $capability ) { + // Allow filtering of roles. + $role_capabilities = $this->get_role_capabilities( $role_capabilities, $capability, $roles ); + } + + foreach ( $role_capabilities as $role => $capabilities ) { + wpcom_vip_remove_role_caps( $role, $capabilities ); + } + } + + /** + * Returns the roles which the capability is registered on. + * + * @param array $role_capabilities List of all roles with their capabilities. + * @param string $capability Capability to filter roles for. + * @param array $roles List of default roles. + * + * @return array List of capabilities. + */ + protected function get_role_capabilities( $role_capabilities, $capability, $roles ) { + // Allow filtering of roles. + $filtered_roles = $this->filter_roles( $capability, $roles ); + + foreach ( $filtered_roles as $role ) { + if ( ! isset( $add_role_caps[ $role ] ) ) { + $role_capabilities[ $role ] = []; + } + + $role_capabilities[ $role ][] = $capability; + } + + return $role_capabilities; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager-wp.php b/wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager-wp.php new file mode 100644 index 00000000..18309567 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager-wp.php @@ -0,0 +1,51 @@ +capabilities as $capability => $roles ) { + $filtered_roles = $this->filter_roles( $capability, $roles ); + + $wp_roles = $this->get_wp_roles( $filtered_roles ); + foreach ( $wp_roles as $wp_role ) { + $wp_role->add_cap( $capability ); + } + } + } + + /** + * Unregisters the capabilities from the system. + * + * @return void + */ + public function remove() { + // Remove from any roles it has been added to. + $roles = wp_roles()->get_names(); + $roles = array_keys( $roles ); + + foreach ( $this->capabilities as $capability => $_roles ) { + $registered_roles = array_unique( array_merge( $roles, $this->capabilities[ $capability ] ) ); + + // Allow filtering of roles. + $filtered_roles = $this->filter_roles( $capability, $registered_roles ); + + $wp_roles = $this->get_wp_roles( $filtered_roles ); + foreach ( $wp_roles as $wp_role ) { + $wp_role->remove_cap( $capability ); + } + } + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager.php b/wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager.php new file mode 100644 index 00000000..63f6962d --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/capabilities/class-capability-manager.php @@ -0,0 +1,38 @@ + $applicable_roles ] ); + } + + /** + * Retrieves the roles that have the specified capability. + * + * @param string $capability The name of the capability. + * + * @return array The names of the roles that have the capability. + */ + public static function get_applicable_roles( $capability ) { + $roles = wp_roles(); + $role_names = $roles->get_names(); + + $applicable_roles = []; + foreach ( array_keys( $role_names ) as $role_name ) { + $role = $roles->get_role( $role_name ); + + if ( ! $role ) { + continue; + } + + // Add role if it has the capability. + if ( array_key_exists( $capability, $role->capabilities ) && $role->capabilities[ $capability ] === true ) { + $applicable_roles[] = $role_name; + } + } + + return $applicable_roles; + } + + /** + * Checks if the current user has at least one of the supplied capabilities. + * + * @param array $capabilities Capabilities to check against. + * + * @return bool True if the user has at least one capability. + */ + protected static function has_any( array $capabilities ) { + foreach ( $capabilities as $capability ) { + if ( self::has( $capability ) ) { + return true; + } + } + + return false; + } + + /** + * Checks if the user has a certain capability. + * + * @param string $capability Capability to check against. + * + * @return bool True if the user has the capability. + */ + protected static function has( $capability ) { + return current_user_can( $capability ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/capabilities/class-register-capabilities.php b/wp-content/plugins/wordpress-seo/admin/capabilities/class-register-capabilities.php new file mode 100644 index 00000000..6cf248d8 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/capabilities/class-register-capabilities.php @@ -0,0 +1,111 @@ +register( 'wpseo_bulk_edit', [ 'editor', 'wpseo_editor', 'wpseo_manager' ] ); + $manager->register( 'wpseo_edit_advanced_metadata', [ 'editor', 'wpseo_editor', 'wpseo_manager' ] ); + + $manager->register( 'wpseo_manage_options', [ 'administrator', 'wpseo_manager' ] ); + $manager->register( 'view_site_health_checks', [ 'wpseo_manager' ] ); + } + + /** + * Revokes the 'wpseo_manage_options' capability from administrator users if it should + * only be granted to network administrators. + * + * @param array $allcaps An array of all the user's capabilities. + * @param array $caps Actual capabilities being checked. + * @param array $args Optional parameters passed to has_cap(), typically object ID. + * @param WP_User $user The user object. + * + * @return array Possibly modified array of the user's capabilities. + */ + public function filter_user_has_wpseo_manage_options_cap( $allcaps, $caps, $args, $user ) { + + // We only need to do something if 'wpseo_manage_options' is being checked. + if ( ! in_array( 'wpseo_manage_options', $caps, true ) ) { + return $allcaps; + } + + // If the user does not have 'wpseo_manage_options' anyway, we don't need to revoke access. + if ( empty( $allcaps['wpseo_manage_options'] ) ) { + return $allcaps; + } + + // If the user does not have 'delete_users', they are not an administrator. + if ( empty( $allcaps['delete_users'] ) ) { + return $allcaps; + } + + $options = WPSEO_Options::get_instance(); + + if ( $options->get( 'access' ) === 'superadmin' && ! is_super_admin( $user->ID ) ) { + unset( $allcaps['wpseo_manage_options'] ); + } + + return $allcaps; + } + + /** + * Maybe add manage_privacy_options capability for wpseo_manager user role. + * + * @param string[] $caps Primitive capabilities required of the user. + * @param string[] $cap Capability being checked. + * + * @return string[] Filtered primitive capabilities required of the user. + */ + public function map_meta_cap_for_seo_manager( $caps, $cap ) { + $user = wp_get_current_user(); + + // No multisite support. + if ( is_multisite() ) { + return $caps; + } + + // User must be of role wpseo_manager. + if ( ! in_array( 'wpseo_manager', $user->roles, true ) ) { + return $caps; + } + + // Remove manage_options cap requirement if requested cap is manage_privacy_options. + if ( $cap === 'manage_privacy_options' ) { + return array_diff( $caps, [ 'manage_options' ] ); + } + + return $caps; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-admin-asset-analysis-worker-location.php b/wp-content/plugins/wordpress-seo/admin/class-admin-asset-analysis-worker-location.php new file mode 100644 index 00000000..cb980ad1 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-admin-asset-analysis-worker-location.php @@ -0,0 +1,75 @@ +flatten_version( WPSEO_VERSION ); + } + + $analysis_worker = $name . '-' . $flat_version . '.js'; + + $this->asset_location = WPSEO_Admin_Asset_Manager::create_default_location(); + $this->asset = new WPSEO_Admin_Asset( + [ + 'name' => $name, + 'src' => $analysis_worker, + ] + ); + } + + /** + * Retrieves the analysis worker asset. + * + * @return WPSEO_Admin_Asset The analysis worker asset. + */ + public function get_asset() { + return $this->asset; + } + + /** + * Determines the URL of the asset on the dev server. + * + * @param WPSEO_Admin_Asset $asset The asset to determine the URL for. + * @param string $type The type of asset. Usually JS or CSS. + * + * @return string The URL of the asset. + */ + public function get_url( WPSEO_Admin_Asset $asset, $type ) { + $scheme = wp_parse_url( $asset->get_src(), PHP_URL_SCHEME ); + if ( in_array( $scheme, [ 'http', 'https' ], true ) ) { + return $asset->get_src(); + } + + return $this->asset_location->get_url( $asset, $type ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-admin-asset-dev-server-location.php b/wp-content/plugins/wordpress-seo/admin/class-admin-asset-dev-server-location.php new file mode 100644 index 00000000..cf67ae74 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-admin-asset-dev-server-location.php @@ -0,0 +1,71 @@ +url = $url; + } + + /** + * Determines the URL of the asset on the dev server. + * + * @param WPSEO_Admin_Asset $asset The asset to determine the URL for. + * @param string $type The type of asset. Usually JS or CSS. + * + * @return string The URL of the asset. + */ + public function get_url( WPSEO_Admin_Asset $asset, $type ) { + if ( $type === WPSEO_Admin_Asset::TYPE_CSS ) { + return $this->get_default_url( $asset, $type ); + } + + $path = sprintf( 'js/dist/%s%s.js', $asset->get_src(), $asset->get_suffix() ); + + return trailingslashit( $this->url ) . $path; + } + + /** + * Determines the URL of the asset not using the dev server. + * + * @param WPSEO_Admin_Asset $asset The asset to determine the URL for. + * @param string $type The type of asset. + * + * @return string The URL of the asset file. + */ + public function get_default_url( WPSEO_Admin_Asset $asset, $type ) { + $default_location = new WPSEO_Admin_Asset_SEO_Location( WPSEO_FILE ); + + return $default_location->get_url( $asset, $type ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-admin-asset-location.php b/wp-content/plugins/wordpress-seo/admin/class-admin-asset-location.php new file mode 100644 index 00000000..7d1c8c35 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-admin-asset-location.php @@ -0,0 +1,22 @@ +asset_location = $asset_location; + $this->prefix = $prefix; + } + + /** + * Enqueues scripts. + * + * @param string $script The name of the script to enqueue. + * + * @return void + */ + public function enqueue_script( $script ) { + wp_enqueue_script( $this->prefix . $script ); + } + + /** + * Enqueues styles. + * + * @param string $style The name of the style to enqueue. + * + * @return void + */ + public function enqueue_style( $style ) { + wp_enqueue_style( $this->prefix . $style ); + } + + /** + * Enqueues the appropriate language for the user. + * + * @return void + */ + public function enqueue_user_language_script() { + $this->enqueue_script( 'language-' . YoastSEO()->helpers->language->get_researcher_language() ); + } + + /** + * Registers scripts based on it's parameters. + * + * @param WPSEO_Admin_Asset $script The script to register. + * + * @return void + */ + public function register_script( WPSEO_Admin_Asset $script ) { + $url = $script->get_src() ? $this->get_url( $script, WPSEO_Admin_Asset::TYPE_JS ) : false; + + wp_register_script( + $this->prefix . $script->get_name(), + $url, + $script->get_deps(), + $script->get_version(), + $script->is_in_footer() + ); + + if ( in_array( 'wp-i18n', $script->get_deps(), true ) ) { + wp_set_script_translations( $this->prefix . $script->get_name(), 'wordpress-seo' ); + } + } + + /** + * Registers styles based on it's parameters. + * + * @param WPSEO_Admin_Asset $style The style to register. + * + * @return void + */ + public function register_style( WPSEO_Admin_Asset $style ) { + wp_register_style( + $this->prefix . $style->get_name(), + $this->get_url( $style, WPSEO_Admin_Asset::TYPE_CSS ), + $style->get_deps(), + $style->get_version(), + $style->get_media() + ); + } + + /** + * Calls the functions that register scripts and styles with the scripts and styles to be registered as arguments. + * + * @return void + */ + public function register_assets() { + $this->register_scripts( $this->scripts_to_be_registered() ); + $this->register_styles( $this->styles_to_be_registered() ); + } + + /** + * Registers all the scripts passed to it. + * + * @param array $scripts The scripts passed to it. + * + * @return void + */ + public function register_scripts( $scripts ) { + foreach ( $scripts as $script ) { + $script = new WPSEO_Admin_Asset( $script ); + $this->register_script( $script ); + } + } + + /** + * Registers all the styles it receives. + * + * @param array $styles Styles that need to be registered. + * + * @return void + */ + public function register_styles( $styles ) { + foreach ( $styles as $style ) { + $style = new WPSEO_Admin_Asset( $style ); + $this->register_style( $style ); + } + } + + /** + * Localizes the script. + * + * @param string $handle The script handle. + * @param string $object_name The object name. + * @param array $data The l10n data. + * + * @return void + */ + public function localize_script( $handle, $object_name, $data ) { + wp_localize_script( $this->prefix . $handle, $object_name, $data ); + } + + /** + * Adds an inline script. + * + * @param string $handle The script handle. + * @param string $data The l10n data. + * @param string $position Optional. Whether to add the inline script before the handle or after. + * + * @return void + */ + public function add_inline_script( $handle, $data, $position = 'after' ) { + wp_add_inline_script( $this->prefix . $handle, $data, $position ); + } + + /** + * A list of styles that shouldn't be registered but are needed in other locations in the plugin. + * + * @return array + */ + public function special_styles() { + $flat_version = $this->flatten_version( WPSEO_VERSION ); + $asset_args = [ + 'name' => 'inside-editor', + 'src' => 'inside-editor-' . $flat_version, + ]; + + return [ 'inside-editor' => new WPSEO_Admin_Asset( $asset_args ) ]; + } + + /** + * Flattens a version number for use in a filename. + * + * @param string $version The original version number. + * + * @return string The flattened version number. + */ + public function flatten_version( $version ) { + $parts = explode( '.', $version ); + + if ( count( $parts ) === 2 && preg_match( '/^\d+$/', $parts[1] ) === 1 ) { + $parts[] = '0'; + } + + return implode( '', $parts ); + } + + /** + * Creates a default location object for use in the admin asset manager. + * + * @return WPSEO_Admin_Asset_Location The location to use in the asset manager. + */ + public static function create_default_location() { + if ( defined( 'YOAST_SEO_DEV_SERVER' ) && YOAST_SEO_DEV_SERVER ) { + $url = defined( 'YOAST_SEO_DEV_SERVER_URL' ) ? YOAST_SEO_DEV_SERVER_URL : WPSEO_Admin_Asset_Dev_Server_Location::DEFAULT_URL; + + return new WPSEO_Admin_Asset_Dev_Server_Location( $url ); + } + + return new WPSEO_Admin_Asset_SEO_Location( WPSEO_FILE, false ); + } + + /** + * Checks if the given script is enqueued. + * + * @param string $script The script to check. + * + * @return bool True when the script is enqueued. + */ + public function is_script_enqueued( $script ) { + return wp_script_is( $this->prefix . $script ); + } + + /** + * Returns the scripts that need to be registered. + * + * @todo Data format is not self-documenting. Needs explanation inline. R. + * + * @return array The scripts that need to be registered. + */ + protected function scripts_to_be_registered() { + $header_scripts = [ + 'admin-global', + 'block-editor', + 'classic-editor', + 'post-edit', + 'help-scout-beacon', + 'redirect-old-features-tab', + ]; + $additional_dependencies = [ + 'analysis-worker' => [ self::PREFIX . 'analysis-package' ], + 'api-client' => [ 'wp-api' ], + 'crawl-settings' => [ 'jquery' ], + 'dashboard-widget' => [ self::PREFIX . 'api-client' ], + 'wincher-dashboard-widget' => [ self::PREFIX . 'api-client' ], + 'editor-modules' => [ 'jquery' ], + 'elementor' => [ + self::PREFIX . 'api-client', + self::PREFIX . 'externals-components', + self::PREFIX . 'externals-contexts', + self::PREFIX . 'externals-redux', + ], + 'indexation' => [ + 'jquery-ui-core', + 'jquery-ui-progressbar', + ], + 'first-time-configuration' => [ + self::PREFIX . 'api-client', + self::PREFIX . 'externals-components', + self::PREFIX . 'externals-contexts', + self::PREFIX . 'externals-redux', + ], + 'integrations-page' => [ + self::PREFIX . 'api-client', + self::PREFIX . 'externals-components', + self::PREFIX . 'externals-contexts', + self::PREFIX . 'externals-redux', + ], + 'post-edit' => [ + self::PREFIX . 'api-client', + self::PREFIX . 'block-editor', + self::PREFIX . 'externals-components', + self::PREFIX . 'externals-contexts', + self::PREFIX . 'externals-redux', + ], + 'reindex-links' => [ + 'jquery-ui-core', + 'jquery-ui-progressbar', + ], + 'settings' => [ + 'jquery-ui-core', + 'jquery-ui-progressbar', + self::PREFIX . 'api-client', + self::PREFIX . 'externals-components', + self::PREFIX . 'externals-contexts', + self::PREFIX . 'externals-redux', + ], + 'term-edit' => [ + self::PREFIX . 'api-client', + self::PREFIX . 'classic-editor', + self::PREFIX . 'externals-components', + self::PREFIX . 'externals-contexts', + self::PREFIX . 'externals-redux', + ], + ]; + + $plugin_scripts = $this->load_generated_asset_file( + [ + 'asset_file' => __DIR__ . '/../src/generated/assets/plugin.php', + 'ext_length' => 3, + 'additional_deps' => $additional_dependencies, + 'header_scripts' => $header_scripts, + ] + ); + $external_scripts = $this->load_generated_asset_file( + [ + 'asset_file' => __DIR__ . '/../src/generated/assets/externals.php', + 'ext_length' => 3, + 'suffix' => '-package', + 'base_dir' => 'externals/', + 'additional_deps' => $additional_dependencies, + 'header_scripts' => $header_scripts, + ] + ); + $language_scripts = $this->load_generated_asset_file( + [ + 'asset_file' => __DIR__ . '/../src/generated/assets/languages.php', + 'ext_length' => 3, + 'suffix' => '-language', + 'base_dir' => 'languages/', + 'additional_deps' => $additional_dependencies, + 'header_scripts' => $header_scripts, + ] + ); + $renamed_scripts = $this->load_renamed_scripts(); + + $scripts = array_merge( + $plugin_scripts, + $external_scripts, + $language_scripts, + $renamed_scripts + ); + + $scripts['installation-success'] = [ + 'name' => 'installation-success', + 'src' => 'installation-success.js', + 'deps' => [ + 'wp-a11y', + 'wp-dom-ready', + 'wp-components', + 'wp-element', + 'wp-i18n', + self::PREFIX . 'components-new-package', + self::PREFIX . 'externals-components', + ], + 'version' => $scripts['installation-success']['version'], + ]; + + $scripts['post-edit-classic'] = [ + 'name' => 'post-edit-classic', + 'src' => $scripts['post-edit']['src'], + 'deps' => array_map( + static function ( $dep ) { + if ( $dep === self::PREFIX . 'block-editor' ) { + return self::PREFIX . 'classic-editor'; + } + return $dep; + }, + $scripts['post-edit']['deps'] + ), + 'in_footer' => ! in_array( 'post-edit-classic', $header_scripts, true ), + 'version' => $scripts['post-edit']['version'], + ]; + + $scripts['workouts'] = [ + 'name' => 'workouts', + 'src' => 'workouts.js', + 'deps' => [ + 'clipboard', + 'lodash', + 'wp-api-fetch', + 'wp-a11y', + 'wp-components', + 'wp-compose', + 'wp-data', + 'wp-dom-ready', + 'wp-element', + 'wp-i18n', + self::PREFIX . 'externals-components', + self::PREFIX . 'externals-contexts', + self::PREFIX . 'externals-redux', + self::PREFIX . 'analysis', + self::PREFIX . 'react-select', + self::PREFIX . 'components-new-package', + ], + 'version' => $scripts['workouts']['version'], + ]; + + // Add the current language to every script that requires the analysis package. + foreach ( $scripts as $name => $script ) { + if ( substr( $name, -8 ) === 'language' ) { + continue; + } + if ( in_array( self::PREFIX . 'analysis-package', $script['deps'], true ) ) { + $scripts[ $name ]['deps'][] = self::PREFIX . YoastSEO()->helpers->language->get_researcher_language() . '-language'; + } + } + + return $scripts; + } + + /** + * Loads a generated asset file. + * + * @param array $args { + * The arguments. + * + * @type string $asset_file The asset file to load. + * @type int $ext_length The length of the extension, including suffix, of the filename. + * @type string $suffix Optional. The suffix of the asset name. + * @type array $additional_deps Optional. The additional dependencies assets may have. + * @type string $base_dir Optional. The base directory of the asset. + * @type string[] $header_scripts Optional. The script names that should be in the header. + * } + * + * @return array { + * The scripts to be registered. + * + * @type string $name The name of the asset. + * @type string $src The src of the asset. + * @type string[] $deps The dependenies of the asset. + * @type bool $in_footer Whether or not the asset should be in the footer. + * } + */ + protected function load_generated_asset_file( $args ) { + $args = wp_parse_args( + $args, + [ + 'suffix' => '', + 'additional_deps' => [], + 'base_dir' => '', + 'header_scripts' => [], + ] + ); + $scripts = []; + $assets = require $args['asset_file']; + foreach ( $assets as $file => $data ) { + $name = substr( $file, 0, -$args['ext_length'] ); + $name = strtolower( preg_replace( '/([A-Z])/', '-$1', $name ) ); + $name .= $args['suffix']; + + $deps = $data['dependencies']; + if ( isset( $args['additional_deps'][ $name ] ) ) { + $deps = array_merge( $deps, $args['additional_deps'][ $name ] ); + } + + $scripts[ $name ] = [ + 'name' => $name, + 'src' => $args['base_dir'] . $file, + 'deps' => $deps, + 'in_footer' => ! in_array( $name, $args['header_scripts'], true ), + 'version' => $data['version'], + ]; + } + + return $scripts; + } + + /** + * Loads the scripts that should be renamed for BC. + * + * @return array { + * The scripts to be registered. + * + * @type string $name The name of the asset. + * @type string $src The src of the asset. + * @type string[] $deps The dependenies of the asset. + * @type bool $in_footer Whether or not the asset should be in the footer. + * } + */ + protected function load_renamed_scripts() { + $scripts = []; + $renamed_scripts = [ + 'admin-global-script' => 'admin-global', + 'analysis' => 'analysis-package', + 'analysis-report' => 'analysis-report-package', + 'api' => 'api-client', + 'commons' => 'commons-package', + 'edit-page' => 'edit-page-script', + 'draft-js' => 'draft-js-package', + 'feature-flag' => 'feature-flag-package', + 'helpers' => 'helpers-package', + 'jed' => 'jed-package', + 'chart.js' => 'chart.js-package', + 'network-admin-script' => 'network-admin', + 'redux' => 'redux-package', + 'replacement-variable-editor' => 'replacement-variable-editor-package', + 'search-metadata-previews' => 'search-metadata-previews-package', + 'social-metadata-forms' => 'social-metadata-forms-package', + 'styled-components' => 'styled-components-package', + 'style-guide' => 'style-guide-package', + 'yoast-components' => 'components-new-package', + ]; + + foreach ( $renamed_scripts as $original => $replacement ) { + $scripts[] = [ + 'name' => $original, + 'src' => false, + 'deps' => [ self::PREFIX . $replacement ], + ]; + } + + return $scripts; + } + + /** + * Returns the styles that need to be registered. + * + * @todo Data format is not self-documenting. Needs explanation inline. R. + * + * @return array Styles that need to be registered. + */ + protected function styles_to_be_registered() { + $flat_version = $this->flatten_version( WPSEO_VERSION ); + + return [ + [ + 'name' => 'admin-css', + 'src' => 'yst_plugin_tools-' . $flat_version, + 'deps' => [ self::PREFIX . 'toggle-switch' ], + ], + [ + 'name' => 'toggle-switch', + 'src' => 'toggle-switch-' . $flat_version, + ], + [ + 'name' => 'dismissible', + 'src' => 'wpseo-dismissible-' . $flat_version, + ], + [ + 'name' => 'notifications', + 'src' => 'notifications-' . $flat_version, + ], + [ + 'name' => 'alert', + 'src' => 'alerts-' . $flat_version, + ], + [ + 'name' => 'edit-page', + 'src' => 'edit-page-' . $flat_version, + ], + [ + 'name' => 'featured-image', + 'src' => 'featured-image-' . $flat_version, + ], + [ + 'name' => 'metabox-css', + 'src' => 'metabox-' . $flat_version, + 'deps' => [ + self::PREFIX . 'admin-css', + self::PREFIX . 'tailwind', + 'wp-components', + ], + ], + [ + 'name' => 'ai-generator', + 'src' => 'ai-generator-' . $flat_version, + 'deps' => [ + self::PREFIX . 'tailwind', + self::PREFIX . 'introductions', + ], + ], + [ + 'name' => 'ai-fix-assessments', + 'src' => 'ai-fix-assessments-' . $flat_version, + ], + [ + 'name' => 'introductions', + 'src' => 'introductions-' . $flat_version, + 'deps' => [ self::PREFIX . 'tailwind' ], + ], + [ + 'name' => 'wp-dashboard', + 'src' => 'dashboard-' . $flat_version, + ], + [ + 'name' => 'scoring', + 'src' => 'yst_seo_score-' . $flat_version, + ], + [ + 'name' => 'adminbar', + 'src' => 'adminbar-' . $flat_version, + 'deps' => [ + 'admin-bar', + ], + ], + [ + 'name' => 'primary-category', + 'src' => 'metabox-primary-category-' . $flat_version, + ], + [ + 'name' => 'admin-global', + 'src' => 'admin-global-' . $flat_version, + ], + [ + 'name' => 'extensions', + 'src' => 'yoast-extensions-' . $flat_version, + 'deps' => [ + 'wp-components', + ], + ], + [ + 'name' => 'filter-explanation', + 'src' => 'filter-explanation-' . $flat_version, + ], + [ + 'name' => 'monorepo', + 'src' => 'monorepo-' . $flat_version, + ], + [ + 'name' => 'structured-data-blocks', + 'src' => 'structured-data-blocks-' . $flat_version, + 'deps' => [ + 'dashicons', + 'forms', + 'wp-edit-blocks', + ], + ], + [ + 'name' => 'elementor', + 'src' => 'elementor-' . $flat_version, + ], + [ + 'name' => 'tailwind', + 'src' => 'tailwind-' . $flat_version, + ], + [ + 'name' => 'new-settings', + 'src' => 'new-settings-' . $flat_version, + 'deps' => [ self::PREFIX . 'tailwind' ], + ], + [ + 'name' => 'black-friday-banner', + 'src' => 'black-friday-banner-' . $flat_version, + 'deps' => [ self::PREFIX . 'tailwind' ], + ], + [ + 'name' => 'academy', + 'src' => 'academy-' . $flat_version, + 'deps' => [ self::PREFIX . 'tailwind' ], + ], + [ + 'name' => 'support', + 'src' => 'support-' . $flat_version, + 'deps' => [ self::PREFIX . 'tailwind' ], + ], + [ + 'name' => 'workouts', + 'src' => 'workouts-' . $flat_version, + 'deps' => [ + self::PREFIX . 'monorepo', + ], + ], + [ + 'name' => 'first-time-configuration', + 'src' => 'first-time-configuration-' . $flat_version, + 'deps' => [ self::PREFIX . 'tailwind' ], + ], + [ + 'name' => 'inside-editor', + 'src' => 'inside-editor-' . $flat_version, + ], + ]; + } + + /** + * Determines the URL of the asset. + * + * @param WPSEO_Admin_Asset $asset The asset to determine the URL for. + * @param string $type The type of asset. Usually JS or CSS. + * + * @return string The URL of the asset. + */ + protected function get_url( WPSEO_Admin_Asset $asset, $type ) { + $scheme = wp_parse_url( $asset->get_src(), PHP_URL_SCHEME ); + if ( in_array( $scheme, [ 'http', 'https' ], true ) ) { + return $asset->get_src(); + } + + return $this->asset_location->get_url( $asset, $type ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-admin-asset-seo-location.php b/wp-content/plugins/wordpress-seo/admin/class-admin-asset-seo-location.php new file mode 100644 index 00000000..6774ebd6 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-admin-asset-seo-location.php @@ -0,0 +1,86 @@ +plugin_file = $plugin_file; + $this->add_suffix = $add_suffix; + } + + /** + * Determines the URL of the asset on the dev server. + * + * @param WPSEO_Admin_Asset $asset The asset to determine the URL for. + * @param string $type The type of asset. Usually JS or CSS. + * + * @return string The URL of the asset. + */ + public function get_url( WPSEO_Admin_Asset $asset, $type ) { + $path = $this->get_path( $asset, $type ); + if ( empty( $path ) ) { + return ''; + } + + return plugins_url( $path, $this->plugin_file ); + } + + /** + * Determines the path relative to the plugin folder of an asset. + * + * @param WPSEO_Admin_Asset $asset The asset to determine the path for. + * @param string $type The type of asset. + * + * @return string The path to the asset file. + */ + protected function get_path( WPSEO_Admin_Asset $asset, $type ) { + $relative_path = ''; + $rtl_suffix = ''; + + switch ( $type ) { + case WPSEO_Admin_Asset::TYPE_JS: + $relative_path = 'js/dist/' . $asset->get_src(); + if ( $this->add_suffix ) { + $relative_path .= $asset->get_suffix() . '.js'; + } + break; + + case WPSEO_Admin_Asset::TYPE_CSS: + // Path and suffix for RTL stylesheets. + if ( is_rtl() && $asset->has_rtl() ) { + $rtl_suffix = '-rtl'; + } + $relative_path = 'css/dist/' . $asset->get_src() . $rtl_suffix . $asset->get_suffix() . '.css'; + break; + } + + return $relative_path; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-admin-editor-specific-replace-vars.php b/wp-content/plugins/wordpress-seo/admin/class-admin-editor-specific-replace-vars.php new file mode 100644 index 00000000..781ce099 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-admin-editor-specific-replace-vars.php @@ -0,0 +1,227 @@ + [ 'id', 'pt_single', 'pt_plural', 'parent_title' ], + 'post' => [ 'id', 'term404', 'pt_single', 'pt_plural' ], + // Custom post type. + 'custom_post_type' => [ 'id', 'term404', 'pt_single', 'pt_plural', 'parent_title' ], + // Settings - archive pages. + 'custom-post-type_archive' => [ 'pt_single', 'pt_plural' ], + + // Taxonomies. + 'category' => [ 'term_title', 'term_description', 'category_description', 'parent_title', 'term_hierarchy' ], + 'post_tag' => [ 'term_title', 'term_description', 'tag_description' ], + 'post_format' => [ 'term_title' ], + // Custom taxonomy. + 'term-in-custom-taxonomy' => [ 'term_title', 'term_description', 'category_description', 'parent_title', 'term_hierarchy' ], + + // Settings - special pages. + 'search' => [ 'searchphrase' ], + ]; + + /** + * WPSEO_Admin_Editor_Specific_Replace_Vars constructor. + */ + public function __construct() { + $this->add_for_page_types( + [ 'page', 'post', 'custom_post_type' ], + WPSEO_Custom_Fields::get_custom_fields() + ); + + $this->add_for_page_types( + [ 'post', 'term-in-custom-taxonomy' ], + WPSEO_Custom_Taxonomies::get_custom_taxonomies() + ); + } + + /** + * Retrieves the editor specific replacement variables. + * + * @return array The editor specific replacement variables. + */ + public function get() { + /** + * Filter: Adds the possibility to add extra editor specific replacement variables. + * + * @param array $replacement_variables Array of editor specific replace vars. + */ + $replacement_variables = apply_filters( + 'wpseo_editor_specific_replace_vars', + $this->replacement_variables + ); + + if ( ! is_array( $replacement_variables ) ) { + $replacement_variables = $this->replacement_variables; + } + + return array_filter( $replacement_variables, 'is_array' ); + } + + /** + * Retrieves the generic replacement variable names. + * + * Which are the replacement variables without the editor specific ones. + * + * @param array $replacement_variables Possibly generic replacement variables. + * + * @return array The generic replacement variable names. + */ + public function get_generic( $replacement_variables ) { + $shared_variables = array_diff( + $this->extract_names( $replacement_variables ), + $this->get_unique_replacement_variables() + ); + + return array_values( $shared_variables ); + } + + /** + * Determines the page type of the current term. + * + * @param string $taxonomy The taxonomy name. + * + * @return string The page type. + */ + public function determine_for_term( $taxonomy ) { + $replacement_variables = $this->get(); + if ( array_key_exists( $taxonomy, $replacement_variables ) ) { + return $taxonomy; + } + + return 'term-in-custom-taxonomy'; + } + + /** + * Determines the page type of the current post. + * + * @param WP_Post $post A WordPress post instance. + * + * @return string The page type. + */ + public function determine_for_post( $post ) { + if ( $post instanceof WP_Post === false ) { + return 'post'; + } + + $replacement_variables = $this->get(); + if ( array_key_exists( $post->post_type, $replacement_variables ) ) { + return $post->post_type; + } + + return 'custom_post_type'; + } + + /** + * Determines the page type for a post type. + * + * @param string $post_type The name of the post_type. + * @param string $fallback The page type to fall back to. + * + * @return string The page type. + */ + public function determine_for_post_type( $post_type, $fallback = 'custom_post_type' ) { + if ( ! $this->has_for_page_type( $post_type ) ) { + return $fallback; + } + + return $post_type; + } + + /** + * Determines the page type for an archive page. + * + * @param string $name The name of the archive. + * @param string $fallback The page type to fall back to. + * + * @return string The page type. + */ + public function determine_for_archive( $name, $fallback = 'custom-post-type_archive' ) { + $page_type = $name . '_archive'; + + if ( ! $this->has_for_page_type( $page_type ) ) { + return $fallback; + } + + return $page_type; + } + + /** + * Adds the replavement variables for the given page types. + * + * @param array $page_types Page types to add variables for. + * @param array $replacement_variables_to_add The variables to add. + * + * @return void + */ + protected function add_for_page_types( array $page_types, array $replacement_variables_to_add ) { + if ( empty( $replacement_variables_to_add ) ) { + return; + } + + $replacement_variables_to_add = array_fill_keys( $page_types, $replacement_variables_to_add ); + $replacement_variables = $this->replacement_variables; + + $this->replacement_variables = array_merge_recursive( $replacement_variables, $replacement_variables_to_add ); + } + + /** + * Extracts the names from the given replacements variables. + * + * @param array $replacement_variables Replacement variables to extract the name from. + * + * @return array Extracted names. + */ + protected function extract_names( $replacement_variables ) { + $extracted_names = []; + + foreach ( $replacement_variables as $replacement_variable ) { + if ( empty( $replacement_variable['name'] ) ) { + continue; + } + + $extracted_names[] = $replacement_variable['name']; + } + + return $extracted_names; + } + + /** + * Returns whether the given page type has editor specific replace vars. + * + * @param string $page_type The page type to check. + * + * @return bool True if there are associated editor specific replace vars. + */ + protected function has_for_page_type( $page_type ) { + $replacement_variables = $this->get(); + + return ( ! empty( $replacement_variables[ $page_type ] ) && is_array( $replacement_variables[ $page_type ] ) ); + } + + /** + * Merges all editor specific replacement variables into one array and removes duplicates. + * + * @return array The list of unique editor specific replacement variables. + */ + protected function get_unique_replacement_variables() { + $merged_replacement_variables = call_user_func_array( 'array_merge', array_values( $this->get() ) ); + + return array_unique( $merged_replacement_variables ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-admin-gutenberg-compatibility-notification.php b/wp-content/plugins/wordpress-seo/admin/class-admin-gutenberg-compatibility-notification.php new file mode 100644 index 00000000..8f521de3 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-admin-gutenberg-compatibility-notification.php @@ -0,0 +1,105 @@ +compatibility_checker = new WPSEO_Gutenberg_Compatibility(); + $this->notification_center = Yoast_Notification_Center::get(); + } + + /** + * Registers all hooks to WordPress. + * + * @return void + */ + public function register_hooks() { + add_action( 'admin_init', [ $this, 'manage_notification' ] ); + } + + /** + * Manages if the notification should be shown or removed. + * + * @return void + */ + public function manage_notification() { + /** + * Filter: 'yoast_display_gutenberg_compat_notification' - Allows developer to disable the Gutenberg compatibility + * notification. + * + * @param bool $display_notification + */ + $display_notification = apply_filters( 'yoast_display_gutenberg_compat_notification', true ); + + if ( + ! $this->compatibility_checker->is_installed() + || $this->compatibility_checker->is_fully_compatible() + || ! $display_notification + ) { + $this->notification_center->remove_notification_by_id( $this->notification_id ); + + return; + } + + $this->add_notification(); + } + + /** + * Adds the notification to the notificaton center. + * + * @return void + */ + protected function add_notification() { + $level = $this->compatibility_checker->is_below_minimum() ? Yoast_Notification::ERROR : Yoast_Notification::WARNING; + + $message = sprintf( + /* translators: %1$s expands to Yoast SEO, %2$s expands to the installed version, %3$s expands to Gutenberg */ + __( '%1$s detected you are using version %2$s of %3$s, please update to the latest version to prevent compatibility issues.', 'wordpress-seo' ), + 'Yoast SEO', + $this->compatibility_checker->get_installed_version(), + 'Gutenberg' + ); + + $notification = new Yoast_Notification( + $message, + [ + 'id' => $this->notification_id, + 'type' => $level, + 'priority' => 1, + ] + ); + + $this->notification_center->add_notification( $notification ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-admin-help-panel.php b/wp-content/plugins/wordpress-seo/admin/class-admin-help-panel.php new file mode 100644 index 00000000..6fdb6c2f --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-admin-help-panel.php @@ -0,0 +1,104 @@ +id = $id; + $this->help_button_text = $help_button_text; + $this->help_content = $help_content; + $this->wrapper = $wrapper; + } + + /** + * Returns the html for the Help Button. + * + * @return string + */ + public function get_button_html() { + + if ( ! $this->id || ! $this->help_button_text || ! $this->help_content ) { + return ''; + } + + return sprintf( + ' ', + esc_attr( $this->id ), + $this->help_button_text + ); + } + + /** + * Returns the html for the Help Panel. + * + * @return string + */ + public function get_panel_html() { + + if ( ! $this->id || ! $this->help_button_text || ! $this->help_content ) { + return ''; + } + + $wrapper_start = ''; + $wrapper_end = ''; + + if ( $this->wrapper === 'has-wrapper' ) { + $wrapper_start = '
'; + $wrapper_end = '
'; + } + + return sprintf( + '%1$s

%3$s

%4$s', + $wrapper_start, + esc_attr( $this->id ), + $this->help_content, + $wrapper_end + ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-admin-init.php b/wp-content/plugins/wordpress-seo/admin/class-admin-init.php new file mode 100644 index 00000000..168e789a --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-admin-init.php @@ -0,0 +1,379 @@ +pagenow = $GLOBALS['pagenow']; + + $this->asset_manager = new WPSEO_Admin_Asset_Manager(); + + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_dismissible' ] ); + add_action( 'admin_init', [ $this, 'unsupported_php_notice' ], 15 ); + add_action( 'admin_init', [ $this, 'remove_translations_notification' ], 15 ); + add_action( 'admin_init', [ $this->asset_manager, 'register_assets' ] ); + add_action( 'admin_init', [ $this, 'show_hook_deprecation_warnings' ] ); + add_action( 'admin_init', [ 'WPSEO_Plugin_Conflict', 'hook_check_for_plugin_conflicts' ] ); + add_action( 'admin_notices', [ $this, 'permalink_settings_notice' ] ); + add_action( 'post_submitbox_misc_actions', [ $this, 'add_publish_box_section' ] ); + + $this->load_meta_boxes(); + $this->load_taxonomy_class(); + $this->load_admin_page_class(); + $this->load_admin_user_class(); + $this->load_xml_sitemaps_admin(); + $this->load_plugin_suggestions(); + } + + /** + * Enqueue our styling for dismissible yoast notifications. + * + * @return void + */ + public function enqueue_dismissible() { + $this->asset_manager->enqueue_style( 'dismissible' ); + } + + /** + * Removes any notification for incomplete translations. + * + * @return void + */ + public function remove_translations_notification() { + $notification_center = Yoast_Notification_Center::get(); + $notification_center->remove_notification_by_id( 'i18nModuleTranslationAssistance' ); + } + + /** + * Creates an unsupported PHP version notification in the notification center. + * + * @return void + */ + public function unsupported_php_notice() { + $notification_center = Yoast_Notification_Center::get(); + $notification_center->remove_notification_by_id( 'wpseo-dismiss-unsupported-php' ); + } + + /** + * Gets the latest released major WordPress version from the WordPress stable-check api. + * + * @return float|int The latest released major WordPress version. 0 when the stable-check API doesn't respond. + */ + private function get_latest_major_wordpress_version() { + $core_updates = get_core_updates( [ 'dismissed' => true ] ); + + if ( $core_updates === false ) { + return 0; + } + + $wp_version_latest = get_bloginfo( 'version' ); + foreach ( $core_updates as $update ) { + if ( $update->response === 'upgrade' && version_compare( $update->version, $wp_version_latest, '>' ) ) { + $wp_version_latest = $update->version; + } + } + + // Strip the patch version and convert to a float. + return (float) $wp_version_latest; + } + + /** + * Helper to verify if the user is currently visiting one of our admin pages. + * + * @return bool + */ + private function on_wpseo_admin_page() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + if ( ! isset( $_GET['page'] ) || ! is_string( $_GET['page'] ) ) { + return false; + } + + if ( $this->pagenow !== 'admin.php' ) { + return false; + } + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + $current_page = sanitize_text_field( wp_unslash( $_GET['page'] ) ); + return strpos( $current_page, 'wpseo' ) === 0; + } + + /** + * Whether we should load the meta box classes. + * + * @return bool true if we should load the meta box classes, false otherwise. + */ + private function should_load_meta_boxes() { + /** + * Filter: 'wpseo_always_register_metaboxes_on_admin' - Allow developers to change whether + * the WPSEO metaboxes are only registered on the typical pages (lean loading) or always + * registered when in admin. + * + * @param bool $register_metaboxes Whether to always register the metaboxes or not. Defaults to false. + */ + if ( apply_filters( 'wpseo_always_register_metaboxes_on_admin', false ) ) { + return true; + } + + // If we are in a post editor. + if ( WPSEO_Metabox::is_post_overview( $this->pagenow ) || WPSEO_Metabox::is_post_edit( $this->pagenow ) ) { + return true; + } + + // If we are doing an inline save. + if ( check_ajax_referer( 'inlineeditnonce', '_inline_edit', false ) && isset( $_POST['action'] ) && sanitize_text_field( wp_unslash( $_POST['action'] ) ) === 'inline-save' ) { + return true; + } + + return false; + } + + /** + * Determine whether we should load the meta box class and if so, load it. + * + * @return void + */ + private function load_meta_boxes() { + if ( $this->should_load_meta_boxes() ) { + $GLOBALS['wpseo_metabox'] = new WPSEO_Metabox(); + $GLOBALS['wpseo_meta_columns'] = new WPSEO_Meta_Columns(); + } + } + + /** + * Determine if we should load our taxonomy edit class and if so, load it. + * + * @return void + */ + private function load_taxonomy_class() { + if ( + WPSEO_Taxonomy::is_term_edit( $this->pagenow ) + || WPSEO_Taxonomy::is_term_overview( $this->pagenow ) + ) { + new WPSEO_Taxonomy(); + } + } + + /** + * Determine if we should load our admin pages class and if so, load it. + * + * Loads admin page class for all admin pages starting with `wpseo_`. + * + * @return void + */ + private function load_admin_user_class() { + if ( in_array( $this->pagenow, [ 'user-edit.php', 'profile.php' ], true ) + && current_user_can( 'edit_users' ) + ) { + new WPSEO_Admin_User_Profile(); + } + } + + /** + * Determine if we should load our admin pages class and if so, load it. + * + * Loads admin page class for all admin pages starting with `wpseo_`. + * + * @return void + */ + private function load_admin_page_class() { + + if ( $this->on_wpseo_admin_page() ) { + // For backwards compatabilty, this still needs a global, for now... + $GLOBALS['wpseo_admin_pages'] = new WPSEO_Admin_Pages(); + + $page = null; + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + if ( isset( $_GET['page'] ) && is_string( $_GET['page'] ) ) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + $page = sanitize_text_field( wp_unslash( $_GET['page'] ) ); + } + + // Only renders Yoast SEO Premium upsells when the page is a Yoast SEO page. + if ( $page !== null && WPSEO_Utils::is_yoast_seo_free_page( $page ) ) { + $this->register_premium_upsell_admin_block(); + } + } + } + + /** + * Loads the plugin suggestions. + * + * @return void + */ + private function load_plugin_suggestions() { + $suggestions = new WPSEO_Suggested_Plugins( new WPSEO_Plugin_Availability(), Yoast_Notification_Center::get() ); + $suggestions->register_hooks(); + } + + /** + * Registers the Premium Upsell Admin Block. + * + * @return void + */ + private function register_premium_upsell_admin_block() { + if ( ! YoastSEO()->helpers->product->is_premium() ) { + $upsell_block = new WPSEO_Premium_Upsell_Admin_Block( 'wpseo_admin_promo_footer' ); + $upsell_block->register_hooks(); + } + } + + /** + * See if we should start our XML Sitemaps Admin class. + * + * @return void + */ + private function load_xml_sitemaps_admin() { + if ( WPSEO_Options::get( 'enable_xml_sitemap', false ) ) { + new WPSEO_Sitemaps_Admin(); + } + } + + /** + * Shows deprecation warnings to the user if a plugin has registered a filter we have deprecated. + * + * @return void + */ + public function show_hook_deprecation_warnings() { + global $wp_filter; + + if ( wp_doing_ajax() ) { + return; + } + + // WordPress hooks that have been deprecated since a Yoast SEO version. + $deprecated_filters = [ + 'wpseo_genesis_force_adjacent_rel_home' => [ + 'version' => '9.4', + 'alternative' => null, + ], + 'wpseo_opengraph' => [ + 'version' => '14.0', + 'alternative' => null, + ], + 'wpseo_twitter' => [ + 'version' => '14.0', + 'alternative' => null, + ], + 'wpseo_twitter_taxonomy_image' => [ + 'version' => '14.0', + 'alternative' => null, + ], + 'wpseo_twitter_metatag_key' => [ + 'version' => '14.0', + 'alternative' => null, + ], + 'wp_seo_get_bc_ancestors' => [ + 'version' => '14.0', + 'alternative' => 'wpseo_breadcrumb_links', + ], + 'validate_facebook_app_id_api_response_code' => [ + 'version' => '15.5', + 'alternative' => null, + ], + 'validate_facebook_app_id_api_response_body' => [ + 'version' => '15.5', + 'alternative' => null, + ], + ]; + + // Determine which filters have been registered. + $deprecated_notices = array_intersect( + array_keys( $deprecated_filters ), + array_keys( $wp_filter ) + ); + + // Show notice for each deprecated filter or action that has been registered. + foreach ( $deprecated_notices as $deprecated_filter ) { + $deprecation_info = $deprecated_filters[ $deprecated_filter ]; + // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped -- Only uses the hardcoded values from above. + _deprecated_hook( + $deprecated_filter, + 'WPSEO ' . $deprecation_info['version'], + $deprecation_info['alternative'] + ); + // phpcs:enable + } + } + + /** + * Check if the permalink uses %postname%. + * + * @return bool + */ + private function has_postname_in_permalink() { + return ( strpos( get_option( 'permalink_structure' ), '%postname%' ) !== false ); + } + + /** + * Shows a notice on the permalink settings page. + * + * @return void + */ + public function permalink_settings_notice() { + global $pagenow; + + if ( $pagenow === 'options-permalink.php' ) { + printf( + '

%1$s
%2$s
%4$s

', + esc_html__( 'WARNING:', 'wordpress-seo' ), + sprintf( + /* translators: %1$s and %2$s expand to items to emphasize the word in the middle. */ + esc_html__( 'Changing your permalinks settings can seriously impact your search engine visibility. It should almost %1$s never %2$s be done on a live website.', 'wordpress-seo' ), + '', + '' + ), + esc_url( WPSEO_Shortlinker::get( 'https://yoa.st/why-permalinks/' ) ), + // The link's content. + esc_html__( 'Learn about why permalinks are important for SEO.', 'wordpress-seo' ) + ); + } + } + + /** + * Adds a custom Yoast section within the Classic Editor publish box. + * + * @param WP_Post $post The current post object. + * + * @return void + */ + public function add_publish_box_section( $post ) { + if ( in_array( $this->pagenow, [ 'post.php', 'post-new.php' ], true ) ) { + ?> +
+ [ 'sitename', 'title', 'sep', 'primary_category' ], + 'post' => [ 'sitename', 'title', 'sep', 'primary_category' ], + // Homepage. + 'homepage' => [ 'sitename', 'sitedesc', 'sep' ], + // Custom post type. + 'custom_post_type' => [ 'sitename', 'title', 'sep' ], + + // Taxonomies. + 'category' => [ 'sitename', 'term_title', 'sep', 'term_hierarchy' ], + 'post_tag' => [ 'sitename', 'term_title', 'sep' ], + 'post_format' => [ 'sitename', 'term_title', 'sep', 'page' ], + + // Custom taxonomy. + 'term-in-custom-taxonomy' => [ 'sitename', 'term_title', 'sep', 'term_hierarchy' ], + + // Settings - archive pages. + 'author_archive' => [ 'sitename', 'title', 'sep', 'page' ], + 'date_archive' => [ 'sitename', 'sep', 'date', 'page' ], + 'custom-post-type_archive' => [ 'sitename', 'title', 'sep', 'page' ], + + // Settings - special pages. + 'search' => [ 'sitename', 'searchphrase', 'sep', 'page' ], + '404' => [ 'sitename', 'sep' ], + ]; + + /** + * Determines the page type of the current term. + * + * @param string $taxonomy The taxonomy name. + * + * @return string The page type. + */ + public function determine_for_term( $taxonomy ) { + $recommended_replace_vars = $this->get_recommended_replacevars(); + if ( array_key_exists( $taxonomy, $recommended_replace_vars ) ) { + return $taxonomy; + } + + return 'term-in-custom-taxonomy'; + } + + /** + * Determines the page type of the current post. + * + * @param WP_Post $post A WordPress post instance. + * + * @return string The page type. + */ + public function determine_for_post( $post ) { + if ( $post instanceof WP_Post === false ) { + return 'post'; + } + + if ( $post->post_type === 'page' && $this->is_homepage( $post ) ) { + return 'homepage'; + } + + $recommended_replace_vars = $this->get_recommended_replacevars(); + if ( array_key_exists( $post->post_type, $recommended_replace_vars ) ) { + return $post->post_type; + } + + return 'custom_post_type'; + } + + /** + * Determines the page type for a post type. + * + * @param string $post_type The name of the post_type. + * @param string $fallback The page type to fall back to. + * + * @return string The page type. + */ + public function determine_for_post_type( $post_type, $fallback = 'custom_post_type' ) { + $page_type = $post_type; + $recommended_replace_vars = $this->get_recommended_replacevars(); + $has_recommended_replacevars = $this->has_recommended_replace_vars( $recommended_replace_vars, $page_type ); + + if ( ! $has_recommended_replacevars ) { + return $fallback; + } + + return $page_type; + } + + /** + * Determines the page type for an archive page. + * + * @param string $name The name of the archive. + * @param string $fallback The page type to fall back to. + * + * @return string The page type. + */ + public function determine_for_archive( $name, $fallback = 'custom-post-type_archive' ) { + $page_type = $name . '_archive'; + $recommended_replace_vars = $this->get_recommended_replacevars(); + $has_recommended_replacevars = $this->has_recommended_replace_vars( $recommended_replace_vars, $page_type ); + + if ( ! $has_recommended_replacevars ) { + return $fallback; + } + + return $page_type; + } + + /** + * Retrieves the recommended replacement variables for the given page type. + * + * @param string $page_type The page type. + * + * @return array The recommended replacement variables. + */ + public function get_recommended_replacevars_for( $page_type ) { + $recommended_replace_vars = $this->get_recommended_replacevars(); + $has_recommended_replace_vars = $this->has_recommended_replace_vars( $recommended_replace_vars, $page_type ); + + if ( ! $has_recommended_replace_vars ) { + return []; + } + + return $recommended_replace_vars[ $page_type ]; + } + + /** + * Retrieves the recommended replacement variables. + * + * @return array The recommended replacement variables. + */ + public function get_recommended_replacevars() { + /** + * Filter: Adds the possibility to add extra recommended replacement variables. + * + * @param array $additional_replace_vars Empty array to add the replacevars to. + */ + $recommended_replace_vars = apply_filters( 'wpseo_recommended_replace_vars', $this->recommended_replace_vars ); + + if ( ! is_array( $recommended_replace_vars ) ) { + return $this->recommended_replace_vars; + } + + return $recommended_replace_vars; + } + + /** + * Returns whether the given page type has recommended replace vars. + * + * @param array $recommended_replace_vars The recommended replace vars + * to check in. + * @param string $page_type The page type to check. + * + * @return bool True if there are associated recommended replace vars. + */ + private function has_recommended_replace_vars( $recommended_replace_vars, $page_type ) { + if ( ! isset( $recommended_replace_vars[ $page_type ] ) ) { + return false; + } + + if ( ! is_array( $recommended_replace_vars[ $page_type ] ) ) { + return false; + } + + return true; + } + + /** + * Determines whether or not a post is the homepage. + * + * @param WP_Post $post The WordPress global post object. + * + * @return bool True if the given post is the homepage. + */ + private function is_homepage( $post ) { + if ( $post instanceof WP_Post === false ) { + return false; + } + + /* + * The page on front returns a string with normal WordPress interaction, while the post ID is an int. + * This way we make sure we always compare strings. + */ + $post_id = (int) $post->ID; + $page_on_front = (int) get_option( 'page_on_front' ); + + return get_option( 'show_on_front' ) === 'page' && $page_on_front === $post_id; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-admin-user-profile.php b/wp-content/plugins/wordpress-seo/admin/class-admin-user-profile.php new file mode 100644 index 00000000..ceb23520 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-admin-user-profile.php @@ -0,0 +1,87 @@ +%s', + $install_url, + $plugin['title'] + ); + } + + /** + * Gets a visually hidden accessible message for links that open in a new browser tab. + * + * @return string The visually hidden accessible message. + */ + public static function get_new_tab_message() { + return sprintf( + '%s', + /* translators: Hidden accessibility text. */ + esc_html__( '(Opens in a new browser tab)', 'wordpress-seo' ) + ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-admin.php b/wp-content/plugins/wordpress-seo/admin/class-admin.php new file mode 100644 index 00000000..a5d09b29 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-admin.php @@ -0,0 +1,403 @@ +register_hooks(); + + if ( is_multisite() ) { + WPSEO_Options::maybe_set_multisite_defaults( false ); + } + + if ( WPSEO_Options::get( 'stripcategorybase' ) === true ) { + add_action( 'created_category', [ $this, 'schedule_rewrite_flush' ] ); + add_action( 'edited_category', [ $this, 'schedule_rewrite_flush' ] ); + add_action( 'delete_category', [ $this, 'schedule_rewrite_flush' ] ); + } + + if ( WPSEO_Options::get( 'disable-attachment' ) === true ) { + add_filter( 'wpseo_accessible_post_types', [ 'WPSEO_Post_Type', 'filter_attachment_post_type' ] ); + } + + add_filter( 'plugin_action_links_' . WPSEO_BASENAME, [ $this, 'add_action_link' ], 10, 2 ); + add_filter( 'network_admin_plugin_action_links_' . WPSEO_BASENAME, [ $this, 'add_action_link' ], 10, 2 ); + + add_action( 'admin_enqueue_scripts', [ $this, 'config_page_scripts' ] ); + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_global_style' ] ); + + add_action( 'after_switch_theme', [ $this, 'switch_theme' ] ); + add_action( 'switch_theme', [ $this, 'switch_theme' ] ); + + add_filter( 'set-screen-option', [ $this, 'save_bulk_edit_options' ], 10, 3 ); + + add_action( 'admin_init', [ 'WPSEO_Plugin_Conflict', 'hook_check_for_plugin_conflicts' ], 10, 1 ); + + add_action( 'admin_init', [ $this, 'map_manage_options_cap' ] ); + + WPSEO_Sitemaps_Cache::register_clear_on_option_update( 'wpseo' ); + WPSEO_Sitemaps_Cache::register_clear_on_option_update( 'home' ); + + if ( YoastSEO()->helpers->current_page->is_yoast_seo_page() ) { + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); + } + + $this->set_upsell_notice(); + + $this->initialize_cornerstone_content(); + + if ( WPSEO_Utils::is_plugin_network_active() ) { + $integrations[] = new Yoast_Network_Admin(); + } + + $this->admin_features = [ + 'dashboard_widget' => new Yoast_Dashboard_Widget(), + 'wincher_dashboard_widget' => new Wincher_Dashboard_Widget(), + ]; + + if ( WPSEO_Metabox::is_post_overview( $pagenow ) || WPSEO_Metabox::is_post_edit( $pagenow ) ) { + $this->admin_features['primary_category'] = new WPSEO_Primary_Term_Admin(); + } + + $integrations[] = new WPSEO_Yoast_Columns(); + $integrations[] = new WPSEO_Statistic_Integration(); + $integrations[] = new WPSEO_Capability_Manager_Integration( WPSEO_Capability_Manager_Factory::get() ); + $integrations[] = new WPSEO_Admin_Gutenberg_Compatibility_Notification(); + $integrations[] = new WPSEO_Expose_Shortlinks(); + $integrations[] = new WPSEO_MyYoast_Proxy(); + $integrations[] = new WPSEO_Schema_Person_Upgrade_Notification(); + $integrations[] = new WPSEO_Tracking( 'https://tracking.yoast.com/stats', ( WEEK_IN_SECONDS * 2 ) ); + $integrations[] = new WPSEO_Admin_Settings_Changed_Listener(); + + $integrations = array_merge( + $integrations, + $this->get_admin_features(), + $this->initialize_cornerstone_content() + ); + + foreach ( $integrations as $integration ) { + $integration->register_hooks(); + } + } + + /** + * Schedules a rewrite flush to happen at shutdown. + * + * @return void + */ + public function schedule_rewrite_flush() { + // Bail if this is a multisite installation and the site has been switched. + if ( is_multisite() && ms_is_switched() ) { + return; + } + + add_action( 'shutdown', 'flush_rewrite_rules' ); + } + + /** + * Returns all the classes for the admin features. + * + * @return array + */ + public function get_admin_features() { + return $this->admin_features; + } + + /** + * Register assets needed on admin pages. + * + * @return void + */ + public function enqueue_assets() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form data. + $page = isset( $_GET['page'] ) && is_string( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : ''; + if ( $page === 'wpseo_licenses' ) { + $asset_manager = new WPSEO_Admin_Asset_Manager(); + $asset_manager->enqueue_style( 'extensions' ); + } + } + + /** + * Returns the manage_options capability. + * + * @return string The capability to use. + */ + public function get_manage_options_cap() { + /** + * Filter: 'wpseo_manage_options_capability' - Allow changing the capability users need to view the settings pages. + * + * @param string $capability The capability. + */ + return apply_filters( 'wpseo_manage_options_capability', 'wpseo_manage_options' ); + } + + /** + * Maps the manage_options cap on saving an options page to wpseo_manage_options. + * + * @return void + */ + public function map_manage_options_cap() { + // phpcs:ignore WordPress.Security -- The variable is only used in strpos and thus safe to not unslash or sanitize. + $option_page = ! empty( $_POST['option_page'] ) ? $_POST['option_page'] : ''; + + if ( strpos( $option_page, 'yoast_wpseo' ) === 0 || strpos( $option_page, Settings_Integration::PAGE ) === 0 ) { + add_filter( 'option_page_capability_' . $option_page, [ $this, 'get_manage_options_cap' ] ); + } + } + + /** + * Adds the ability to choose how many posts are displayed per page + * on the bulk edit pages. + * + * @return void + */ + public function bulk_edit_options() { + $option = 'per_page'; + $args = [ + 'label' => __( 'Posts', 'wordpress-seo' ), + 'default' => 10, + 'option' => 'wpseo_posts_per_page', + ]; + add_screen_option( $option, $args ); + } + + /** + * Saves the posts per page limit for bulk edit pages. + * + * @param int $status Status value to pass through. + * @param string $option Option name. + * @param int $value Count value to check. + * + * @return int + */ + public function save_bulk_edit_options( $status, $option, $value ) { + if ( $option && ( $value > 0 && $value < 1000 ) === 'wpseo_posts_per_page' ) { + return $value; + } + + return $status; + } + + /** + * Adds links to Premium Support and FAQ under the plugin in the plugin overview page. + * + * @param array $links Array of links for the plugins, adapted when the current plugin is found. + * @param string $file The filename for the current plugin, which the filter loops through. + * + * @return array + */ + public function add_action_link( $links, $file ) { + $first_time_configuration_notice_helper = YoastSEO()->helpers->first_time_configuration_notice; + + if ( $file === WPSEO_BASENAME && WPSEO_Capability_Utils::current_user_can( 'wpseo_manage_options' ) ) { + if ( is_network_admin() ) { + $settings_url = network_admin_url( 'admin.php?page=' . self::PAGE_IDENTIFIER ); + } + else { + $settings_url = admin_url( 'admin.php?page=' . self::PAGE_IDENTIFIER ); + } + $settings_link = '' . __( 'Settings', 'wordpress-seo' ) . ''; + array_unshift( $links, $settings_link ); + } + + // Add link to docs. + $faq_link = '' . __( 'FAQ', 'wordpress-seo' ) . ''; + array_unshift( $links, $faq_link ); + + if ( $first_time_configuration_notice_helper->first_time_configuration_not_finished() && ! is_network_admin() ) { + $configuration_title = ( ! $first_time_configuration_notice_helper->should_show_alternate_message() ) ? 'first-time configuration' : 'SEO configuration'; + /* translators: CTA to finish the first time configuration. %s: Either first-time SEO configuration or SEO configuration. */ + $message = sprintf( __( 'Finish your %s', 'wordpress-seo' ), $configuration_title ); + $ftc_link = '' . $message . ''; + array_unshift( $links, $ftc_link ); + } + + $addon_manager = new WPSEO_Addon_Manager(); + if ( YoastSEO()->helpers->product->is_premium() ) { + + // Remove Free 'deactivate' link if Premium is active as well. We don't want users to deactivate Free when Premium is active. + unset( $links['deactivate'] ); + $no_deactivation_explanation = '' . sprintf( + /* translators: %s expands to Yoast SEO Premium. */ + __( 'Required by %s', 'wordpress-seo' ), + 'Yoast SEO Premium' + ) . ''; + + array_unshift( $links, $no_deactivation_explanation ); + + if ( $addon_manager->has_valid_subscription( WPSEO_Addon_Manager::PREMIUM_SLUG ) ) { + return $links; + } + + // Add link to where premium can be activated. + $activation_link = '' . __( 'Activate your subscription', 'wordpress-seo' ) . ''; + array_unshift( $links, $activation_link ); + + return $links; + } + + // Add link to premium landing page. + $premium_link = '' . __( 'Get Premium', 'wordpress-seo' ) . ''; + array_unshift( $links, $premium_link ); + + return $links; + } + + /** + * Enqueues the (tiny) global JS needed for the plugin. + * + * @return void + */ + public function config_page_scripts() { + $asset_manager = new WPSEO_Admin_Asset_Manager(); + $asset_manager->enqueue_script( 'admin-global' ); + $asset_manager->localize_script( 'admin-global', 'wpseoAdminGlobalL10n', $this->localize_admin_global_script() ); + } + + /** + * Enqueues the (tiny) global stylesheet needed for the plugin. + * + * @return void + */ + public function enqueue_global_style() { + $asset_manager = new WPSEO_Admin_Asset_Manager(); + $asset_manager->enqueue_style( 'admin-global' ); + } + + /** + * Filter the $contactmethods array and add a set of social profiles. + * + * These are used with the Facebook author, rel="author" and Twitter cards implementation. + * + * @deprecated 22.6 + * @codeCoverageIgnore + * + * @param array $contactmethods Currently set contactmethods. + * + * @return array Contactmethods with added contactmethods. + */ + public function update_contactmethods( $contactmethods ) { + _deprecated_function( __METHOD__, 'Yoast SEO 22.6' ); + + $contactmethods['facebook'] = __( 'Facebook profile URL', 'wordpress-seo' ); + $contactmethods['instagram'] = __( 'Instagram profile URL', 'wordpress-seo' ); + $contactmethods['linkedin'] = __( 'LinkedIn profile URL', 'wordpress-seo' ); + $contactmethods['myspace'] = __( 'MySpace profile URL', 'wordpress-seo' ); + $contactmethods['pinterest'] = __( 'Pinterest profile URL', 'wordpress-seo' ); + $contactmethods['soundcloud'] = __( 'SoundCloud profile URL', 'wordpress-seo' ); + $contactmethods['tumblr'] = __( 'Tumblr profile URL', 'wordpress-seo' ); + $contactmethods['twitter'] = __( 'X username (without @)', 'wordpress-seo' ); + $contactmethods['youtube'] = __( 'YouTube profile URL', 'wordpress-seo' ); + $contactmethods['wikipedia'] = __( 'Wikipedia page about you', 'wordpress-seo' ) . '
' . __( '(if one exists)', 'wordpress-seo' ) . ''; + + return $contactmethods; + } + + /** + * Log the updated timestamp for user profiles when theme is changed. + * + * @return void + */ + public function switch_theme() { + + $users = get_users( [ 'capability' => [ 'edit_posts' ] ] ); + + if ( is_array( $users ) && $users !== [] ) { + foreach ( $users as $user ) { + update_user_meta( $user->ID, '_yoast_wpseo_profile_updated', time() ); + } + } + } + + /** + * Localization for the dismiss urls. + * + * @return array + */ + private function localize_admin_global_script() { + return array_merge( + [ + 'isRtl' => is_rtl(), + 'variable_warning' => sprintf( + /* translators: %1$s: '%%term_title%%' variable used in titles and meta's template that's not compatible with the given template, %2$s: expands to 'HelpScout beacon' */ + __( 'Warning: the variable %1$s cannot be used in this template. See the %2$s for more info.', 'wordpress-seo' ), + '%s', + 'HelpScout beacon' + ), + /* translators: %s: expends to Yoast SEO */ + 'help_video_iframe_title' => sprintf( __( '%s video tutorial', 'wordpress-seo' ), 'Yoast SEO' ), + 'scrollable_table_hint' => __( 'Scroll to see the table content.', 'wordpress-seo' ), + 'wincher_is_logged_in' => WPSEO_Options::get( 'wincher_integration_active', true ) ? YoastSEO()->helpers->wincher->login_status() : false, + ], + YoastSEO()->helpers->wincher->get_admin_global_links() + ); + } + + /** + * Sets the upsell notice. + * + * @return void + */ + protected function set_upsell_notice() { + $upsell = new WPSEO_Product_Upsell_Notice(); + $upsell->dismiss_notice_listener(); + $upsell->initialize(); + } + + /** + * Whether we are on the admin dashboard page. + * + * @return bool + */ + protected function on_dashboard_page() { + return $GLOBALS['pagenow'] === 'index.php'; + } + + /** + * Loads the cornerstone filter. + * + * @return WPSEO_WordPress_Integration[] The integrations to initialize. + */ + protected function initialize_cornerstone_content() { + if ( ! WPSEO_Options::get( 'enable_cornerstone_content' ) ) { + return []; + } + + return [ + 'cornerstone_filter' => new WPSEO_Cornerstone_Filter(), + ]; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-asset.php b/wp-content/plugins/wordpress-seo/admin/class-asset.php new file mode 100644 index 00000000..8cbf0c1f --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-asset.php @@ -0,0 +1,255 @@ + [], + 'in_footer' => true, + 'rtl' => true, + 'media' => 'all', + 'version' => '', + 'suffix' => '', + ]; + + /** + * Constructs an instance of the WPSEO_Admin_Asset class. + * + * @param array $args The arguments for this asset. + * + * @throws InvalidArgumentException Throws when no name or src has been provided. + */ + public function __construct( array $args ) { + if ( ! isset( $args['name'] ) ) { + throw new InvalidArgumentException( 'name is a required argument' ); + } + + if ( ! isset( $args['src'] ) ) { + throw new InvalidArgumentException( 'src is a required argument' ); + } + + $args = array_merge( $this->defaults, $args ); + + $this->name = $args['name']; + $this->src = $args['src']; + $this->deps = $args['deps']; + $this->version = $args['version']; + $this->media = $args['media']; + $this->in_footer = $args['in_footer']; + $this->rtl = $args['rtl']; + $this->suffix = $args['suffix']; + } + + /** + * Returns the asset identifier. + * + * @return string + */ + public function get_name() { + return $this->name; + } + + /** + * Returns the path to the asset. + * + * @return string + */ + public function get_src() { + return $this->src; + } + + /** + * Returns the asset dependencies. + * + * @return array|string + */ + public function get_deps() { + return $this->deps; + } + + /** + * Returns the asset version. + * + * @return string|null + */ + public function get_version() { + if ( ! empty( $this->version ) ) { + return $this->version; + } + + return null; + } + + /** + * Returns the media type for CSS assets. + * + * @return string + */ + public function get_media() { + return $this->media; + } + + /** + * Returns whether a script asset should be loaded in the footer of the page. + * + * @return bool + */ + public function is_in_footer() { + return $this->in_footer; + } + + /** + * Returns whether this CSS has a RTL counterpart. + * + * @return bool + */ + public function has_rtl() { + return $this->rtl; + } + + /** + * Returns the file suffix. + * + * @return string + */ + public function get_suffix() { + return $this->suffix; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-bulk-description-editor-list-table.php b/wp-content/plugins/wordpress-seo/admin/class-bulk-description-editor-list-table.php new file mode 100644 index 00000000..3b65304b --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-bulk-description-editor-list-table.php @@ -0,0 +1,80 @@ + 'wpseo_bulk_description', + 'plural' => 'wpseo_bulk_descriptions', + 'ajax' => true, + ]; + + /** + * The field in the database where meta field is saved. + * + * @var string + */ + protected $target_db_field = 'metadesc'; + + /** + * The columns shown on the table. + * + * @return array + */ + public function get_columns() { + $columns = [ + 'col_existing_yoast_seo_metadesc' => __( 'Existing Yoast Meta Description', 'wordpress-seo' ), + 'col_new_yoast_seo_metadesc' => __( 'New Yoast Meta Description', 'wordpress-seo' ), + ]; + + return $this->merge_columns( $columns ); + } + + /** + * Parse the metadescription. + * + * @param string $column_name Column name. + * @param object $record Data object. + * @param string $attributes HTML attributes. + * + * @return string + */ + protected function parse_page_specific_column( $column_name, $record, $attributes ) { + switch ( $column_name ) { + case 'col_new_yoast_seo_metadesc': + return sprintf( + '', + esc_attr( 'wpseo-new-metadesc-' . $record->ID ), + esc_attr( $record->ID ) + ); + + case 'col_existing_yoast_seo_metadesc': + // @todo Inconsistent return/echo behavior R. + // I traced the escaping of the attributes to WPSEO_Bulk_List_Table::column_attributes. Alexander. + // The output of WPSEO_Bulk_List_Table::parse_meta_data_field is properly escaped. + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo $this->parse_meta_data_field( $record->ID, $attributes ); + break; + } + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-bulk-editor-list-table.php b/wp-content/plugins/wordpress-seo/admin/class-bulk-editor-list-table.php new file mode 100644 index 00000000..6c5b0798 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-bulk-editor-list-table.php @@ -0,0 +1,1049 @@ +page_type) there will be constructed an url part, for subpages and + * navigation. + * + * @var string + */ + protected $page_url; + + /** + * The settings which will be used in the __construct. + * + * @var array + */ + protected $settings; + + /** + * Holds the pagination config. + * + * @var array + */ + protected $pagination = []; + + /** + * Holds the sanitized data from the user input. + * + * @var array + */ + protected $input_fields = []; + + /** + * The field in the database where meta field is saved. + * + * Should be set in the child class. + * + * @var string + */ + protected $target_db_field = ''; + + /** + * Class constructor. + * + * @param array $args The arguments. + */ + public function __construct( $args = [] ) { + parent::__construct( $this->settings ); + + $args = wp_parse_args( + $args, + [ + 'nonce' => '', + 'input_fields' => [], + ] + ); + + $this->input_fields = $args['input_fields']; + if ( isset( $_SERVER['REQUEST_URI'] ) ) { + $this->request_url = sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ); + } + + $this->current_page = ( ! empty( $this->input_fields['paged'] ) ) ? $this->input_fields['paged'] : 1; + $this->current_filter = ( ! empty( $this->input_fields['post_type_filter'] ) ) ? $this->input_fields['post_type_filter'] : 1; + $this->current_status = ( ! empty( $this->input_fields['post_status'] ) ) ? $this->input_fields['post_status'] : 1; + $this->current_order = [ + 'order' => ( ! empty( $this->input_fields['order'] ) ) ? $this->input_fields['order'] : 'asc', + 'orderby' => ( ! empty( $this->input_fields['orderby'] ) ) ? $this->input_fields['orderby'] : 'post_title', + ]; + + $this->nonce = $args['nonce']; + $this->page_url = "&nonce={$this->nonce}&type={$this->page_type}#top#{$this->page_type}"; + + $this->populate_editable_post_types(); + } + + /** + * Prepares the data and renders the page. + * + * @return void + */ + public function show_page() { + $this->prepare_page_navigation(); + $this->prepare_items(); + + $this->views(); + $this->display(); + } + + /** + * Used in the constructor to build a reference list of post types the current user can edit. + * + * @return void + */ + protected function populate_editable_post_types() { + $post_types = get_post_types( + [ + 'public' => true, + 'exclude_from_search' => false, + ], + 'object' + ); + + $this->all_posts = []; + $this->own_posts = []; + + if ( is_array( $post_types ) && $post_types !== [] ) { + foreach ( $post_types as $post_type ) { + if ( ! current_user_can( $post_type->cap->edit_posts ) ) { + continue; + } + + if ( current_user_can( $post_type->cap->edit_others_posts ) ) { + $this->all_posts[] = esc_sql( $post_type->name ); + } + else { + $this->own_posts[] = esc_sql( $post_type->name ); + } + } + } + } + + /** + * Will show the navigation for the table like page navigation and page filter. + * + * @param string $which Table nav location (such as top). + * + * @return void + */ + public function display_tablenav( $which ) { + // phpcs:disable WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + $post_status = isset( $_GET['post_status'] ) && is_string( $_GET['post_status'] ) ? sanitize_text_field( wp_unslash( $_GET['post_status'] ) ) : ''; + $order_by = isset( $_GET['orderby'] ) && is_string( $_GET['orderby'] ) ? sanitize_text_field( wp_unslash( $_GET['orderby'] ) ) : ''; + $order = isset( $_GET['order'] ) && is_string( $_GET['order'] ) ? sanitize_text_field( wp_unslash( $_GET['order'] ) ) : ''; + $post_type_filter = isset( $_GET['post_type_filter'] ) && is_string( $_GET['post_type_filter'] ) ? sanitize_text_field( wp_unslash( $_GET['post_type_filter'] ) ) : ''; + // phpcs:enable WordPress.Security.NonceVerification.Recommended; + ?> +
+ + +
+ + + + + + + + + + + + + extra_tablenav( $which ); + $this->pagination( $which ); + ?> + +
+ +
+ +
+ + prepare(), + * passing the current user_id in as the first parameter. + */ + public function get_base_subquery() { + global $wpdb; + + $all_posts_string = "'" . implode( "', '", $this->all_posts ) . "'"; + $own_posts_string = "'" . implode( "', '", $this->own_posts ) . "'"; + + $post_author = esc_sql( (int) get_current_user_id() ); + + $subquery = "( + SELECT * + FROM {$wpdb->posts} + WHERE post_type IN ({$all_posts_string}) + UNION ALL + SELECT * + FROM {$wpdb->posts} + WHERE post_type IN ({$own_posts_string}) AND post_author = {$post_author} + ) sub_base"; + + return $subquery; + } + + /** + * Gets the views. + * + * @return array The views. + */ + public function get_views() { + global $wpdb; + + $status_links = []; + + $states = get_post_stati( [ 'show_in_admin_all_list' => true ] ); + $subquery = $this->get_base_subquery(); + + $total_posts = $wpdb->get_var( + $wpdb->prepare( + "SELECT COUNT(ID) FROM {$subquery} + WHERE post_status IN (" + . implode( ', ', array_fill( 0, count( $states ), '%s' ) ) + . ')', + $states + ) + ); + + $post_status = isset( $_GET['post_status'] ) && is_string( $_GET['post_status'] ) ? sanitize_text_field( wp_unslash( $_GET['post_status'] ) ) : ''; + $current_link_attributes = empty( $post_status ) ? ' class="current" aria-current="page"' : ''; + $localized_text = sprintf( + /* translators: %s expands to the number of posts in localized format. */ + _nx( 'All (%s)', 'All (%s)', $total_posts, 'posts', 'wordpress-seo' ), + number_format_i18n( $total_posts ) + ); + + $status_links['all'] = '' . $localized_text . ''; + + $post_stati = get_post_stati( [ 'show_in_admin_all_list' => true ], 'objects' ); + if ( is_array( $post_stati ) && $post_stati !== [] ) { + foreach ( $post_stati as $status ) { + + $status_name = esc_sql( $status->name ); + + $total = (int) $wpdb->get_var( + $wpdb->prepare( + " + SELECT COUNT(ID) FROM {$subquery} + WHERE post_status = %s + ", + $status_name + ) + ); + + if ( $total === 0 ) { + continue; + } + + $current_link_attributes = ''; + if ( $status_name === $post_status ) { + $current_link_attributes = ' class="current" aria-current="page"'; + } + + $status_links[ $status_name ] = '' . sprintf( translate_nooped_plural( $status->label_count, $total ), number_format_i18n( $total ) ) . ''; + } + } + unset( $post_stati, $status, $status_name, $total, $current_link_attributes ); + + $trashed_posts = $wpdb->get_var( + "SELECT COUNT(ID) FROM {$subquery} + WHERE post_status IN ('trash') + " + ); + + $current_link_attributes = ''; + if ( $post_status === 'trash' ) { + $current_link_attributes = 'class="current" aria-current="page"'; + } + + $localized_text = sprintf( + /* translators: %s expands to the number of trashed posts in localized format. */ + _nx( 'Trash (%s)', 'Trash (%s)', $trashed_posts, 'posts', 'wordpress-seo' ), + number_format_i18n( $trashed_posts ) + ); + + $status_links['trash'] = '' . $localized_text . ''; + + return $status_links; + } + + /** + * Outputs extra table navigation. + * + * @param string $which Table nav location (such as top). + * + * @return void + */ + public function extra_tablenav( $which ) { + + if ( $which === 'top' ) { + $post_types = get_post_types( + [ + 'public' => true, + 'exclude_from_search' => false, + ] + ); + + $instance_type = esc_attr( $this->page_type ); + + if ( is_array( $post_types ) && $post_types !== [] ) { + global $wpdb; + + echo '
'; + + $post_types = esc_sql( $post_types ); + $post_types = "'" . implode( "', '", $post_types ) . "'"; + + $states = get_post_stati( [ 'show_in_admin_all_list' => true ] ); + $states['trash'] = 'trash'; + + $subquery = $this->get_base_subquery(); + + $post_types = $wpdb->get_results( + $wpdb->prepare( + "SELECT DISTINCT post_type FROM {$subquery} + WHERE post_status IN (" + . implode( ', ', array_fill( 0, count( $states ), '%s' ) ) + . ') ORDER BY post_type ASC', + $states + ) + ); + + $post_type_filter = isset( $_GET['post_type_filter'] ) && is_string( $_GET['post_type_filter'] ) ? sanitize_text_field( wp_unslash( $_GET['post_type_filter'] ) ) : ''; + $selected = ( ! empty( $post_type_filter ) ) ? $post_type_filter : '-1'; + + $options = ''; + + if ( is_array( $post_types ) && $post_types !== [] ) { + foreach ( $post_types as $post_type ) { + $obj = get_post_type_object( $post_type->post_type ); + $options .= sprintf( + '', + esc_html( $obj->labels->name ), + esc_attr( $post_type->post_type ), + selected( $selected, $post_type->post_type, false ) + ); + } + } + + printf( + '', + esc_attr( 'post-type-filter-' . $instance_type ), + /* translators: Hidden accessibility text. */ + esc_html__( 'Filter by content type', 'wordpress-seo' ) + ); + printf( + '', + // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $options is properly escaped above. + $options, + esc_attr( 'post-type-filter-' . $instance_type ) + ); + + submit_button( esc_html__( 'Filter', 'wordpress-seo' ), 'button', false, false, [ 'id' => 'post-query-submit' ] ); + echo '
'; + } + } + } + + /** + * Gets a list of sortable columns. + * + * The format is: 'internal-name' => array( 'orderby', bool ). + * + * @return array + */ + public function get_sortable_columns() { + return [ + 'col_page_title' => [ 'post_title', true ], + 'col_post_type' => [ 'post_type', false ], + 'col_post_date' => [ 'post_date', false ], + ]; + } + + /** + * Sets the correct pagenumber and pageurl for the navigation. + * + * @return void + */ + public function prepare_page_navigation() { + + $request_url = $this->request_url . $this->page_url; + + $current_page = $this->current_page; + $current_filter = $this->current_filter; + $current_status = $this->current_status; + $current_order = $this->current_order; + + /* + * If current type doesn't compare with objects page_type, then we have to unset + * some vars in the requested url (which will be used for internal table urls). + */ + if ( isset( $this->input_fields['type'] ) && $this->input_fields['type'] !== $this->page_type ) { + $request_url = remove_query_arg( 'paged', $request_url ); // Page will be set with value 1 below. + $request_url = remove_query_arg( 'post_type_filter', $request_url ); + $request_url = remove_query_arg( 'post_status', $request_url ); + $request_url = remove_query_arg( 'orderby', $request_url ); + $request_url = remove_query_arg( 'order', $request_url ); + $request_url = add_query_arg( 'pages', 1, $request_url ); + + $current_page = 1; + $current_filter = '-1'; + $current_status = ''; + $current_order = [ + 'orderby' => 'post_title', + 'order' => 'asc', + ]; + } + + $_SERVER['REQUEST_URI'] = $request_url; + + $_GET['paged'] = $current_page; + $_REQUEST['paged'] = $current_page; + $_REQUEST['post_type_filter'] = $current_filter; + $_GET['post_type_filter'] = $current_filter; + $_GET['post_status'] = $current_status; + $_GET['orderby'] = $current_order['orderby']; + $_GET['order'] = $current_order['order']; + } + + /** + * Preparing the requested pagerows and setting the needed variables. + * + * @return void + */ + public function prepare_items() { + + $post_type_clause = $this->get_post_type_clause(); + $all_states = $this->get_all_states(); + $subquery = $this->get_base_subquery(); + + // Setting the column headers. + $this->set_column_headers(); + + // Count the total number of needed items and setting pagination given $total_items. + $total_items = $this->count_items( $subquery, $all_states, $post_type_clause ); + $this->set_pagination( $total_items ); + + // Getting items given $query. + $query = $this->parse_item_query( $subquery, $all_states, $post_type_clause ); + $this->get_items( $query ); + + // Get the metadata for the current items ($this->items). + $this->get_meta_data(); + } + + /** + * Getting the columns for first row. + * + * @return array + */ + public function get_columns() { + return $this->merge_columns(); + } + + /** + * Setting the column headers. + * + * @return void + */ + protected function set_column_headers() { + $columns = $this->get_columns(); + $hidden = []; + $sortable = $this->get_sortable_columns(); + $this->_column_headers = [ $columns, $hidden, $sortable ]; + } + + /** + * Counting total items. + * + * @param string $subquery SQL FROM part. + * @param string $all_states SQL IN part. + * @param string $post_type_clause SQL post type part. + * + * @return mixed + */ + protected function count_items( $subquery, $all_states, $post_type_clause ) { + global $wpdb; + + return (int) $wpdb->get_var( + "SELECT COUNT(ID) FROM {$subquery} + WHERE post_status IN ({$all_states}) + {$post_type_clause} + " + ); + } + + /** + * Getting the post_type_clause filter. + * + * @return string + */ + protected function get_post_type_clause() { + // Filter Block. + $post_type_clause = ''; + $post_type_filter = isset( $_GET['post_type_filter'] ) && is_string( $_GET['post_type_filter'] ) ? sanitize_text_field( wp_unslash( $_GET['post_type_filter'] ) ) : ''; + + if ( ! empty( $post_type_filter ) && get_post_type_object( $post_type_filter ) ) { + $post_types = esc_sql( $post_type_filter ); + $post_type_clause = "AND post_type IN ('{$post_types}')"; + } + + return $post_type_clause; + } + + /** + * Setting the pagination. + * + * Total items is the number of all visible items. + * + * @param int $total_items Total items counts. + * + * @return void + */ + protected function set_pagination( $total_items ) { + // Calculate items per page. + $per_page = $this->get_items_per_page( 'wpseo_posts_per_page', 10 ); + $paged = isset( $_GET['paged'] ) && is_string( $_GET['paged'] ) ? esc_sql( sanitize_text_field( wp_unslash( $_GET['paged'] ) ) ) : ''; + + if ( empty( $paged ) || ! is_numeric( $paged ) ) { + $paged = 1; + } + else { + $paged = (int) $paged; + } + + if ( $paged <= 0 ) { + $paged = 1; + } + + $this->set_pagination_args( + [ + 'total_items' => $total_items, + 'total_pages' => ceil( $total_items / $per_page ), + 'per_page' => $per_page, + ] + ); + + $this->pagination = [ + 'per_page' => $per_page, + 'offset' => ( ( $paged - 1 ) * $per_page ), + ]; + } + + /** + * Parse the query to get items from database. + * + * Based on given parameters there will be parse a query which will get all the pages/posts and other post_types + * from the database. + * + * @param string $subquery SQL FROM part. + * @param string $all_states SQL IN part. + * @param string $post_type_clause SQL post type part. + * + * @return string + */ + protected function parse_item_query( $subquery, $all_states, $post_type_clause ) { + // Order By block. + $orderby = isset( $_GET['orderby'] ) && is_string( $_GET['orderby'] ) ? sanitize_text_field( wp_unslash( $_GET['orderby'] ) ) : ''; + + $orderby = ! empty( $orderby ) ? esc_sql( $orderby ) : 'post_title'; + $orderby = $this->sanitize_orderby( $orderby ); + + // Order clause. + $order = isset( $_GET['order'] ) && is_string( $_GET['order'] ) ? sanitize_text_field( wp_unslash( $_GET['order'] ) ) : ''; + $order = ! empty( $order ) ? esc_sql( strtoupper( $order ) ) : 'ASC'; + $order = $this->sanitize_order( $order ); + + // Get all needed results. + $query = " + SELECT ID, post_title, post_type, post_status, post_modified, post_date + FROM {$subquery} + WHERE post_status IN ({$all_states}) $post_type_clause + ORDER BY {$orderby} {$order} + LIMIT %d,%d + "; + + return $query; + } + + /** + * Heavily restricts the possible columns by which a user can order the table + * in the bulk editor, thereby preventing a possible CSRF vulnerability. + * + * @param string $orderby The column by which we want to order. + * + * @return string + */ + protected function sanitize_orderby( $orderby ) { + $valid_column_names = [ + 'post_title', + 'post_type', + 'post_date', + ]; + + if ( in_array( $orderby, $valid_column_names, true ) ) { + return $orderby; + } + + return 'post_title'; + } + + /** + * Makes sure the order clause is always ASC or DESC for the bulk editor table, + * thereby preventing a possible CSRF vulnerability. + * + * @param string $order Whether we want to sort ascending or descending. + * + * @return string SQL order string (ASC, DESC). + */ + protected function sanitize_order( $order ) { + if ( in_array( strtoupper( $order ), [ 'ASC', 'DESC' ], true ) ) { + return $order; + } + + return 'ASC'; + } + + /** + * Getting all the items. + * + * @param string $query SQL query to use. + * + * @return void + */ + protected function get_items( $query ) { + global $wpdb; + + $this->items = $wpdb->get_results( + $wpdb->prepare( + $query, + $this->pagination['offset'], + $this->pagination['per_page'] + ) + ); + } + + /** + * Getting all the states. + * + * @return string + */ + protected function get_all_states() { + global $wpdb; + + $states = get_post_stati( [ 'show_in_admin_all_list' => true ] ); + $states['trash'] = 'trash'; + + if ( ! empty( $this->input_fields['post_status'] ) ) { + $requested_state = $this->input_fields['post_status']; + if ( in_array( $requested_state, $states, true ) ) { + $states = [ $requested_state ]; + } + + if ( $requested_state !== 'trash' ) { + unset( $states['trash'] ); + } + } + + return $wpdb->prepare( + implode( ', ', array_fill( 0, count( $states ), '%s' ) ), + $states + ); + } + + /** + * Based on $this->items and the defined columns, the table rows will be displayed. + * + * @return void + */ + public function display_rows() { + + $records = $this->items; + + list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info(); + + if ( ( is_array( $records ) && $records !== [] ) && ( is_array( $columns ) && $columns !== [] ) ) { + + foreach ( $records as $record ) { + + echo ''; + + foreach ( $columns as $column_name => $column_display_name ) { + + $classes = ''; + if ( $primary === $column_name ) { + $classes .= ' has-row-actions column-primary'; + } + + $attributes = $this->column_attributes( $column_name, $hidden, $classes, $column_display_name ); + + $column_value = $this->parse_column( $column_name, $record ); + + if ( method_exists( $this, 'parse_page_specific_column' ) && empty( $column_value ) ) { + $column_value = $this->parse_page_specific_column( $column_name, $record, $attributes ); + } + + if ( ! empty( $column_value ) ) { + printf( '%1$s', $column_value, $attributes ); + } + } + + echo ''; + } + } + } + + /** + * Getting the attributes for each table cell. + * + * @param string $column_name Column name string. + * @param array $hidden Set of hidden columns. + * @param string $classes Additional CSS classes. + * @param string $column_display_name Column display name string. + * + * @return string + */ + protected function column_attributes( $column_name, $hidden, $classes, $column_display_name ) { + + $attributes = ''; + $class = [ $column_name, "column-$column_name$classes" ]; + + if ( in_array( $column_name, $hidden, true ) ) { + $class[] = 'hidden'; + } + + if ( ! empty( $class ) ) { + $attributes = 'class="' . esc_attr( implode( ' ', $class ) ) . '"'; + } + + $attributes .= ' data-colname="' . esc_attr( $column_display_name ) . '"'; + + return $attributes; + } + + /** + * Parsing the title. + * + * @param WP_Post $rec Post object. + * + * @return string + */ + protected function parse_page_title_column( $rec ) { + + $title = empty( $rec->post_title ) ? __( '(no title)', 'wordpress-seo' ) : $rec->post_title; + + $return = sprintf( '%1$s', stripslashes( wp_strip_all_tags( $title ) ) ); + + $post_type_object = get_post_type_object( $rec->post_type ); + $can_edit_post = current_user_can( $post_type_object->cap->edit_post, $rec->ID ); + + $actions = []; + + if ( $can_edit_post && $rec->post_status !== 'trash' ) { + $actions['edit'] = sprintf( + '%s', + esc_url( get_edit_post_link( $rec->ID, true ) ), + /* translators: Hidden accessibility text; %s: post title. */ + esc_attr( sprintf( __( 'Edit “%s”', 'wordpress-seo' ), $title ) ), + __( 'Edit', 'wordpress-seo' ) + ); + } + + if ( $post_type_object->public ) { + if ( in_array( $rec->post_status, [ 'pending', 'draft', 'future' ], true ) ) { + if ( $can_edit_post ) { + $actions['view'] = sprintf( + '%s', + esc_url( add_query_arg( 'preview', 'true', get_permalink( $rec->ID ) ) ), + /* translators: Hidden accessibility text; %s: post title. */ + esc_attr( sprintf( __( 'Preview “%s”', 'wordpress-seo' ), $title ) ), + __( 'Preview', 'wordpress-seo' ) + ); + } + } + elseif ( $rec->post_status !== 'trash' ) { + $actions['view'] = sprintf( + '%s', + esc_url( get_permalink( $rec->ID ) ), + /* translators: Hidden accessibility text; %s: post title. */ + esc_attr( sprintf( __( 'View “%s”', 'wordpress-seo' ), $title ) ), + __( 'View', 'wordpress-seo' ) + ); + } + } + + $return .= $this->row_actions( $actions ); + + return $return; + } + + /** + * Parsing the column based on the $column_name. + * + * @param string $column_name Column name. + * @param WP_Post $rec Post object. + * + * @return string + */ + protected function parse_column( $column_name, $rec ) { + + static $date_format; + + if ( ! isset( $date_format ) ) { + $date_format = get_option( 'date_format' ); + } + + switch ( $column_name ) { + case 'col_page_title': + $column_value = $this->parse_page_title_column( $rec ); + break; + + case 'col_page_slug': + $permalink = get_permalink( $rec->ID ); + $display_slug = str_replace( get_bloginfo( 'url' ), '', $permalink ); + $column_value = sprintf( '%1$s', stripslashes( rawurldecode( $display_slug ) ), esc_url( $permalink ) ); + break; + + case 'col_post_type': + $post_type = get_post_type_object( $rec->post_type ); + $column_value = $post_type->labels->singular_name; + break; + + case 'col_post_status': + $post_status = get_post_status_object( $rec->post_status ); + $column_value = $post_status->label; + break; + + case 'col_post_date': + $column_value = date_i18n( $date_format, strtotime( $rec->post_date ) ); + break; + + case 'col_row_action': + $column_value = sprintf( + '%2$s %3$s', + $rec->ID, + esc_html__( 'Save', 'wordpress-seo' ), + esc_html__( 'Save all', 'wordpress-seo' ) + ); + break; + } + + if ( ! empty( $column_value ) ) { + return $column_value; + } + } + + /** + * Parse the field where the existing meta-data value is displayed. + * + * @param int $record_id Record ID. + * @param string $attributes HTML attributes. + * @param bool|array $values Optional values data array. + * + * @return string + */ + protected function parse_meta_data_field( $record_id, $attributes, $values = false ) { + + // Fill meta data if exists in $this->meta_data. + $meta_data = ( ! empty( $this->meta_data[ $record_id ] ) ) ? $this->meta_data[ $record_id ] : []; + $meta_key = WPSEO_Meta::$meta_prefix . $this->target_db_field; + $meta_value = ( ! empty( $meta_data[ $meta_key ] ) ) ? $meta_data[ $meta_key ] : ''; + + if ( ! empty( $values ) ) { + $meta_value = $values[ $meta_value ]; + } + + $id = "wpseo-existing-$this->target_db_field-$record_id"; + + // $attributes correctly escaped, verified by Alexander. See WPSEO_Bulk_Description_List_Table::parse_page_specific_column. + return sprintf( '%1$s', esc_html( $meta_value ), $attributes, esc_attr( $id ) ); + } + + /** + * Method for setting the meta data, which belongs to the records that will be shown on the current page. + * + * This method will loop through the current items ($this->items) for getting the post_id. With this data + * ($needed_ids) the method will query the meta-data table for getting the title. + * + * @return void + */ + protected function get_meta_data() { + + $post_ids = $this->get_post_ids(); + $meta_data = $this->get_meta_data_result( $post_ids ); + + $this->parse_meta_data( $meta_data ); + + // Little housekeeping. + unset( $post_ids, $meta_data ); + } + + /** + * Getting all post_ids from to $this->items. + * + * @return array + */ + protected function get_post_ids() { + $post_ids = []; + foreach ( $this->items as $item ) { + $post_ids[] = $item->ID; + } + + return $post_ids; + } + + /** + * Getting the meta_data from database. + * + * @param array $post_ids Post IDs for SQL IN part. + * + * @return mixed + */ + protected function get_meta_data_result( array $post_ids ) { + global $wpdb; + + $where = $wpdb->prepare( + 'post_id IN (' . implode( ', ', array_fill( 0, count( $post_ids ), '%d' ) ) . ')', + $post_ids + ); + + $where .= $wpdb->prepare( ' AND meta_key = %s', WPSEO_Meta::$meta_prefix . $this->target_db_field ); + + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- They are prepared on the lines above. + return $wpdb->get_results( "SELECT * FROM {$wpdb->postmeta} WHERE {$where}" ); + } + + /** + * Setting $this->meta_data. + * + * @param array $meta_data Meta data set. + * + * @return void + */ + protected function parse_meta_data( $meta_data ) { + + foreach ( $meta_data as $row ) { + $this->meta_data[ $row->post_id ][ $row->meta_key ] = $row->meta_value; + } + } + + /** + * This method will merge general array with given parameter $columns. + * + * @param array $columns Optional columns set. + * + * @return array + */ + protected function merge_columns( $columns = [] ) { + $columns = array_merge( + [ + 'col_page_title' => __( 'WP Page Title', 'wordpress-seo' ), + 'col_post_type' => __( 'Content Type', 'wordpress-seo' ), + 'col_post_status' => __( 'Post Status', 'wordpress-seo' ), + 'col_post_date' => __( 'Publication date', 'wordpress-seo' ), + 'col_page_slug' => __( 'Page URL/Slug', 'wordpress-seo' ), + ], + $columns + ); + + $columns['col_row_action'] = __( 'Action', 'wordpress-seo' ); + + return $columns; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-bulk-title-editor-list-table.php b/wp-content/plugins/wordpress-seo/admin/class-bulk-title-editor-list-table.php new file mode 100644 index 00000000..5314fdb5 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-bulk-title-editor-list-table.php @@ -0,0 +1,89 @@ + 'wpseo_bulk_title', + 'plural' => 'wpseo_bulk_titles', + 'ajax' => true, + ]; + + /** + * The field in the database where meta field is saved. + * + * @var string + */ + protected $target_db_field = 'title'; + + /** + * The columns shown on the table. + * + * @return array + */ + public function get_columns() { + + $columns = [ + /* translators: %1$s expands to Yoast SEO */ + 'col_existing_yoast_seo_title' => sprintf( __( 'Existing %1$s Title', 'wordpress-seo' ), 'Yoast SEO' ), + /* translators: %1$s expands to Yoast SEO */ + 'col_new_yoast_seo_title' => sprintf( __( 'New %1$s Title', 'wordpress-seo' ), 'Yoast SEO' ), + ]; + + return $this->merge_columns( $columns ); + } + + /** + * Parse the title columns. + * + * @param string $column_name Column name. + * @param object $record Data object. + * @param string $attributes HTML attributes. + * + * @return string + */ + protected function parse_page_specific_column( $column_name, $record, $attributes ) { + + // Fill meta data if exists in $this->meta_data. + $meta_data = ( ! empty( $this->meta_data[ $record->ID ] ) ) ? $this->meta_data[ $record->ID ] : []; + + switch ( $column_name ) { + case 'col_existing_yoast_seo_title': + // @todo Inconsistent return/echo behavior R. + // I traced the escaping of the attributes to WPSEO_Bulk_List_Table::column_attributes. + // The output of WPSEO_Bulk_List_Table::parse_meta_data_field is properly escaped. + // phpcs:ignore WordPress.Security.EscapeOutput + echo $this->parse_meta_data_field( $record->ID, $attributes ); + break; + + case 'col_new_yoast_seo_title': + return sprintf( + '', + 'wpseo-new-title-' . $record->ID, + $record->ID + ); + } + + unset( $meta_data ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-collector.php b/wp-content/plugins/wordpress-seo/admin/class-collector.php new file mode 100644 index 00000000..e49e872c --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-collector.php @@ -0,0 +1,54 @@ +collections[] = $collection; + } + + /** + * Collects the data from the collection objects. + * + * @return array The collected data. + */ + public function collect() { + $data = []; + + foreach ( $this->collections as $collection ) { + $data = array_merge( $data, $collection->get() ); + } + + return $data; + } + + /** + * Returns the collected data as a JSON encoded string. + * + * @return false|string The encode string. + */ + public function get_as_json() { + return WPSEO_Utils::format_json_encode( $this->collect() ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-config.php b/wp-content/plugins/wordpress-seo/admin/class-config.php new file mode 100644 index 00000000..ca9b2b6a --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-config.php @@ -0,0 +1,160 @@ +asset_manager = new WPSEO_Admin_Asset_Manager(); + } + + /** + * Make sure the needed scripts are loaded for admin pages. + * + * @return void + */ + public function init() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + $page = isset( $_GET['page'] ) && is_string( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : ''; + if ( in_array( $page, [ Settings_Integration::PAGE, Academy_Integration::PAGE, Support_Integration::PAGE ], true ) ) { + // Bail, this is managed in the applicable integration. + return; + } + + add_action( 'admin_enqueue_scripts', [ $this, 'config_page_scripts' ] ); + add_action( 'admin_enqueue_scripts', [ $this, 'config_page_styles' ] ); + } + + /** + * Loads the required styles for the config page. + * + * @return void + */ + public function config_page_styles() { + wp_enqueue_style( 'dashboard' ); + wp_enqueue_style( 'thickbox' ); + wp_enqueue_style( 'global' ); + wp_enqueue_style( 'wp-admin' ); + $this->asset_manager->enqueue_style( 'admin-css' ); + $this->asset_manager->enqueue_style( 'monorepo' ); + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + $page = isset( $_GET['page'] ) && is_string( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : ''; + if ( $page === 'wpseo_licenses' ) { + $this->asset_manager->enqueue_style( 'tailwind' ); + } + } + + /** + * Loads the required scripts for the config page. + * + * @return void + */ + public function config_page_scripts() { + $this->asset_manager->enqueue_script( 'settings' ); + wp_enqueue_script( 'dashboard' ); + wp_enqueue_script( 'thickbox' ); + + $alert_dismissal_action = YoastSEO()->classes->get( Alert_Dismissal_Action::class ); + $dismissed_alerts = $alert_dismissal_action->all_dismissed(); + $woocommerce_conditional = new WooCommerce_Conditional(); + + $script_data = [ + 'userLanguageCode' => WPSEO_Language_Utils::get_language( get_user_locale() ), + 'dismissedAlerts' => $dismissed_alerts, + 'isRtl' => is_rtl(), + 'isPremium' => YoastSEO()->helpers->product->is_premium(), + 'isWooCommerceActive' => $woocommerce_conditional->is_met(), + 'currentPromotions' => YoastSEO()->classes->get( Promotion_Manager::class )->get_current_promotions(), + 'webinarIntroSettingsUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/webinar-intro-settings' ), + 'webinarIntroFirstTimeConfigUrl' => $this->get_webinar_shortlink(), + 'linkParams' => WPSEO_Shortlinker::get_query_params(), + 'pluginUrl' => plugins_url( '', WPSEO_FILE ), + ]; + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + $page = isset( $_GET['page'] ) && is_string( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : ''; + + if ( in_array( $page, [ WPSEO_Admin::PAGE_IDENTIFIER, 'wpseo_workouts' ], true ) ) { + wp_enqueue_media(); + + $script_data['media'] = [ + 'choose_image' => __( 'Use Image', 'wordpress-seo' ), + ]; + + $script_data['userEditUrl'] = add_query_arg( 'user_id', '{user_id}', admin_url( 'user-edit.php' ) ); + } + + if ( $page === 'wpseo_tools' ) { + $this->enqueue_tools_scripts(); + } + + $this->asset_manager->localize_script( 'settings', 'wpseoScriptData', $script_data ); + $this->asset_manager->enqueue_user_language_script(); + } + + /** + * Enqueues and handles all the tool dependencies. + * + * @return void + */ + private function enqueue_tools_scripts() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + $tool = isset( $_GET['tool'] ) && is_string( $_GET['tool'] ) ? sanitize_text_field( wp_unslash( $_GET['tool'] ) ) : ''; + + if ( empty( $tool ) ) { + $this->asset_manager->enqueue_script( 'yoast-seo' ); + } + + if ( $tool === 'bulk-editor' ) { + $this->asset_manager->enqueue_script( 'bulk-editor' ); + } + } + + /** + * Returns the appropriate shortlink for the Webinar. + * + * @return string The shortlink for the Webinar. + */ + private function get_webinar_shortlink() { + if ( YoastSEO()->helpers->product->is_premium() ) { + return WPSEO_Shortlinker::get( 'https://yoa.st/webinar-intro-first-time-config-premium' ); + } + + return WPSEO_Shortlinker::get( 'https://yoa.st/webinar-intro-first-time-config' ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-database-proxy.php b/wp-content/plugins/wordpress-seo/admin/class-database-proxy.php new file mode 100644 index 00000000..89ec64d3 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-database-proxy.php @@ -0,0 +1,309 @@ +table_name = $table_name; + $this->suppress_errors = (bool) $suppress_errors; + $this->is_multisite_table = (bool) $is_multisite_table; + $this->database = $database; + + // If the table prefix was provided, strip it as it's handled automatically. + $table_prefix = $this->get_table_prefix(); + if ( ! empty( $table_prefix ) && strpos( $this->table_name, $table_prefix ) === 0 ) { + $this->table_prefix = substr( $this->table_name, strlen( $table_prefix ) ); + } + + if ( ! $this->is_table_registered() ) { + $this->register_table(); + } + } + + /** + * Inserts data into the database. + * + * @param array $data Data to insert. + * @param array|string|null $format Formats for the data. + * + * @return false|int Total amount of inserted rows or false on error. + */ + public function insert( array $data, $format = null ) { + $this->pre_execution(); + + $result = $this->database->insert( $this->get_table_name(), $data, $format ); + + $this->post_execution(); + + return $result; + } + + /** + * Updates data in the database. + * + * @param array $data Data to update on the table. + * @param array $where Where condition as key => value array. + * @param array|string|null $format Optional. Data prepare format. + * @param array|string|null $where_format Optional. Where prepare format. + * + * @return false|int False when the update request is invalid, int on number of rows changed. + */ + public function update( array $data, array $where, $format = null, $where_format = null ) { + $this->pre_execution(); + + $result = $this->database->update( $this->get_table_name(), $data, $where, $format, $where_format ); + + $this->post_execution(); + + return $result; + } + + /** + * Upserts data in the database. + * + * Performs an insert into and if key is duplicate it will update the existing record. + * + * @param array $data Data to update on the table. + * @param array|null $where Unused. Where condition as key => value array. + * @param array|string|null $format Optional. Data prepare format. + * @param array|string|null $where_format Optional. Where prepare format. + * + * @return false|int False when the upsert request is invalid, int on number of rows changed. + */ + public function upsert( array $data, ?array $where = null, $format = null, $where_format = null ) { + if ( $where_format !== null ) { + _deprecated_argument( __METHOD__, '7.7.0', 'The where_format argument is deprecated' ); + } + + $this->pre_execution(); + + $update = []; + $keys = []; + $columns = array_keys( $data ); + foreach ( $columns as $column ) { + $keys[] = '`' . $column . '`'; + $update[] = sprintf( '`%1$s` = VALUES(`%1$s`)', $column ); + } + + $query = sprintf( + 'INSERT INTO `%1$s` (%2$s) VALUES ( %3$s ) ON DUPLICATE KEY UPDATE %4$s', + $this->get_table_name(), + implode( ', ', $keys ), + implode( ', ', array_fill( 0, count( $data ), '%s' ) ), + implode( ', ', $update ) + ); + + $result = $this->database->query( + $this->database->prepare( + $query, + array_values( $data ) + ) + ); + + $this->post_execution(); + + return $result; + } + + /** + * Deletes a record from the database. + * + * @param array $where Where clauses for the query. + * @param array|string|null $format Formats for the data. + * + * @return false|int + */ + public function delete( array $where, $format = null ) { + $this->pre_execution(); + + $result = $this->database->delete( $this->get_table_name(), $where, $format ); + + $this->post_execution(); + + return $result; + } + + /** + * Executes the given query and returns the results. + * + * @param string $query The query to execute. + * + * @return array|object|null The resultset + */ + public function get_results( $query ) { + $this->pre_execution(); + + $results = $this->database->get_results( $query ); + + $this->post_execution(); + + return $results; + } + + /** + * Creates a table to the database. + * + * @param array $columns The columns to create. + * @param array $indexes The indexes to use. + * + * @return bool True when creation is successful. + */ + public function create_table( array $columns, array $indexes = [] ) { + $create_table = sprintf( + 'CREATE TABLE IF NOT EXISTS %1$s ( %2$s ) %3$s', + $this->get_table_name(), + implode( ',', array_merge( $columns, $indexes ) ), + $this->database->get_charset_collate() + ); + + $this->pre_execution(); + + $is_created = (bool) $this->database->query( $create_table ); + + $this->post_execution(); + + return $is_created; + } + + /** + * Checks if there is an error. + * + * @return bool Returns true when there is an error. + */ + public function has_error() { + return ( $this->database->last_error !== '' ); + } + + /** + * Executed before a query will be ran. + * + * @return void + */ + protected function pre_execution() { + if ( $this->suppress_errors ) { + $this->last_suppressed_state = $this->database->suppress_errors(); + } + } + + /** + * Executed after a query has been ran. + * + * @return void + */ + protected function post_execution() { + if ( $this->suppress_errors ) { + $this->database->suppress_errors( $this->last_suppressed_state ); + } + } + + /** + * Returns the full table name. + * + * @return string Full table name including prefix. + */ + public function get_table_name() { + return $this->get_table_prefix() . $this->table_name; + } + + /** + * Returns the prefix to use for the table. + * + * @return string The table prefix depending on the database context. + */ + protected function get_table_prefix() { + if ( $this->is_multisite_table ) { + return $this->database->base_prefix; + } + + return $this->database->get_blog_prefix(); + } + + /** + * Registers the table with WordPress. + * + * @return void + */ + protected function register_table() { + $table_name = $this->table_name; + $full_table_name = $this->get_table_name(); + + $this->database->$table_name = $full_table_name; + + if ( $this->is_multisite_table ) { + $this->database->ms_global_tables[] = $table_name; + return; + } + + $this->database->tables[] = $table_name; + } + + /** + * Checks if the table has been registered with WordPress. + * + * @return bool True if the table is registered, false otherwise. + */ + protected function is_table_registered() { + if ( $this->is_multisite_table ) { + return in_array( $this->table_name, $this->database->ms_global_tables, true ); + } + + return in_array( $this->table_name, $this->database->tables, true ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-export.php b/wp-content/plugins/wordpress-seo/admin/class-export.php new file mode 100644 index 00000000..6e769b04 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-export.php @@ -0,0 +1,164 @@ +export_settings(); + $this->output(); + } + + /** + * Outputs the export. + * + * @return void + */ + public function output() { + if ( ! WPSEO_Capability_Utils::current_user_can( 'wpseo_manage_options' ) ) { + esc_html_e( 'You do not have the required rights to export settings.', 'wordpress-seo' ); + return; + } + + echo '

'; + printf( + /* translators: %1$s expands to Import settings */ + esc_html__( + 'Copy all these settings to another site\'s %1$s tab and click "%1$s" there.', + 'wordpress-seo' + ), + esc_html__( + 'Import settings', + 'wordpress-seo' + ) + ); + echo '

'; + /* translators: %1$s expands to Yoast SEO */ + echo '
'; + echo ''; + } + + /** + * Exports the current site's WP SEO settings. + * + * @return void + */ + private function export_settings() { + $this->export_header(); + + foreach ( WPSEO_Options::get_option_names() as $opt_group ) { + $this->write_opt_group( $opt_group ); + } + } + + /** + * Writes the header of the export. + * + * @return void + */ + private function export_header() { + $header = sprintf( + /* translators: %1$s expands to Yoast SEO, %2$s expands to Yoast.com */ + esc_html__( 'These are settings for the %1$s plugin by %2$s', 'wordpress-seo' ), + 'Yoast SEO', + 'Yoast.com' + ); + $this->write_line( '; ' . $header ); + } + + /** + * Writes a line to the export. + * + * @param string $line Line string. + * @param bool $newline_first Boolean flag whether to prepend with new line. + * + * @return void + */ + private function write_line( $line, $newline_first = false ) { + if ( $newline_first ) { + $this->export .= PHP_EOL; + } + $this->export .= $line . PHP_EOL; + } + + /** + * Writes an entire option group to the export. + * + * @param string $opt_group Option group name. + * + * @return void + */ + private function write_opt_group( $opt_group ) { + + $this->write_line( '[' . $opt_group . ']', true ); + + $options = get_option( $opt_group ); + + if ( ! is_array( $options ) ) { + return; + } + + foreach ( $options as $key => $elem ) { + if ( is_array( $elem ) ) { + $count = count( $elem ); + for ( $i = 0; $i < $count; $i++ ) { + $elem_check = ( $elem[ $i ] ?? null ); + $this->write_setting( $key . '[]', $elem_check ); + } + } + else { + $this->write_setting( $key, $elem ); + } + } + } + + /** + * Writes a settings line to the export. + * + * @param string $key Key string. + * @param string $val Value string. + * + * @return void + */ + private function write_setting( $key, $val ) { + if ( is_string( $val ) ) { + $val = '"' . $val . '"'; + } + $this->write_line( $key . ' = ' . $val ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-expose-shortlinks.php b/wp-content/plugins/wordpress-seo/admin/class-expose-shortlinks.php new file mode 100644 index 00000000..e6a589b6 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-expose-shortlinks.php @@ -0,0 +1,143 @@ + 'https://yoa.st/allow-search-engines', + 'shortlinks.advanced.follow_links' => 'https://yoa.st/follow-links', + 'shortlinks.advanced.meta_robots' => 'https://yoa.st/meta-robots-advanced', + 'shortlinks.advanced.breadcrumbs_title' => 'https://yoa.st/breadcrumbs-title', + 'shortlinks.metabox.schema.explanation' => 'https://yoa.st/400', + 'shortlinks.metabox.schema.page_type' => 'https://yoa.st/402', + 'shortlinks.sidebar.schema.explanation' => 'https://yoa.st/401', + 'shortlinks.sidebar.schema.page_type' => 'https://yoa.st/403', + 'shortlinks.focus_keyword_info' => 'https://yoa.st/focus-keyword', + 'shortlinks.nofollow_sponsored' => 'https://yoa.st/nofollow-sponsored', + 'shortlinks.snippet_preview_info' => 'https://yoa.st/snippet-preview', + 'shortlinks.cornerstone_content_info' => 'https://yoa.st/1i9', + 'shortlinks.upsell.social_preview.social' => 'https://yoa.st/social-preview-facebook', + 'shortlinks.upsell.social_preview.x' => 'https://yoa.st/social-preview-twitter', + 'shortlinks.upsell.sidebar.news' => 'https://yoa.st/get-news-sidebar', + 'shortlinks.upsell.sidebar.focus_keyword_synonyms_button' => 'https://yoa.st/keyword-synonyms-popup-sidebar', + 'shortlinks.upsell.sidebar.premium_seo_analysis_button' => 'https://yoa.st/premium-seo-analysis-sidebar', + 'shortlinks.upsell.sidebar.focus_keyword_additional_button' => 'https://yoa.st/add-keywords-popup-sidebar', + 'shortlinks.upsell.sidebar.additional_link' => 'https://yoa.st/textlink-keywords-sidebar', + 'shortlinks.upsell.sidebar.additional_button' => 'https://yoa.st/add-keywords-sidebar', + 'shortlinks.upsell.sidebar.keyphrase_distribution' => 'https://yoa.st/keyphrase-distribution-sidebar', + 'shortlinks.upsell.sidebar.word_complexity' => 'https://yoa.st/word-complexity-sidebar', + 'shortlinks.upsell.sidebar.internal_linking_suggestions' => 'https://yoa.st/internal-linking-suggestions-sidebar', + 'shortlinks.upsell.sidebar.highlighting_seo_analysis' => 'https://yoa.st/highlighting-seo-analysis', + 'shortlinks.upsell.sidebar.highlighting_readability_analysis' => 'https://yoa.st/highlighting-readability-analysis', + 'shortlinks.upsell.sidebar.highlighting_inclusive_analysis' => 'https://yoa.st/highlighting-inclusive-analysis', + 'shortlinks.upsell.metabox.news' => 'https://yoa.st/get-news-metabox', + 'shortlinks.upsell.metabox.go_premium' => 'https://yoa.st/pe-premium-page', + 'shortlinks.upsell.metabox.focus_keyword_synonyms_button' => 'https://yoa.st/keyword-synonyms-popup', + 'shortlinks.upsell.metabox.premium_seo_analysis_button' => 'https://yoa.st/premium-seo-analysis-metabox', + 'shortlinks.upsell.metabox.focus_keyword_additional_button' => 'https://yoa.st/add-keywords-popup', + 'shortlinks.upsell.metabox.additional_link' => 'https://yoa.st/textlink-keywords-metabox', + 'shortlinks.upsell.metabox.additional_button' => 'https://yoa.st/add-keywords-metabox', + 'shortlinks.upsell.metabox.keyphrase_distribution' => 'https://yoa.st/keyphrase-distribution-metabox', + 'shortlinks.upsell.metabox.word_complexity' => 'https://yoa.st/word-complexity-metabox', + 'shortlinks.upsell.metabox.internal_linking_suggestions' => 'https://yoa.st/internal-linking-suggestions-metabox', + 'shortlinks.upsell.gsc.create_redirect_button' => 'https://yoa.st/redirects', + 'shortlinks.readability_analysis_info' => 'https://yoa.st/readability-analysis', + 'shortlinks.inclusive_language_analysis_info' => 'https://yoa.st/inclusive-language-analysis', + 'shortlinks.activate_premium_info' => 'https://yoa.st/activate-subscription', + 'shortlinks.upsell.sidebar.morphology_upsell_metabox' => 'https://yoa.st/morphology-upsell-metabox', + 'shortlinks.upsell.sidebar.morphology_upsell_sidebar' => 'https://yoa.st/morphology-upsell-sidebar', + 'shortlinks.semrush.volume_help' => 'https://yoa.st/3-v', + 'shortlinks.semrush.trend_help' => 'https://yoa.st/3-v', + 'shortlinks.semrush.prices' => 'https://yoa.st/semrush-prices', + 'shortlinks.semrush.premium_landing_page' => 'https://yoa.st/413', + 'shortlinks.wincher.seo_performance' => 'https://yoa.st/wincher-integration', + 'shortlinks-insights-estimated_reading_time' => 'https://yoa.st/4fd', + 'shortlinks-insights-flesch_reading_ease' => 'https://yoa.st/34r', + 'shortlinks-insights-flesch_reading_ease_sidebar' => 'https://yoa.st/4mf', + 'shortlinks-insights-flesch_reading_ease_metabox' => 'https://yoa.st/4mg', + 'shortlinks-insights-flesch_reading_ease_article' => 'https://yoa.st/34s', + 'shortlinks-insights-keyword_research_link' => 'https://yoa.st/keyword-research-metabox', + 'shortlinks-insights-upsell-sidebar-prominent_words' => 'https://yoa.st/prominent-words-upsell-sidebar', + 'shortlinks-insights-upsell-metabox-prominent_words' => 'https://yoa.st/prominent-words-upsell-metabox', + 'shortlinks-insights-upsell-elementor-prominent_words' => 'https://yoa.st/prominent-words-upsell-elementor', + 'shortlinks-insights-word_count' => 'https://yoa.st/word-count', + 'shortlinks-insights-upsell-sidebar-text_formality' => 'https://yoa.st/formality-upsell-sidebar', + 'shortlinks-insights-upsell-metabox-text_formality' => 'https://yoa.st/formality-upsell-metabox', + 'shortlinks-insights-upsell-elementor-text_formality' => 'https://yoa.st/formality-upsell-elementor', + 'shortlinks-insights-text_formality_info_free' => 'https://yoa.st/formality-free', + 'shortlinks-insights-text_formality_info_premium' => 'https://yoa.st/formality', + ]; + + /** + * Registers all hooks to WordPress. + * + * @return void + */ + public function register_hooks() { + add_filter( 'wpseo_admin_l10n', [ $this, 'expose_shortlinks' ] ); + } + + /** + * Adds shortlinks to the passed array. + * + * @param array $input The array to add shortlinks to. + * + * @return array The passed array with the additional shortlinks. + */ + public function expose_shortlinks( $input ) { + foreach ( $this->get_shortlinks() as $key => $shortlink ) { + $input[ $key ] = WPSEO_Shortlinker::get( $shortlink ); + } + + $input['default_query_params'] = WPSEO_Shortlinker::get_query_params(); + + return $input; + } + + /** + * Retrieves the shortlinks. + * + * @return array The shortlinks. + */ + private function get_shortlinks() { + if ( ! $this->is_term_edit() ) { + return $this->shortlinks; + } + + $shortlinks = $this->shortlinks; + + $shortlinks['shortlinks.upsell.metabox.focus_keyword_synonyms_button'] = 'https://yoa.st/keyword-synonyms-popup-term'; + $shortlinks['shortlinks.upsell.metabox.focus_keyword_additional_button'] = 'https://yoa.st/add-keywords-popup-term'; + $shortlinks['shortlinks.upsell.metabox.additional_link'] = 'https://yoa.st/textlink-keywords-metabox-term'; + $shortlinks['shortlinks.upsell.metabox.additional_button'] = 'https://yoa.st/add-keywords-metabox-term'; + $shortlinks['shortlinks.upsell.sidebar.morphology_upsell_metabox'] = 'https://yoa.st/morphology-upsell-metabox-term'; + $shortlinks['shortlinks.upsell.metabox.keyphrase_distribution'] = 'https://yoa.st/keyphrase-distribution-metabox-term'; + $shortlinks['shortlinks.upsell.metabox.word_complexity'] = 'https://yoa.st/word-complexity-metabox-term'; + $shortlinks['shortlinks.upsell.metabox.internal_linking_suggestions'] = 'https://yoa.st/internal-linking-suggestions-metabox-term'; + + return $shortlinks; + } + + /** + * Checks if the current page is a term edit page. + * + * @return bool True when page is term edit. + */ + private function is_term_edit() { + global $pagenow; + + return WPSEO_Taxonomy::is_term_edit( $pagenow ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-gutenberg-compatibility.php b/wp-content/plugins/wordpress-seo/admin/class-gutenberg-compatibility.php new file mode 100644 index 00000000..6160f1a2 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-gutenberg-compatibility.php @@ -0,0 +1,107 @@ +current_version = $this->detect_installed_gutenberg_version(); + } + + /** + * Determines whether or not Gutenberg is installed. + * + * @return bool Whether or not Gutenberg is installed. + */ + public function is_installed() { + return $this->current_version !== ''; + } + + /** + * Determines whether or not the currently installed version of Gutenberg is below the minimum supported version. + * + * @return bool True if the currently installed version is below the minimum supported version. False otherwise. + */ + public function is_below_minimum() { + return version_compare( $this->current_version, $this->get_minimum_supported_version(), '<' ); + } + + /** + * Gets the currently installed version. + * + * @return string The currently installed version. + */ + public function get_installed_version() { + return $this->current_version; + } + + /** + * Determines whether or not the currently installed version of Gutenberg is the latest, fully compatible version. + * + * @return bool Whether or not the currently installed version is fully compatible. + */ + public function is_fully_compatible() { + return version_compare( $this->current_version, $this->get_latest_release(), '>=' ); + } + + /** + * Gets the latest released version of Gutenberg. + * + * @return string The latest release. + */ + protected function get_latest_release() { + return self::CURRENT_RELEASE; + } + + /** + * Gets the minimum supported version of Gutenberg. + * + * @return string The minumum supported release. + */ + protected function get_minimum_supported_version() { + return self::MINIMUM_SUPPORTED; + } + + /** + * Detects the currently installed Gutenberg version. + * + * @return string The currently installed Gutenberg version. Empty if the version couldn't be detected. + */ + protected function detect_installed_gutenberg_version() { + if ( defined( 'GUTENBERG_VERSION' ) ) { + return GUTENBERG_VERSION; + } + + return ''; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-meta-columns.php b/wp-content/plugins/wordpress-seo/admin/class-meta-columns.php new file mode 100644 index 00000000..7b2108fb --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-meta-columns.php @@ -0,0 +1,839 @@ +analysis_seo = new WPSEO_Metabox_Analysis_SEO(); + $this->analysis_readability = new WPSEO_Metabox_Analysis_Readability(); + $this->admin_columns_cache = YoastSEO()->classes->get( Admin_Columns_Cache_Integration::class ); + $this->score_icon_helper = YoastSEO()->helpers->score_icon; + } + + /** + * Sets up up the hooks. + * + * @return void + */ + public function setup_hooks() { + $this->set_post_type_hooks(); + + if ( $this->analysis_seo->is_enabled() ) { + add_action( 'restrict_manage_posts', [ $this, 'posts_filter_dropdown' ] ); + } + + if ( $this->analysis_readability->is_enabled() ) { + add_action( 'restrict_manage_posts', [ $this, 'posts_filter_dropdown_readability' ] ); + } + + add_filter( 'request', [ $this, 'column_sort_orderby' ] ); + add_filter( 'default_hidden_columns', [ $this, 'column_hidden' ], 10, 1 ); + } + + /** + * Adds the column headings for the SEO plugin for edit posts / pages overview. + * + * @param array $columns Already existing columns. + * + * @return array Array containing the column headings. + */ + public function column_heading( $columns ) { + if ( $this->display_metabox() === false ) { + return $columns; + } + + $added_columns = []; + + if ( $this->analysis_seo->is_enabled() ) { + $added_columns['wpseo-score'] = '' + . __( 'SEO score', 'wordpress-seo' ) + . ''; + } + + if ( $this->analysis_readability->is_enabled() ) { + $added_columns['wpseo-score-readability'] = '' + . __( 'Readability score', 'wordpress-seo' ) + . ''; + } + + $added_columns['wpseo-title'] = __( 'SEO Title', 'wordpress-seo' ); + $added_columns['wpseo-metadesc'] = __( 'Meta Desc.', 'wordpress-seo' ); + + if ( $this->analysis_seo->is_enabled() ) { + $added_columns['wpseo-focuskw'] = __( 'Keyphrase', 'wordpress-seo' ); + } + + return array_merge( $columns, $added_columns ); + } + + /** + * Displays the column content for the given column. + * + * @param string $column_name Column to display the content for. + * @param int $post_id Post to display the column content for. + * + * @return void + */ + public function column_content( $column_name, $post_id ) { + if ( $this->display_metabox() === false ) { + return; + } + + switch ( $column_name ) { + case 'wpseo-score': + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Correctly escaped in render_score_indicator() method. + echo $this->parse_column_score( $post_id ); + + return; + + case 'wpseo-score-readability': + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Correctly escaped in render_score_indicator() method. + echo $this->parse_column_score_readability( $post_id ); + + return; + + case 'wpseo-title': + $meta = $this->get_meta( $post_id ); + if ( $meta ) { + echo esc_html( $meta->title ); + } + + return; + + case 'wpseo-metadesc': + $metadesc_val = ''; + $meta = $this->get_meta( $post_id ); + if ( $meta ) { + $metadesc_val = $meta->meta_description; + } + if ( $metadesc_val === '' ) { + echo '', + /* translators: Hidden accessibility text. */ + esc_html__( 'Meta description not set.', 'wordpress-seo' ), + ''; + + return; + } + + echo esc_html( $metadesc_val ); + + return; + + case 'wpseo-focuskw': + $focuskw_val = WPSEO_Meta::get_value( 'focuskw', $post_id ); + + if ( $focuskw_val === '' ) { + echo '', + /* translators: Hidden accessibility text. */ + esc_html__( 'Focus keyphrase not set.', 'wordpress-seo' ), + ''; + + return; + } + + echo esc_html( $focuskw_val ); + + return; + } + } + + /** + * Indicates which of the SEO columns are sortable. + * + * @param array $columns Appended with their orderby variable. + * + * @return array Array containing the sortable columns. + */ + public function column_sort( $columns ) { + if ( $this->display_metabox() === false ) { + return $columns; + } + + $columns['wpseo-metadesc'] = 'wpseo-metadesc'; + + if ( $this->analysis_seo->is_enabled() ) { + $columns['wpseo-focuskw'] = 'wpseo-focuskw'; + $columns['wpseo-score'] = 'wpseo-score'; + } + + if ( $this->analysis_readability->is_enabled() ) { + $columns['wpseo-score-readability'] = 'wpseo-score-readability'; + } + + return $columns; + } + + /** + * Hides the SEO title, meta description and focus keyword columns if the user hasn't chosen which columns to hide. + * + * @param array $hidden The hidden columns. + * + * @return array Array containing the columns to hide. + */ + public function column_hidden( $hidden ) { + if ( ! is_array( $hidden ) ) { + $hidden = []; + } + + array_push( $hidden, 'wpseo-title', 'wpseo-metadesc' ); + + if ( $this->analysis_seo->is_enabled() ) { + $hidden[] = 'wpseo-focuskw'; + } + + return $hidden; + } + + /** + * Adds a dropdown that allows filtering on the posts SEO Quality. + * + * @return void + */ + public function posts_filter_dropdown() { + if ( ! $this->can_display_filter() ) { + return; + } + + $ranks = WPSEO_Rank::get_all_ranks(); + + /* translators: Hidden accessibility text. */ + echo ''; + echo ''; + } + + /** + * Adds a dropdown that allows filtering on the posts Readability Quality. + * + * @return void + */ + public function posts_filter_dropdown_readability() { + if ( ! $this->can_display_filter() ) { + return; + } + + $ranks = WPSEO_Rank::get_all_readability_ranks(); + + /* translators: Hidden accessibility text. */ + echo ''; + echo ''; + } + + /** + * Generates an '; + } + + /** + * Returns the meta object for a given post ID. + * + * @param int $post_id The post ID. + * + * @return Meta The meta object. + */ + protected function get_meta( $post_id ) { + $indexable = $this->admin_columns_cache->get_indexable( $post_id ); + + return YoastSEO()->meta->for_indexable( $indexable, 'Post_Type' ); + } + + /** + * Determines the SEO score filter to be later used in the meta query, based on the passed SEO filter. + * + * @param string $seo_filter The SEO filter to use to determine what further filter to apply. + * + * @return array The SEO score filter. + */ + protected function determine_seo_filters( $seo_filter ) { + if ( $seo_filter === WPSEO_Rank::NO_FOCUS ) { + return $this->create_no_focus_keyword_filter(); + } + + if ( $seo_filter === WPSEO_Rank::NO_INDEX ) { + return $this->create_no_index_filter(); + } + + $rank = new WPSEO_Rank( $seo_filter ); + + return $this->create_seo_score_filter( $rank->get_starting_score(), $rank->get_end_score() ); + } + + /** + * Determines the Readability score filter to the meta query, based on the passed Readability filter. + * + * @param string $readability_filter The Readability filter to use to determine what further filter to apply. + * + * @return array The Readability score filter. + */ + protected function determine_readability_filters( $readability_filter ) { + $rank = new WPSEO_Rank( $readability_filter ); + + return $this->create_readability_score_filter( $rank->get_starting_score(), $rank->get_end_score() ); + } + + /** + * Creates a keyword filter for the meta query, based on the passed Keyword filter. + * + * @param string $keyword_filter The keyword filter to use. + * + * @return array The keyword filter. + */ + protected function get_keyword_filter( $keyword_filter ) { + return [ + 'post_type' => get_query_var( 'post_type', 'post' ), + 'key' => WPSEO_Meta::$meta_prefix . 'focuskw', + 'value' => sanitize_text_field( $keyword_filter ), + ]; + } + + /** + * Determines whether the passed filter is considered to be valid. + * + * @param mixed $filter The filter to check against. + * + * @return bool Whether the filter is considered valid. + */ + protected function is_valid_filter( $filter ) { + return ! empty( $filter ) && is_string( $filter ); + } + + /** + * Collects the filters and merges them into a single array. + * + * @return array Array containing all the applicable filters. + */ + protected function collect_filters() { + $active_filters = []; + + $seo_filter = $this->get_current_seo_filter(); + $readability_filter = $this->get_current_readability_filter(); + $current_keyword_filter = $this->get_current_keyword_filter(); + + if ( $this->is_valid_filter( $seo_filter ) ) { + $active_filters = array_merge( + $active_filters, + $this->determine_seo_filters( $seo_filter ) + ); + } + + if ( $this->is_valid_filter( $readability_filter ) ) { + $active_filters = array_merge( + $active_filters, + $this->determine_readability_filters( $readability_filter ) + ); + } + + if ( $this->is_valid_filter( $current_keyword_filter ) ) { + /** + * Adapt the meta query used to filter the post overview on keyphrase. + * + * @internal + * + * @param array $keyphrase The keyphrase used in the filter. + * @param array $keyword_filter The current keyword filter. + */ + $keyphrase_filter = apply_filters( + 'wpseo_change_keyphrase_filter_in_request', + $this->get_keyword_filter( $current_keyword_filter ), + $current_keyword_filter + ); + + if ( is_array( $keyphrase_filter ) ) { + $active_filters = array_merge( + $active_filters, + [ $keyphrase_filter ] + ); + } + } + + /** + * Adapt the active applicable filters on the posts overview. + * + * @internal + * + * @param array $active_filters The current applicable filters. + */ + return apply_filters( 'wpseo_change_applicable_filters', $active_filters ); + } + + /** + * Modify the query based on the filters that are being passed. + * + * @param array $vars Query variables that need to be modified based on the filters. + * + * @return array Array containing the meta query to use for filtering the posts overview. + */ + public function column_sort_orderby( $vars ) { + $collected_filters = $this->collect_filters(); + + $order_by_column = $vars['orderby']; + if ( isset( $order_by_column ) ) { + // Based on the selected column, create a meta query. + $order_by = $this->filter_order_by( $order_by_column ); + + /** + * Adapt the order by part of the query on the posts overview. + * + * @internal + * + * @param array $order_by The current order by. + * @param string $order_by_column The current order by column. + */ + $order_by = apply_filters( 'wpseo_change_order_by', $order_by, $order_by_column ); + + $vars = array_merge( $vars, $order_by ); + } + + return $this->build_filter_query( $vars, $collected_filters ); + } + + /** + * Retrieves the meta robots query values to be used within the meta query. + * + * @return array Array containing the query parameters regarding meta robots. + */ + protected function get_meta_robots_query_values() { + return [ + 'relation' => 'OR', + [ + 'key' => WPSEO_Meta::$meta_prefix . 'meta-robots-noindex', + 'compare' => 'NOT EXISTS', + ], + [ + 'key' => WPSEO_Meta::$meta_prefix . 'meta-robots-noindex', + 'value' => '1', + 'compare' => '!=', + ], + ]; + } + + /** + * Determines the score filters to be used. If more than one is passed, it created an AND statement for the query. + * + * @param array $score_filters Array containing the score filters. + * + * @return array Array containing the score filters that need to be applied to the meta query. + */ + protected function determine_score_filters( $score_filters ) { + if ( count( $score_filters ) > 1 ) { + return array_merge( [ 'relation' => 'AND' ], $score_filters ); + } + + return $score_filters; + } + + /** + * Retrieves the post type from the $_GET variable. + * + * @return string|null The sanitized current post type or null when the variable is not set in $_GET. + */ + public function get_current_post_type() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + if ( isset( $_GET['post_type'] ) && is_string( $_GET['post_type'] ) ) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + return sanitize_text_field( wp_unslash( $_GET['post_type'] ) ); + } + return null; + } + + /** + * Retrieves the SEO filter from the $_GET variable. + * + * @return string|null The sanitized seo filter or null when the variable is not set in $_GET. + */ + public function get_current_seo_filter() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + if ( isset( $_GET['seo_filter'] ) && is_string( $_GET['seo_filter'] ) ) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + return sanitize_text_field( wp_unslash( $_GET['seo_filter'] ) ); + } + return null; + } + + /** + * Retrieves the Readability filter from the $_GET variable. + * + * @return string|null The sanitized readability filter or null when the variable is not set in $_GET. + */ + public function get_current_readability_filter() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + if ( isset( $_GET['readability_filter'] ) && is_string( $_GET['readability_filter'] ) ) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + return sanitize_text_field( wp_unslash( $_GET['readability_filter'] ) ); + } + return null; + } + + /** + * Retrieves the keyword filter from the $_GET variable. + * + * @return string|null The sanitized seo keyword filter or null when the variable is not set in $_GET. + */ + public function get_current_keyword_filter() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + if ( isset( $_GET['seo_kw_filter'] ) && is_string( $_GET['seo_kw_filter'] ) ) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + return sanitize_text_field( wp_unslash( $_GET['seo_kw_filter'] ) ); + } + return null; + } + + /** + * Uses the vars to create a complete filter query that can later be executed to filter out posts. + * + * @param array $vars Array containing the variables that will be used in the meta query. + * @param array $filters Array containing the filters that we need to apply in the meta query. + * + * @return array Array containing the complete filter query. + */ + protected function build_filter_query( $vars, $filters ) { + // If no filters were applied, just return everything. + if ( count( $filters ) === 0 ) { + return $vars; + } + + $result = [ 'meta_query' => [] ]; + $result['meta_query'] = array_merge( $result['meta_query'], [ $this->determine_score_filters( $filters ) ] ); + + $current_seo_filter = $this->get_current_seo_filter(); + + // This only applies for the SEO score filter because it can because the SEO score can be altered by the no-index option. + if ( $this->is_valid_filter( $current_seo_filter ) && ! in_array( $current_seo_filter, [ WPSEO_Rank::NO_INDEX, WPSEO_Rank::NO_FOCUS ], true ) ) { + $result['meta_query'] = array_merge( $result['meta_query'], [ $this->get_meta_robots_query_values() ] ); + } + + return array_merge( $vars, $result ); + } + + /** + * Creates a Readability score filter. + * + * @param number $low The lower boundary of the score. + * @param number $high The higher boundary of the score. + * + * @return array The Readability Score filter. + */ + protected function create_readability_score_filter( $low, $high ) { + return [ + [ + 'key' => WPSEO_Meta::$meta_prefix . 'content_score', + 'value' => [ $low, $high ], + 'type' => 'numeric', + 'compare' => 'BETWEEN', + ], + ]; + } + + /** + * Creates an SEO score filter. + * + * @param number $low The lower boundary of the score. + * @param number $high The higher boundary of the score. + * + * @return array The SEO score filter. + */ + protected function create_seo_score_filter( $low, $high ) { + return [ + [ + 'key' => WPSEO_Meta::$meta_prefix . 'linkdex', + 'value' => [ $low, $high ], + 'type' => 'numeric', + 'compare' => 'BETWEEN', + ], + ]; + } + + /** + * Creates a filter to retrieve posts that were set to no-index. + * + * @return array Array containin the no-index filter. + */ + protected function create_no_index_filter() { + return [ + [ + 'key' => WPSEO_Meta::$meta_prefix . 'meta-robots-noindex', + 'value' => '1', + 'compare' => '=', + ], + ]; + } + + /** + * Creates a filter to retrieve posts that have no keyword set. + * + * @return array Array containing the no focus keyword filter. + */ + protected function create_no_focus_keyword_filter() { + return [ + [ + 'key' => WPSEO_Meta::$meta_prefix . 'meta-robots-noindex', + 'value' => 'needs-a-value-anyway', + 'compare' => 'NOT EXISTS', + ], + [ + 'key' => WPSEO_Meta::$meta_prefix . 'linkdex', + 'value' => 'needs-a-value-anyway', + 'compare' => 'NOT EXISTS', + ], + ]; + } + + /** + * Determines whether a particular post_id is of an indexable post type. + * + * @param string $post_id The post ID to check. + * + * @return bool Whether or not it is indexable. + */ + protected function is_indexable( $post_id ) { + if ( ! empty( $post_id ) && ! $this->uses_default_indexing( $post_id ) ) { + return WPSEO_Meta::get_value( 'meta-robots-noindex', $post_id ) === '2'; + } + + $post = get_post( $post_id ); + + if ( is_object( $post ) ) { + // If the option is false, this means we want to index it. + return WPSEO_Options::get( 'noindex-' . $post->post_type, false ) === false; + } + + return true; + } + + /** + * Determines whether the given post ID uses the default indexing settings. + * + * @param int $post_id The post ID to check. + * + * @return bool Whether or not the default indexing is being used for the post. + */ + protected function uses_default_indexing( $post_id ) { + return WPSEO_Meta::get_value( 'meta-robots-noindex', $post_id ) === '0'; + } + + /** + * Returns filters when $order_by is matched in the if-statement. + * + * @param string $order_by The ID of the column by which to order the posts. + * + * @return array Array containing the order filters. + */ + private function filter_order_by( $order_by ) { + switch ( $order_by ) { + case 'wpseo-metadesc': + return [ + // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key -- Reason: Only used when user requests sorting. + 'meta_key' => WPSEO_Meta::$meta_prefix . 'metadesc', + 'orderby' => 'meta_value', + ]; + + case 'wpseo-focuskw': + return [ + // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key -- Reason: Only used when user requests sorting. + 'meta_key' => WPSEO_Meta::$meta_prefix . 'focuskw', + 'orderby' => 'meta_value', + ]; + + case 'wpseo-score': + return [ + // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key -- Reason: Only used when user requests sorting. + 'meta_key' => WPSEO_Meta::$meta_prefix . 'linkdex', + 'orderby' => 'meta_value_num', + ]; + + case 'wpseo-score-readability': + return [ + // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key -- Reason: Only used when user requests sorting. + 'meta_key' => WPSEO_Meta::$meta_prefix . 'content_score', + 'orderby' => 'meta_value_num', + ]; + } + + return []; + } + + /** + * Parses the score column. + * + * @param int $post_id The ID of the post for which to show the score. + * + * @return string The HTML for the SEO score indicator. + */ + private function parse_column_score( $post_id ) { + $meta = $this->get_meta( $post_id ); + + if ( $meta ) { + return $this->score_icon_helper->for_seo( $meta->indexable, '', __( 'Post is set to noindex.', 'wordpress-seo' ) ); + } + } + + /** + * Parsing the readability score column. + * + * @param int $post_id The ID of the post for which to show the readability score. + * + * @return string The HTML for the readability score indicator. + */ + private function parse_column_score_readability( $post_id ) { + $meta = $this->get_meta( $post_id ); + if ( $meta ) { + return $this->score_icon_helper->for_readability( $meta->indexable->readability_score ); + } + } + + /** + * Sets up the hooks for the post_types. + * + * @return void + */ + private function set_post_type_hooks() { + $post_types = WPSEO_Post_Type::get_accessible_post_types(); + + if ( ! is_array( $post_types ) || $post_types === [] ) { + return; + } + + foreach ( $post_types as $post_type ) { + if ( $this->display_metabox( $post_type ) === false ) { + continue; + } + + add_filter( 'manage_' . $post_type . '_posts_columns', [ $this, 'column_heading' ], 10, 1 ); + add_action( 'manage_' . $post_type . '_posts_custom_column', [ $this, 'column_content' ], 10, 2 ); + add_action( 'manage_edit-' . $post_type . '_sortable_columns', [ $this, 'column_sort' ], 10, 2 ); + } + + unset( $post_type ); + } + + /** + * Wraps the WPSEO_Metabox check to determine whether the metabox should be displayed either by + * choice of the admin or because the post type is not a public post type. + * + * @since 7.0 + * + * @param string|null $post_type Optional. The post type to test, defaults to the current post post_type. + * + * @return bool Whether or not the meta box (and associated columns etc) should be hidden. + */ + private function display_metabox( $post_type = null ) { + $current_post_type = $this->get_current_post_type(); + + if ( ! isset( $post_type ) && ! empty( $current_post_type ) ) { + $post_type = $current_post_type; + } + + return WPSEO_Utils::is_metabox_active( $post_type, 'post_type' ); + } + + /** + * Determines whether or not filter dropdowns should be displayed. + * + * @return bool Whether or the current page can display the filter drop downs. + */ + public function can_display_filter() { + if ( $GLOBALS['pagenow'] === 'upload.php' ) { + return false; + } + + if ( $this->display_metabox() === false ) { + return false; + } + + $screen = get_current_screen(); + if ( $screen === null ) { + return false; + } + + return WPSEO_Post_Type::is_post_type_accessible( $screen->post_type ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-my-yoast-proxy.php b/wp-content/plugins/wordpress-seo/admin/class-my-yoast-proxy.php new file mode 100644 index 00000000..53659c12 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-my-yoast-proxy.php @@ -0,0 +1,219 @@ +is_proxy_page() ) { + return; + } + + // Register the page for the proxy. + add_action( 'admin_menu', [ $this, 'add_proxy_page' ] ); + add_action( 'admin_init', [ $this, 'handle_proxy_page' ] ); + } + + /** + * Registers the proxy page. It does not actually add a link to the dashboard. + * + * @codeCoverageIgnore + * + * @return void + */ + public function add_proxy_page() { + add_dashboard_page( '', '', 'read', self::PAGE_IDENTIFIER, '' ); + } + + /** + * Renders the requested proxy page and exits to prevent the WordPress UI from loading. + * + * @codeCoverageIgnore + * + * @return void + */ + public function handle_proxy_page() { + $this->render_proxy_page(); + + // Prevent the WordPress UI from loading. + exit; + } + + /** + * Renders the requested proxy page. + * + * This is separated from the exits to be able to test it. + * + * @return void + */ + public function render_proxy_page() { + $proxy_options = $this->determine_proxy_options(); + if ( $proxy_options === [] ) { + // Do not accept any other file than implemented. + $this->set_header( 'HTTP/1.0 501 Requested file not implemented' ); + return; + } + + // Set the headers before serving the remote file. + $this->set_header( 'Content-Type: ' . $proxy_options['content_type'] ); + $this->set_header( 'Cache-Control: max-age=' . self::CACHE_CONTROL_MAX_AGE ); + + try { + echo $this->get_remote_url_body( $proxy_options['url'] ); + } + catch ( Exception $e ) { + /* + * Reset the file headers because the loading failed. + * + * Note: Due to supporting PHP 5.2 `header_remove` can not be used here. + * Overwrite the headers instead. + */ + $this->set_header( 'Content-Type: text/plain' ); + $this->set_header( 'Cache-Control: max-age=0' ); + + $this->set_header( 'HTTP/1.0 500 ' . $e->getMessage() ); + } + } + + /** + * Tries to load the given url via `wp_remote_get`. + * + * @codeCoverageIgnore + * + * @param string $url The url to load. + * + * @return string The body of the response. + * + * @throws Exception When `wp_remote_get` returned an error. + * @throws Exception When the response code is not 200. + */ + protected function get_remote_url_body( $url ) { + $response = wp_remote_get( $url ); + + if ( $response instanceof WP_Error ) { + throw new Exception( 'Unable to retrieve file from MyYoast' ); + } + + if ( wp_remote_retrieve_response_code( $response ) !== 200 ) { + throw new Exception( 'Received unexpected response from MyYoast' ); + } + + return wp_remote_retrieve_body( $response ); + } + + /** + * Determines the proxy options based on the file and plugin version arguments. + * + * When the file is known it returns an array like this: + * + * $array = array( + * 'content_type' => 'the content type' + * 'url' => 'the url, possibly with the plugin version' + * ) + * + * + * @return array Empty for an unknown file. See format above for known files. + */ + protected function determine_proxy_options() { + if ( $this->get_proxy_file() === 'research-webworker' ) { + return [ + 'content_type' => 'text/javascript; charset=UTF-8', + 'url' => 'https://my.yoast.com/api/downloads/file/analysis-worker?plugin_version=' . $this->get_plugin_version(), + ]; + } + + return []; + } + + /** + * Checks if the current page is the MyYoast proxy page. + * + * @codeCoverageIgnore + * + * @return bool True when the page request parameter equals the proxy page. + */ + protected function is_proxy_page() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + $page = isset( $_GET['page'] ) && is_string( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : ''; + return $page === self::PAGE_IDENTIFIER; + } + + /** + * Returns the proxy file from the HTTP request parameters. + * + * @codeCoverageIgnore + * + * @return string The sanitized file request parameter or an empty string if it does not exist. + */ + protected function get_proxy_file() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + if ( isset( $_GET['file'] ) && is_string( $_GET['file'] ) ) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + return sanitize_text_field( wp_unslash( $_GET['file'] ) ); + } + return ''; + } + + /** + * Returns the plugin version from the HTTP request parameters. + * + * @codeCoverageIgnore + * + * @return string The sanitized plugin_version request parameter or an empty string if it does not exist. + */ + protected function get_plugin_version() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + if ( isset( $_GET['plugin_version'] ) && is_string( $_GET['plugin_version'] ) ) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + $plugin_version = sanitize_text_field( wp_unslash( $_GET['plugin_version'] ) ); + // Replace slashes to secure against requiring a file from another path. + return str_replace( [ '/', '\\' ], '_', $plugin_version ); + } + return ''; + } + + /** + * Sets the HTTP header. + * + * This is a tiny helper function to enable better testing. + * + * @codeCoverageIgnore + * + * @param string $header The header to set. + * + * @return void + */ + protected function set_header( $header ) { + header( $header ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-option-tab.php b/wp-content/plugins/wordpress-seo/admin/class-option-tab.php new file mode 100644 index 00000000..4a231258 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-option-tab.php @@ -0,0 +1,112 @@ +name = sanitize_title( $name ); + $this->label = $label; + $this->arguments = $arguments; + } + + /** + * Gets the name. + * + * @return string The name. + */ + public function get_name() { + return $this->name; + } + + /** + * Gets the label. + * + * @return string The label. + */ + public function get_label() { + return $this->label; + } + + /** + * Retrieves whether the tab needs a save button. + * + * @return bool True whether the tabs needs a save button. + */ + public function has_save_button() { + return (bool) $this->get_argument( 'save_button', true ); + } + + /** + * Retrieves whether the tab hosts beta functionalities. + * + * @return bool True whether the tab hosts beta functionalities. + */ + public function is_beta() { + return (bool) $this->get_argument( 'beta', false ); + } + + /** + * Retrieves whether the tab hosts premium functionalities. + * + * @return bool True whether the tab hosts premium functionalities. + */ + public function is_premium() { + return (bool) $this->get_argument( 'premium', false ); + } + + /** + * Gets the option group. + * + * @return string The option group. + */ + public function get_opt_group() { + return $this->get_argument( 'opt_group' ); + } + + /** + * Retrieves the variable from the supplied arguments. + * + * @param string $variable Variable to retrieve. + * @param string|mixed $default_value Default to use when variable not found. + * + * @return mixed|string The retrieved variable. + */ + protected function get_argument( $variable, $default_value = '' ) { + return array_key_exists( $variable, $this->arguments ) ? $this->arguments[ $variable ] : $default_value; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-option-tabs-formatter.php b/wp-content/plugins/wordpress-seo/admin/class-option-tabs-formatter.php new file mode 100644 index 00000000..5a54266f --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-option-tabs-formatter.php @@ -0,0 +1,93 @@ +get_base() . '/' . $tab->get_name() . '.php'; + } + + /** + * Outputs the option tabs. + * + * @param WPSEO_Option_Tabs $option_tabs Option Tabs to get tabs from. + * + * @return void + */ + public function run( WPSEO_Option_Tabs $option_tabs ) { + + echo ''; + + foreach ( $option_tabs->get_tabs() as $tab ) { + $identifier = $tab->get_name(); + + $class = 'wpseotab ' . ( $tab->has_save_button() ? 'save' : 'nosave' ); + printf( '
', esc_attr( $identifier ), esc_attr( $class ) ); + + $tab_filter_name = sprintf( '%s_%s', $option_tabs->get_base(), $tab->get_name() ); + + /** + * Allows to override the content that is display on the specific option tab. + * + * @internal For internal Yoast SEO use only. + * + * @param string|null $tab_contents The content that should be displayed for this tab. Leave empty for default behaviour. + * @param WPSEO_Option_Tabs $option_tabs The registered option tabs. + * @param WPSEO_Option_Tab $tab The tab that is being displayed. + */ + $option_tab_content = apply_filters( 'wpseo_option_tab-' . $tab_filter_name, null, $option_tabs, $tab ); + if ( ! empty( $option_tab_content ) ) { + echo wp_kses_post( $option_tab_content ); + } + + if ( empty( $option_tab_content ) ) { + // Output the settings view for all tabs. + $tab_view = $this->get_tab_view( $option_tabs, $tab ); + + if ( is_file( $tab_view ) ) { + $yform = Yoast_Form::get_instance(); + require $tab_view; + } + } + + echo '
'; + } + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-option-tabs.php b/wp-content/plugins/wordpress-seo/admin/class-option-tabs.php new file mode 100644 index 00000000..fb0c4512 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-option-tabs.php @@ -0,0 +1,124 @@ +base = sanitize_title( $base ); + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + $tab = isset( $_GET['tab'] ) && is_string( $_GET['tab'] ) ? sanitize_text_field( wp_unslash( $_GET['tab'] ) ) : ''; + $this->active_tab = empty( $tab ) ? $active_tab : $tab; + } + + /** + * Get the base. + * + * @return string + */ + public function get_base() { + return $this->base; + } + + /** + * Add a tab. + * + * @param WPSEO_Option_Tab $tab Tab to add. + * + * @return $this + */ + public function add_tab( WPSEO_Option_Tab $tab ) { + $this->tabs[] = $tab; + + return $this; + } + + /** + * Get active tab. + * + * @return WPSEO_Option_Tab|null Get the active tab. + */ + public function get_active_tab() { + if ( empty( $this->active_tab ) ) { + return null; + } + + $active_tabs = array_filter( $this->tabs, [ $this, 'is_active_tab' ] ); + if ( ! empty( $active_tabs ) ) { + $active_tabs = array_values( $active_tabs ); + if ( count( $active_tabs ) === 1 ) { + return $active_tabs[0]; + } + } + + return null; + } + + /** + * Is the tab the active tab. + * + * @param WPSEO_Option_Tab $tab Tab to check for active tab. + * + * @return bool + */ + public function is_active_tab( WPSEO_Option_Tab $tab ) { + return ( $tab->get_name() === $this->active_tab ); + } + + /** + * Get all tabs. + * + * @return WPSEO_Option_Tab[] + */ + public function get_tabs() { + return $this->tabs; + } + + /** + * Display the tabs. + * + * @param Yoast_Form $yform Yoast Form needed in the views. + * + * @return void + */ + public function display( Yoast_Form $yform ) { + $formatter = new WPSEO_Option_Tabs_Formatter(); + $formatter->run( $this, $yform ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-paper-presenter.php b/wp-content/plugins/wordpress-seo/admin/class-paper-presenter.php new file mode 100644 index 00000000..99550e4a --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-paper-presenter.php @@ -0,0 +1,141 @@ + null, + 'paper_id_prefix' => 'wpseo-', + 'collapsible' => false, + 'collapsible_header_class' => '', + 'expanded' => false, + 'help_text' => '', + 'title_after' => '', + 'class' => '', + 'content' => '', + 'view_data' => [], + ]; + + $this->settings = wp_parse_args( $settings, $defaults ); + $this->title = $title; + $this->view_file = $view_file; + } + + /** + * Renders the collapsible paper and returns it as a string. + * + * @return string The rendered paper. + */ + public function get_output() { + $view_variables = $this->get_view_variables(); + + extract( $view_variables, EXTR_SKIP ); + + $content = $this->settings['content']; + + if ( $this->view_file !== null ) { + ob_start(); + require $this->view_file; + $content = ob_get_clean(); + } + + ob_start(); + require WPSEO_PATH . 'admin/views/paper-collapsible.php'; + $rendered_output = ob_get_clean(); + + return $rendered_output; + } + + /** + * Retrieves the view variables. + * + * @return array The view variables. + */ + private function get_view_variables() { + if ( $this->settings['help_text'] instanceof WPSEO_Admin_Help_Panel === false ) { + $this->settings['help_text'] = new WPSEO_Admin_Help_Panel( '', '', '' ); + } + + $view_variables = [ + 'class' => $this->settings['class'], + 'collapsible' => $this->settings['collapsible'], + 'collapsible_config' => $this->collapsible_config(), + 'collapsible_header_class' => $this->settings['collapsible_header_class'], + 'title_after' => $this->settings['title_after'], + 'help_text' => $this->settings['help_text'], + 'view_file' => $this->view_file, + 'title' => $this->title, + 'paper_id' => $this->settings['paper_id'], + 'paper_id_prefix' => $this->settings['paper_id_prefix'], + 'yform' => Yoast_Form::get_instance(), + ]; + + return array_merge( $this->settings['view_data'], $view_variables ); + } + + /** + * Retrieves the collapsible config based on the settings. + * + * @return array The config. + */ + protected function collapsible_config() { + if ( empty( $this->settings['collapsible'] ) ) { + return [ + 'toggle_icon' => '', + 'class' => '', + 'expanded' => '', + ]; + } + + if ( ! empty( $this->settings['expanded'] ) ) { + return [ + 'toggle_icon' => 'dashicons-arrow-up-alt2', + 'class' => 'toggleable-container', + 'expanded' => 'true', + ]; + } + + return [ + 'toggle_icon' => 'dashicons-arrow-down-alt2', + 'class' => 'toggleable-container toggleable-container-hidden', + 'expanded' => 'false', + ]; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-plugin-availability.php b/wp-content/plugins/wordpress-seo/admin/class-plugin-availability.php new file mode 100644 index 00000000..4d321dd6 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-plugin-availability.php @@ -0,0 +1,336 @@ +register_yoast_plugins(); + $this->register_yoast_plugins_status(); + } + + /** + * Registers all the available Yoast SEO plugins. + * + * @return void + */ + protected function register_yoast_plugins() { + $this->plugins = [ + 'yoast-seo-premium' => [ + 'url' => WPSEO_Shortlinker::get( 'https://yoa.st/1y7' ), + 'title' => 'Yoast SEO Premium', + 'description' => sprintf( + /* translators: %1$s expands to Yoast SEO */ + __( 'The premium version of %1$s with more features & support.', 'wordpress-seo' ), + 'Yoast SEO' + ), + 'installed' => false, + 'slug' => 'wordpress-seo-premium/wp-seo-premium.php', + 'version_sync' => true, + 'premium' => true, + ], + + 'video-seo-for-wordpress-seo-by-yoast' => [ + 'url' => WPSEO_Shortlinker::get( 'https://yoa.st/1y8' ), + 'title' => 'Video SEO', + 'description' => __( 'Optimize your videos to show them off in search results and get more clicks!', 'wordpress-seo' ), + 'installed' => false, + 'slug' => 'wpseo-video/video-seo.php', + 'version_sync' => true, + 'premium' => true, + ], + + 'yoast-news-seo' => [ + 'url' => WPSEO_Shortlinker::get( 'https://yoa.st/1y9' ), + 'title' => 'News SEO', + 'description' => __( 'Are you in Google News? Increase your traffic from Google News by optimizing for it!', 'wordpress-seo' ), + 'installed' => false, + 'slug' => 'wpseo-news/wpseo-news.php', + 'version_sync' => true, + 'premium' => true, + ], + + 'local-seo-for-yoast-seo' => [ + 'url' => WPSEO_Shortlinker::get( 'https://yoa.st/1ya' ), + 'title' => 'Local SEO', + 'description' => __( 'Rank better locally and in Google Maps, without breaking a sweat!', 'wordpress-seo' ), + 'installed' => false, + 'slug' => 'wordpress-seo-local/local-seo.php', + 'version_sync' => true, + 'premium' => true, + ], + + 'yoast-woocommerce-seo' => [ + 'url' => WPSEO_Shortlinker::get( 'https://yoa.st/1o0' ), + 'title' => 'Yoast WooCommerce SEO', + 'description' => sprintf( + /* translators: %1$s expands to Yoast SEO */ + __( 'Seamlessly integrate WooCommerce with %1$s and get extra features!', 'wordpress-seo' ), + 'Yoast SEO' + ), + '_dependencies' => [ + 'WooCommerce' => [ + 'slug' => 'woocommerce/woocommerce.php', // Kept for backwards compatibility, in case external code uses get_dependencies(). Deprecated in 22.4. + 'conditional' => new WooCommerce_Conditional(), + ], + ], + 'installed' => false, + 'slug' => 'wpseo-woocommerce/wpseo-woocommerce.php', + 'version_sync' => true, + 'premium' => true, + ], + ]; + } + + /** + * Sets certain plugin properties based on WordPress' status. + * + * @return void + */ + protected function register_yoast_plugins_status() { + + foreach ( $this->plugins as $name => $plugin ) { + + $plugin_slug = $plugin['slug']; + $plugin_path = WP_PLUGIN_DIR . '/' . $plugin_slug; + + if ( file_exists( $plugin_path ) ) { + $plugin_data = get_plugin_data( $plugin_path, false, false ); + $this->plugins[ $name ]['installed'] = true; + $this->plugins[ $name ]['version'] = $plugin_data['Version']; + $this->plugins[ $name ]['active'] = is_plugin_active( $plugin_slug ); + } + } + } + + /** + * Checks whether or not a plugin is known within the Yoast SEO collection. + * + * @param string $plugin The plugin to search for. + * + * @return bool Whether or not the plugin is exists. + */ + protected function plugin_exists( $plugin ) { + return isset( $this->plugins[ $plugin ] ); + } + + /** + * Gets all the possibly available plugins. + * + * @return array Array containing the information about the plugins. + */ + public function get_plugins() { + return $this->plugins; + } + + /** + * Gets a specific plugin. Returns an empty array if it cannot be found. + * + * @param string $plugin The plugin to search for. + * + * @return array The plugin properties. + */ + public function get_plugin( $plugin ) { + if ( ! $this->plugin_exists( $plugin ) ) { + return []; + } + + return $this->plugins[ $plugin ]; + } + + /** + * Gets the version of the plugin. + * + * @param array $plugin The information available about the plugin. + * + * @return string The version associated with the plugin. + */ + public function get_version( $plugin ) { + if ( ! isset( $plugin['version'] ) ) { + return ''; + } + + return $plugin['version']; + } + + /** + * Checks if there are dependencies available for the plugin. + * + * @param array $plugin The information available about the plugin. + * + * @return bool Whether or not there is a dependency present. + */ + public function has_dependencies( $plugin ) { + return ( isset( $plugin['_dependencies'] ) && ! empty( $plugin['_dependencies'] ) ); + } + + /** + * Gets the dependencies for the plugin. + * + * @param array $plugin The information available about the plugin. + * + * @return array Array containing all the dependencies associated with the plugin. + */ + public function get_dependencies( $plugin ) { + if ( ! $this->has_dependencies( $plugin ) ) { + return []; + } + + return $plugin['_dependencies']; + } + + /** + * Checks if all dependencies are satisfied. + * + * @param array $plugin The information available about the plugin. + * + * @return bool Whether or not the dependencies are satisfied. + */ + public function dependencies_are_satisfied( $plugin ) { + if ( ! $this->has_dependencies( $plugin ) ) { + return true; + } + + $dependencies = $this->get_dependencies( $plugin ); + $active_dependencies = array_filter( $dependencies, [ $this, 'is_dependency_active' ] ); + + return count( $active_dependencies ) === count( $dependencies ); + } + + /** + * Checks whether or not one of the plugins is properly installed and usable. + * + * @param array $plugin The information available about the plugin. + * + * @return bool Whether or not the plugin is properly installed. + */ + public function is_installed( $plugin ) { + if ( empty( $plugin ) ) { + return false; + } + + return $this->is_available( $plugin ); + } + + /** + * Gets all installed plugins. + * + * @return array The installed plugins. + */ + public function get_installed_plugins() { + $installed = []; + + foreach ( $this->plugins as $plugin_key => $plugin ) { + if ( $this->is_installed( $plugin ) ) { + $installed[ $plugin_key ] = $plugin; + } + } + + return $installed; + } + + /** + * Checks for the availability of the plugin. + * + * @param array $plugin The information available about the plugin. + * + * @return bool Whether or not the plugin is available. + */ + public function is_available( $plugin ) { + return isset( $plugin['installed'] ) && $plugin['installed'] === true; + } + + /** + * Checks whether a dependency is active. + * + * @param array $dependency The information about the dependency to look for. + * + * @return bool Whether or not the dependency is active. + */ + public function is_dependency_active( $dependency ) { + return $dependency['conditional']->is_met(); + } + + /** + * Checks whether a dependency is available. + * + * @deprecated 22.4 + * @codeCoverageIgnore + * + * @param array $dependency The information about the dependency to look for. + * + * @return bool Whether or not the dependency is available. + */ + public function is_dependency_available( $dependency ) { + _deprecated_function( __METHOD__, 'Yoast SEO 22.4' ); + + return isset( get_plugins()[ $dependency['slug'] ] ); + } + + /** + * Gets the names of the dependencies. + * + * @param array $plugin The plugin to get the dependency names from. + * + * @return array Array containing the names of the associated dependencies. + */ + public function get_dependency_names( $plugin ) { + if ( ! $this->has_dependencies( $plugin ) ) { + return []; + } + + return array_keys( $plugin['_dependencies'] ); + } + + /** + * Gets an array of plugins that have defined dependencies. + * + * @return array Array of the plugins that have dependencies. + */ + public function get_plugins_with_dependencies() { + return array_filter( $this->plugins, [ $this, 'has_dependencies' ] ); + } + + /** + * Determines whether or not a plugin is active. + * + * @param string $plugin The plugin slug to check. + * + * @return bool Whether or not the plugin is active. + */ + public function is_active( $plugin ) { + return is_plugin_active( $plugin ); + } + + /** + * Determines whether or not a plugin is a Premium product. + * + * @param array $plugin The plugin to check. + * + * @return bool Whether or not the plugin is a Premium product. + */ + public function is_premium( $plugin ) { + return isset( $plugin['premium'] ) && $plugin['premium'] === true; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-plugin-conflict.php b/wp-content/plugins/wordpress-seo/admin/class-plugin-conflict.php new file mode 100644 index 00000000..a90e8acd --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-plugin-conflict.php @@ -0,0 +1,94 @@ +> + */ + protected $plugins = [ + // The plugin which are writing OG metadata. + 'open_graph' => Conflicting_Plugins::OPEN_GRAPH_PLUGINS, + 'xml_sitemaps' => Conflicting_Plugins::XML_SITEMAPS_PLUGINS, + 'cloaking' => Conflicting_Plugins::CLOAKING_PLUGINS, + 'seo' => Conflicting_Plugins::SEO_PLUGINS, + ]; + + /** + * Overrides instance to set with this class as class. + * + * @param string $class_name Optional class name. + * + * @return Yoast_Plugin_Conflict + */ + public static function get_instance( $class_name = self::class ) { + return parent::get_instance( $class_name ); + } + + /** + * After activating any plugin, this method will be executed by a hook. + * + * If the activated plugin is conflicting with ours a notice will be shown. + * + * @param string|bool $plugin Optional plugin basename to check. + * + * @return void + */ + public static function hook_check_for_plugin_conflicts( $plugin = false ) { + // The instance of the plugin. + $instance = self::get_instance(); + + // Only add the plugin as an active plugin if $plugin isn't false. + if ( $plugin && is_string( $plugin ) ) { + $instance->add_active_plugin( $instance->find_plugin_category( $plugin ), $plugin ); + } + + $plugin_sections = []; + + // Only check for open graph problems when they are enabled. + if ( WPSEO_Options::get( 'opengraph' ) ) { + /* translators: %1$s expands to Yoast SEO, %2$s: 'Facebook' plugin name of possibly conflicting plugin with regard to creating OpenGraph output. */ + $plugin_sections['open_graph'] = __( 'Both %1$s and %2$s create Open Graph output, which might make Facebook, X, LinkedIn and other social networks use the wrong texts and images when your pages are being shared.', 'wordpress-seo' ) + . '

' + . '' + /* translators: %1$s expands to Yoast SEO. */ + . sprintf( __( 'Configure %1$s\'s Open Graph settings', 'wordpress-seo' ), 'Yoast SEO' ) + . ''; + } + + // Only check for XML conflicts if sitemaps are enabled. + if ( WPSEO_Options::get( 'enable_xml_sitemap' ) ) { + /* translators: %1$s expands to Yoast SEO, %2$s: 'Google XML Sitemaps' plugin name of possibly conflicting plugin with regard to the creation of sitemaps. */ + $plugin_sections['xml_sitemaps'] = __( 'Both %1$s and %2$s can create XML sitemaps. Having two XML sitemaps is not beneficial for search engines and might slow down your site.', 'wordpress-seo' ) + . '

' + . '' + /* translators: %1$s expands to Yoast SEO. */ + . sprintf( __( 'Toggle %1$s\'s XML Sitemap', 'wordpress-seo' ), 'Yoast SEO' ) + . ''; + } + + /* translators: %2$s expands to 'RS Head Cleaner' plugin name of possibly conflicting plugin with regard to differentiating output between search engines and normal users. */ + $plugin_sections['cloaking'] = __( 'The plugin %2$s changes your site\'s output and in doing that differentiates between search engines and normal users, a process that\'s called cloaking. We highly recommend that you disable it.', 'wordpress-seo' ); + + /* translators: %1$s expands to Yoast SEO, %2$s: 'SEO' plugin name of possibly conflicting plugin with regard to the creation of duplicate SEO meta. */ + $plugin_sections['seo'] = __( 'Both %1$s and %2$s manage the SEO of your site. Running two SEO plugins at the same time is detrimental.', 'wordpress-seo' ); + + $instance->check_plugin_conflicts( $plugin_sections ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-premium-popup.php b/wp-content/plugins/wordpress-seo/admin/class-premium-popup.php new file mode 100644 index 00000000..00887694 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-premium-popup.php @@ -0,0 +1,105 @@ +identifier = $identifier; + $this->heading_level = $heading_level; + $this->title = $title; + $this->content = $content; + $this->url = $url; + } + + /** + * Returns the premium popup as an HTML string. + * + * @param bool $popup Show this message as a popup show it straight away. + * + * @return string + */ + public function get_premium_message( $popup = true ) { + // Don't show in Premium. + if ( defined( 'WPSEO_PREMIUM_FILE' ) ) { + return ''; + } + + $assets_uri = trailingslashit( plugin_dir_url( WPSEO_FILE ) ); + + /* translators: %s expands to Yoast SEO Premium */ + $cta_text = esc_html( sprintf( __( 'Get %s', 'wordpress-seo' ), 'Yoast SEO Premium' ) ); + /* translators: Hidden accessibility text. */ + $new_tab_message = '' . esc_html__( '(Opens in a new browser tab)', 'wordpress-seo' ) . ''; + $caret_icon = ''; + $classes = ''; + if ( $popup ) { + $classes = ' hidden'; + } + $micro_copy = __( '1 year free support and updates included!', 'wordpress-seo' ); + + $popup = << + Yoast SEO + <{$this->heading_level} id="wpseo-contact-support-popup-title" class="wpseo-premium-popup-title">{$this->title}heading_level}> + {$this->content} + + {$cta_text} {$new_tab_message} {$caret_icon} +
+ {$micro_copy} + +EO_POPUP; + + return $popup; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-premium-upsell-admin-block.php b/wp-content/plugins/wordpress-seo/admin/class-premium-upsell-admin-block.php new file mode 100644 index 00000000..143d08be --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-premium-upsell-admin-block.php @@ -0,0 +1,165 @@ +hook = $hook; + } + + /** + * Registers WordPress hooks. + * + * @return void + */ + public function register_hooks() { + add_action( $this->hook, [ $this, 'render' ] ); + } + + /** + * Renders the upsell block. + * + * @return void + */ + public function render() { + $url = WPSEO_Shortlinker::get( 'https://yoa.st/17h' ); + + $arguments = [ + sprintf( + /* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */ + esc_html__( '%1$sAI%2$s: Better SEO titles and meta descriptions, faster.', 'wordpress-seo' ), + '', + '' + ), + sprintf( + /* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */ + esc_html__( '%1$sMultiple keywords%2$s: Rank higher for more searches.', 'wordpress-seo' ), + '', + '' + ), + sprintf( + /* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */ + esc_html__( '%1$sSuper fast%2$s internal linking suggestions.', 'wordpress-seo' ), + '', + '' + ), + sprintf( + /* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */ + esc_html__( '%1$sNo more broken links%2$s: Automatic redirect manager.', 'wordpress-seo' ), + '', + '' + ), + sprintf( + /* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */ + esc_html__( '%1$sAppealing social previews%2$s people actually want to click on.', 'wordpress-seo' ), + '', + '' + ), + sprintf( + /* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */ + esc_html__( '%1$s24/7 support%2$s: Also on evenings and weekends.', 'wordpress-seo' ), + '', + '' + ), + '' . esc_html__( 'No ads!', 'wordpress-seo' ) . '', + ]; + + $arguments_html = implode( '', array_map( [ $this, 'get_argument_html' ], $arguments ) ); + + $class = $this->get_html_class(); + + /* translators: %s expands to Yoast SEO Premium */ + $button_text = YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2023-promotion' ) ? esc_html__( 'Claim your 30% off now!', 'wordpress-seo' ) : sprintf( esc_html__( 'Explore %s now!', 'wordpress-seo' ), 'Yoast SEO Premium' ); + /* translators: Hidden accessibility text. */ + $button_text .= '' . esc_html__( '(Opens in a new browser tab)', 'wordpress-seo' ) . '' + . ''; + + $upgrade_button = sprintf( + '%3$s', + esc_attr( 'wpseo-' . $this->identifier . '-popup-button' ), + esc_url( $url ), + $button_text + ); + + echo '
'; + + if ( YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2023-promotion' ) ) { + $bf_label = esc_html__( 'BLACK FRIDAY', 'wordpress-seo' ); + $sale_label = esc_html__( '30% OFF', 'wordpress-seo' ); + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Already escaped above. + echo "
$bf_label $sale_label
"; + } + + echo '
'; + echo '

' + . sprintf( + /* translators: %s expands to Yoast SEO Premium */ + esc_html__( 'Upgrade to %s', 'wordpress-seo' ), + 'Yoast SEO Premium' + ) + . '

'; + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Correctly escaped in $this->get_argument_html() method. + echo '
    ' . $arguments_html . '
'; + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Correctly escaped in $upgrade_button and $button_text above. + echo '

' . $upgrade_button . '

'; + echo '
'; + + echo '
'; + } + + /** + * Formats the argument to a HTML list item. + * + * @param string $argument The argument to format. + * + * @return string Formatted argument in HTML. + */ + protected function get_argument_html( $argument ) { + $class = $this->get_html_class(); + + return sprintf( + '
  • %2$s
  • ', + esc_attr( $class . '--argument' ), + $argument + ); + } + + /** + * Returns the HTML base class to use. + * + * @return string The HTML base class. + */ + protected function get_html_class() { + return 'yoast_' . $this->identifier; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-primary-term-admin.php b/wp-content/plugins/wordpress-seo/admin/class-primary-term-admin.php new file mode 100644 index 00000000..85c0c888 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-primary-term-admin.php @@ -0,0 +1,274 @@ +get_primary_term_taxonomies(); + + foreach ( $taxonomies as $taxonomy ) { + $content .= $this->primary_term_field( $taxonomy->name ); + $content .= wp_nonce_field( 'save-primary-term', WPSEO_Meta::$form_prefix . 'primary_' . $taxonomy->name . '_nonce', false, false ); + } + return $content; + } + + /** + * Generates the HTML for a hidden field for a primary taxonomy. + * + * @param string $taxonomy_name The taxonomy's slug. + * + * @return string The HTML for a hidden primary taxonomy field. + */ + protected function primary_term_field( $taxonomy_name ) { + return sprintf( + '', + esc_attr( $this->generate_field_id( $taxonomy_name ) ), + esc_attr( $this->generate_field_name( $taxonomy_name ) ), + esc_attr( $this->get_primary_term( $taxonomy_name ) ) + ); + } + + /** + * Generates an id for a primary taxonomy's hidden field. + * + * @param string $taxonomy_name The taxonomy's slug. + * + * @return string The field id. + */ + protected function generate_field_id( $taxonomy_name ) { + return 'yoast-wpseo-primary-' . $taxonomy_name; + } + + /** + * Generates a name for a primary taxonomy's hidden field. + * + * @param string $taxonomy_name The taxonomy's slug. + * + * @return string The field id. + */ + protected function generate_field_name( $taxonomy_name ) { + return WPSEO_Meta::$form_prefix . 'primary_' . $taxonomy_name . '_term'; + } + + /** + * Adds primary term templates. + * + * @return void + */ + public function wp_footer() { + $taxonomies = $this->get_primary_term_taxonomies(); + + if ( ! empty( $taxonomies ) ) { + $this->include_js_templates(); + } + } + + /** + * Enqueues all the assets needed for the primary term interface. + * + * @return void + */ + public function enqueue_assets() { + global $pagenow; + + if ( ! WPSEO_Metabox::is_post_edit( $pagenow ) ) { + return; + } + + $taxonomies = $this->get_primary_term_taxonomies(); + + // Only enqueue if there are taxonomies that need a primary term. + if ( empty( $taxonomies ) ) { + return; + } + + $asset_manager = new WPSEO_Admin_Asset_Manager(); + $asset_manager->enqueue_style( 'primary-category' ); + + $mapped_taxonomies = $this->get_mapped_taxonomies_for_js( $taxonomies ); + + $data = [ + 'taxonomies' => $mapped_taxonomies, + ]; + + $asset_manager->localize_script( 'post-edit', 'wpseoPrimaryCategoryL10n', $data ); + $asset_manager->localize_script( 'post-edit-classic', 'wpseoPrimaryCategoryL10n', $data ); + } + + /** + * Gets the id of the primary term. + * + * @param string $taxonomy_name Taxonomy name for the term. + * + * @return int primary term id + */ + protected function get_primary_term( $taxonomy_name ) { + $primary_term = new WPSEO_Primary_Term( $taxonomy_name, $this->get_current_id() ); + + return $primary_term->get_primary_term(); + } + + /** + * Returns all the taxonomies for which the primary term selection is enabled. + * + * @param int|null $post_id Default current post ID. + * @return array + */ + protected function get_primary_term_taxonomies( $post_id = null ) { + if ( $post_id === null ) { + $post_id = $this->get_current_id(); + } + + $taxonomies = wp_cache_get( 'primary_term_taxonomies_' . $post_id, 'wpseo' ); + if ( $taxonomies !== false ) { + return $taxonomies; + } + + $taxonomies = $this->generate_primary_term_taxonomies( $post_id ); + + wp_cache_set( 'primary_term_taxonomies_' . $post_id, $taxonomies, 'wpseo' ); + + return $taxonomies; + } + + /** + * Includes templates file. + * + * @return void + */ + protected function include_js_templates() { + include_once WPSEO_PATH . 'admin/views/js-templates-primary-term.php'; + } + + /** + * Generates the primary term taxonomies. + * + * @param int $post_id ID of the post. + * + * @return array + */ + protected function generate_primary_term_taxonomies( $post_id ) { + $post_type = get_post_type( $post_id ); + $all_taxonomies = get_object_taxonomies( $post_type, 'objects' ); + $all_taxonomies = array_filter( $all_taxonomies, [ $this, 'filter_hierarchical_taxonomies' ] ); + + /** + * Filters which taxonomies for which the user can choose the primary term. + * + * @param array $taxonomies An array of taxonomy objects that are primary_term enabled. + * @param string $post_type The post type for which to filter the taxonomies. + * @param array $all_taxonomies All taxonomies for this post types, even ones that don't have primary term + * enabled. + */ + $taxonomies = (array) apply_filters( 'wpseo_primary_term_taxonomies', $all_taxonomies, $post_type, $all_taxonomies ); + + return $taxonomies; + } + + /** + * Creates a map of taxonomies for localization. + * + * @param array $taxonomies The taxononmies that should be mapped. + * + * @return array The mapped taxonomies. + */ + protected function get_mapped_taxonomies_for_js( $taxonomies ) { + return array_map( [ $this, 'map_taxonomies_for_js' ], $taxonomies ); + } + + /** + * Returns an array suitable for use in the javascript. + * + * @param stdClass $taxonomy The taxonomy to map. + * + * @return array The mapped taxonomy. + */ + private function map_taxonomies_for_js( $taxonomy ) { + $primary_term = $this->get_primary_term( $taxonomy->name ); + + if ( empty( $primary_term ) ) { + $primary_term = ''; + } + + $terms = get_terms( + [ + 'taxonomy' => $taxonomy->name, + 'update_term_meta_cache' => false, + 'fields' => 'id=>name', + ] + ); + + $mapped_terms_for_js = []; + foreach ( $terms as $id => $name ) { + $mapped_terms_for_js[] = [ + 'id' => $id, + 'name' => $name, + ]; + } + + return [ + 'title' => $taxonomy->labels->singular_name, + 'name' => $taxonomy->name, + 'primary' => $primary_term, + 'singularLabel' => $taxonomy->labels->singular_name, + 'fieldId' => $this->generate_field_id( $taxonomy->name ), + 'restBase' => ( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name, + 'terms' => $mapped_terms_for_js, + ]; + } + + /** + * Returns whether or not a taxonomy is hierarchical. + * + * @param stdClass $taxonomy Taxonomy object. + * + * @return bool + */ + private function filter_hierarchical_taxonomies( $taxonomy ) { + return (bool) $taxonomy->hierarchical; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-product-upsell-notice.php b/wp-content/plugins/wordpress-seo/admin/class-product-upsell-notice.php new file mode 100644 index 00000000..e5149c17 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-product-upsell-notice.php @@ -0,0 +1,231 @@ +options = $this->get_options(); + } + + /** + * Checks if the notice should be added or removed. + * + * @return void + */ + public function initialize() { + $this->remove_notification(); + } + + /** + * Sets the upgrade notice. + * + * @return void + */ + public function set_upgrade_notice() { + + if ( $this->has_first_activated_on() ) { + return; + } + + $this->set_first_activated_on(); + $this->add_notification(); + } + + /** + * Listener for the upsell notice. + * + * @return void + */ + public function dismiss_notice_listener() { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are validating a nonce here. + if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( $_GET['_wpnonce'], 'dismiss-5star-upsell' ) ) { + return; + } + + $dismiss_upsell = isset( $_GET['yoast_dismiss'] ) && is_string( $_GET['yoast_dismiss'] ) ? sanitize_text_field( wp_unslash( $_GET['yoast_dismiss'] ) ) : ''; + + if ( $dismiss_upsell !== 'upsell' ) { + return; + } + + $this->dismiss_notice(); + + if ( wp_safe_redirect( admin_url( 'admin.php?page=wpseo_dashboard' ) ) ) { + exit; + } + } + + /** + * When the notice should be shown. + * + * @return bool + */ + protected function should_add_notification() { + return ( $this->options['first_activated_on'] < strtotime( '-2weeks' ) ); + } + + /** + * Checks if the options has a first activated on date value. + * + * @return bool + */ + protected function has_first_activated_on() { + return $this->options['first_activated_on'] !== false; + } + + /** + * Sets the first activated on. + * + * @return void + */ + protected function set_first_activated_on() { + $this->options['first_activated_on'] = strtotime( '-2weeks' ); + + $this->save_options(); + } + + /** + * Adds a notification to the notification center. + * + * @return void + */ + protected function add_notification() { + $notification_center = Yoast_Notification_Center::get(); + $notification_center->add_notification( $this->get_notification() ); + } + + /** + * Removes a notification to the notification center. + * + * @return void + */ + protected function remove_notification() { + $notification_center = Yoast_Notification_Center::get(); + $notification_center->remove_notification( $this->get_notification() ); + } + + /** + * Returns a premium upsell section if using the free plugin. + * + * @return string + */ + protected function get_premium_upsell_section() { + if ( ! YoastSEO()->helpers->product->is_premium() ) { + return sprintf( + /* translators: %1$s expands anchor to premium plugin page, %2$s expands to */ + __( 'By the way, did you know we also have a %1$sPremium plugin%2$s? It offers advanced features, like a redirect manager and support for multiple keyphrases. It also comes with 24/7 personal support.', 'wordpress-seo' ), + "", + '' + ); + } + + return ''; + } + + /** + * Gets the notification value. + * + * @return Yoast_Notification + */ + protected function get_notification() { + $message = sprintf( + /* translators: %1$s expands to Yoast SEO, %2$s is a link start tag to the plugin page on WordPress.org, %3$s is the link closing tag. */ + __( 'We\'ve noticed you\'ve been using %1$s for some time now; we hope you love it! We\'d be thrilled if you could %2$sgive us a 5 stars rating on WordPress.org%3$s!', 'wordpress-seo' ), + 'Yoast SEO', + '', + '' + ) . "\n\n"; + + $message .= sprintf( + /* translators: %1$s is a link start tag to the bugreport guidelines on the Yoast help center, %2$s is the link closing tag. */ + __( 'If you are experiencing issues, %1$splease file a bug report%2$s and we\'ll do our best to help you out.', 'wordpress-seo' ), + '', + '' + ) . "\n\n"; + + $message .= $this->get_premium_upsell_section() . "\n\n"; + + $message .= '' . __( 'Please don\'t show me this notification anymore', 'wordpress-seo' ) . ''; + + $notification = new Yoast_Notification( + $message, + [ + 'type' => Yoast_Notification::WARNING, + 'id' => 'wpseo-upsell-notice', + 'capabilities' => 'wpseo_manage_options', + 'priority' => 0.8, + ] + ); + + return $notification; + } + + /** + * Dismisses the notice. + * + * @return bool + */ + protected function is_notice_dismissed() { + return get_user_meta( get_current_user_id(), self::USER_META_DISMISSED, true ) === '1'; + } + + /** + * Dismisses the notice. + * + * @return void + */ + protected function dismiss_notice() { + update_user_meta( get_current_user_id(), self::USER_META_DISMISSED, true ); + } + + /** + * Returns the set options. + * + * @return mixed + */ + protected function get_options() { + return get_option( self::OPTION_NAME ); + } + + /** + * Saves the options to the database. + * + * @return void + */ + protected function save_options() { + update_option( self::OPTION_NAME, $this->options ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-remote-request.php b/wp-content/plugins/wordpress-seo/admin/class-remote-request.php new file mode 100644 index 00000000..e54757a7 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-remote-request.php @@ -0,0 +1,158 @@ + false, + 'timeout' => 2, + ]; + + /** + * Holds the response error. + * + * @var WP_Error|null + */ + protected $response_error; + + /** + * Holds the response body. + * + * @var mixed + */ + protected $response_body; + + /** + * Sets the endpoint and arguments. + * + * @param string $endpoint The endpoint to send the request to. + * @param array $args The arguments to use in this request. + */ + public function __construct( $endpoint, array $args = [] ) { + $this->endpoint = $endpoint; + $this->args = wp_parse_args( $this->args, $args ); + } + + /** + * Sets the request body. + * + * @param mixed $body The body to set. + * + * @return void + */ + public function set_body( $body ) { + $this->args['body'] = $body; + } + + /** + * Sends the data to the given endpoint. + * + * @param string $method The type of request to send. + * + * @return bool True when sending data has been successful. + */ + public function send( $method = self::METHOD_POST ) { + switch ( $method ) { + case self::METHOD_POST: + $response = $this->post(); + break; + case self::METHOD_GET: + $response = $this->get(); + break; + default: + /* translators: %1$s expands to the request method */ + $response = new WP_Error( 1, sprintf( __( 'Request method %1$s is not valid.', 'wordpress-seo' ), $method ) ); + break; + } + + return $this->process_response( $response ); + } + + /** + * Returns the value of the response error. + * + * @return WP_Error|null The response error. + */ + public function get_response_error() { + return $this->response_error; + } + + /** + * Returns the response body. + * + * @return mixed The response body. + */ + public function get_response_body() { + return $this->response_body; + } + + /** + * Processes the given response. + * + * @param mixed $response The response to process. + * + * @return bool True when response is valid. + */ + protected function process_response( $response ) { + if ( $response instanceof WP_Error ) { + $this->response_error = $response; + + return false; + } + + $this->response_body = wp_remote_retrieve_body( $response ); + + return ( wp_remote_retrieve_response_code( $response ) === 200 ); + } + + /** + * Performs a post request to the specified endpoint with set arguments. + * + * @return WP_Error|array The response or WP_Error on failure. + */ + protected function post() { + return wp_remote_post( $this->endpoint, $this->args ); + } + + /** + * Performs a post request to the specified endpoint with set arguments. + * + * @return WP_Error|array The response or WP_Error on failure. + */ + protected function get() { + return wp_remote_get( $this->endpoint, $this->args ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-schema-person-upgrade-notification.php b/wp-content/plugins/wordpress-seo/admin/class-schema-person-upgrade-notification.php new file mode 100644 index 00000000..c2332c4e --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-schema-person-upgrade-notification.php @@ -0,0 +1,83 @@ +add_notification(); + return; + } + + $this->remove_notification(); + } + + /** + * Adds a notification to the notification center. + * + * @return void + */ + protected function add_notification() { + $notification_center = Yoast_Notification_Center::get(); + $notification_center->add_notification( $this->get_notification() ); + } + + /** + * Removes a notification to the notification center. + * + * @return void + */ + protected function remove_notification() { + $notification_center = Yoast_Notification_Center::get(); + $notification_center->remove_notification( $this->get_notification() ); + } + + /** + * Gets the notification object. + * + * @return Yoast_Notification + */ + protected function get_notification() { + $message = sprintf( + /* translators: %1$s is a link start tag to the Search Appearance settings, %2$s is the link closing tag. */ + __( 'You have previously set your site to represent a person. We’ve improved our functionality around Schema and the Knowledge Graph, so you should go in and %1$scomplete those settings%2$s.', 'wordpress-seo' ), + '', + '' + ); + + $notification = new Yoast_Notification( + $message, + [ + 'type' => Yoast_Notification::WARNING, + 'id' => 'wpseo-schema-person-upgrade', + 'capabilities' => 'wpseo_manage_options', + 'priority' => 0.8, + ] + ); + + return $notification; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-suggested-plugins.php b/wp-content/plugins/wordpress-seo/admin/class-suggested-plugins.php new file mode 100644 index 00000000..2d937be1 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-suggested-plugins.php @@ -0,0 +1,140 @@ +availability_checker = $availability_checker; + $this->notification_center = $notification_center; + } + + /** + * Registers all hooks to WordPress. + * + * @return void + */ + public function register_hooks() { + add_action( 'admin_init', [ $this->availability_checker, 'register' ] ); + add_action( 'admin_init', [ $this, 'add_notifications' ] ); + } + + /** + * Adds notifications (when necessary). + * + * @return void + */ + public function add_notifications() { + $checker = $this->availability_checker; + + // Get all Yoast plugins that have dependencies. + $plugins = $checker->get_plugins_with_dependencies(); + + foreach ( $plugins as $plugin_name => $plugin ) { + $notification_id = 'wpseo-suggested-plugin-' . $plugin_name; + + if ( ! $checker->dependencies_are_satisfied( $plugin ) ) { + $this->notification_center->remove_notification_by_id( $notification_id ); + + continue; + } + + if ( ! $checker->is_installed( $plugin ) ) { + $notification = $this->get_yoast_seo_suggested_plugins_notification( $notification_id, $plugin ); + $this->notification_center->add_notification( $notification ); + + continue; + } + + $this->notification_center->remove_notification_by_id( $notification_id ); + } + } + + /** + * Build Yoast SEO suggested plugins notification. + * + * @param string $notification_id The id of the notification to be created. + * @param array> $plugin The plugin to retrieve the data from. + * + * @return Yoast_Notification The notification containing the suggested plugin. + */ + protected function get_yoast_seo_suggested_plugins_notification( $notification_id, $plugin ) { + $message = $this->create_install_suggested_plugin_message( $plugin ); + + return new Yoast_Notification( + $message, + [ + 'id' => $notification_id, + 'type' => Yoast_Notification::WARNING, + 'capabilities' => [ 'install_plugins' ], + ] + ); + } + + /** + * Creates a message to suggest the installation of a particular plugin. + * + * @param array $suggested_plugin The suggested plugin. + * + * @return string The install suggested plugin message. + */ + protected function create_install_suggested_plugin_message( $suggested_plugin ) { + /* translators: %1$s expands to an opening strong tag, %2$s expands to the dependency name, %3$s expands to a closing strong tag, %4$s expands to an opening anchor tag, %5$s expands to a closing anchor tag. */ + $message = __( 'It looks like you aren\'t using our %1$s%2$s addon%3$s. %4$sUpgrade today%5$s to unlock more tools and SEO features to make your products stand out in search results.', 'wordpress-seo' ); + $install_link = WPSEO_Admin_Utils::get_install_link( $suggested_plugin ); + + return sprintf( + $message, + '', + $install_link, + '', + $this->create_more_information_link( $suggested_plugin['url'], $suggested_plugin['title'] ), + '' + ); + } + + /** + * Creates a more information link that directs the user to WordPress.org Plugin repository. + * + * @param string $url The URL to the plugin's page. + * @param string $name The name of the plugin. + * + * @return string The more information link. + */ + protected function create_more_information_link( $url, $name ) { + return sprintf( + '', + $url, + /* translators: Hidden accessibility text; %1$s expands to the dependency name */ + sprintf( __( 'More information about %1$s', 'wordpress-seo' ), $name ) + ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-wincher-dashboard-widget.php b/wp-content/plugins/wordpress-seo/admin/class-wincher-dashboard-widget.php new file mode 100644 index 00000000..5f9c793b --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-wincher-dashboard-widget.php @@ -0,0 +1,136 @@ +asset_manager = new WPSEO_Admin_Asset_Manager(); + } + + /** + * Register WordPress hooks. + * + * @return void + */ + public function register_hooks() { + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_wincher_dashboard_assets' ] ); + add_action( 'admin_init', [ $this, 'queue_wincher_dashboard_widget' ] ); + } + + /** + * Adds the Wincher dashboard widget if it should be shown. + * + * @return void + */ + public function queue_wincher_dashboard_widget() { + if ( $this->show_widget() ) { + add_action( 'wp_dashboard_setup', [ $this, 'add_wincher_dashboard_widget' ] ); + } + } + + /** + * Adds the Wincher dashboard widget to WordPress. + * + * @return void + */ + public function add_wincher_dashboard_widget() { + add_filter( 'postbox_classes_dashboard_wpseo-wincher-dashboard-overview', [ $this, 'wpseo_wincher_dashboard_overview_class' ] ); + wp_add_dashboard_widget( + 'wpseo-wincher-dashboard-overview', + /* translators: %1$s expands to Yoast SEO, %2$s to Wincher */ + sprintf( __( '%1$s / %2$s: Top Keyphrases', 'wordpress-seo' ), 'Yoast SEO', 'Wincher' ), + [ $this, 'display_wincher_dashboard_widget' ] + ); + } + + /** + * Adds CSS classes to the dashboard widget. + * + * @param array $classes An array of postbox CSS classes. + * + * @return array + */ + public function wpseo_wincher_dashboard_overview_class( $classes ) { + $classes[] = 'yoast wpseo-wincherdashboard-overview'; + return $classes; + } + + /** + * Displays the Wincher dashboard widget. + * + * @return void + */ + public function display_wincher_dashboard_widget() { + echo '
    '; + } + + /** + * Enqueues assets for the dashboard if the current page is the dashboard. + * + * @return void + */ + public function enqueue_wincher_dashboard_assets() { + if ( ! $this->is_dashboard_screen() ) { + return; + } + + $this->asset_manager->localize_script( 'wincher-dashboard-widget', 'wpseoWincherDashboardWidgetL10n', $this->localize_wincher_dashboard_script() ); + $this->asset_manager->enqueue_script( 'wincher-dashboard-widget' ); + $this->asset_manager->enqueue_style( 'wp-dashboard' ); + $this->asset_manager->enqueue_style( 'monorepo' ); + } + + /** + * Translates strings used in the Wincher dashboard widget. + * + * @return array The translated strings. + */ + public function localize_wincher_dashboard_script() { + + return [ + 'wincher_is_logged_in' => YoastSEO()->helpers->wincher->login_status(), + 'wincher_website_id' => WPSEO_Options::get( 'wincher_website_id', '' ), + ]; + } + + /** + * Checks if the current screen is the dashboard screen. + * + * @return bool Whether or not this is the dashboard screen. + */ + private function is_dashboard_screen() { + $current_screen = get_current_screen(); + + return ( $current_screen instanceof WP_Screen && $current_screen->id === 'dashboard' ); + } + + /** + * Returns true when the Wincher dashboard widget should be shown. + * + * @return bool + */ + private function show_widget() { + $analysis_seo = new WPSEO_Metabox_Analysis_SEO(); + $user_can_edit = $analysis_seo->is_enabled() && current_user_can( 'edit_posts' ); + $is_wincher_active = YoastSEO()->helpers->wincher->is_active(); + + return $user_can_edit && $is_wincher_active; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-yoast-columns.php b/wp-content/plugins/wordpress-seo/admin/class-yoast-columns.php new file mode 100644 index 00000000..989f87b8 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-yoast-columns.php @@ -0,0 +1,117 @@ +display_links(); + $meta_columns_present = $this->display_meta_columns(); + if ( ! ( $link_columns_present || $meta_columns_present ) ) { + return; + } + + $help_tab_content = sprintf( + /* translators: %1$s: Yoast SEO */ + __( '%1$s adds several columns to this page.', 'wordpress-seo' ), + 'Yoast SEO' + ); + + if ( $meta_columns_present ) { + $help_tab_content .= ' ' . sprintf( + /* translators: %1$s: Link to article about content analysis, %2$s: Anchor closing */ + __( 'We\'ve written an article about %1$show to use the SEO score and Readability score%2$s.', 'wordpress-seo' ), + '
    ', + '' + ); + } + + if ( $link_columns_present ) { + $help_tab_content .= ' ' . sprintf( + /* translators: %1$s: Link to article about text links, %2$s: Anchor closing tag, %3$s: Emphasis open tag, %4$s: Emphasis close tag */ + __( 'The links columns show the number of articles on this site linking %3$sto%4$s this article and the number of URLs linked %3$sfrom%4$s this article. Learn more about %1$show to use these features to improve your internal linking%2$s, which greatly enhances your SEO.', 'wordpress-seo' ), + '', + '', + '', + '' + ); + } + + $screen = get_current_screen(); + $screen->add_help_tab( + [ + /* translators: %s expands to Yoast */ + 'title' => sprintf( __( '%s Columns', 'wordpress-seo' ), 'Yoast' ), + 'id' => 'yst-columns', + 'content' => '

    ' . $help_tab_content . '

    ', + 'priority' => 15, + ] + ); + } + + /** + * Retrieves the post type from the $_GET variable. + * + * @return string The current post type. + */ + private function get_current_post_type() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + if ( isset( $_GET['post_type'] ) && is_string( $_GET['post_type'] ) ) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + return sanitize_text_field( wp_unslash( $_GET['post_type'] ) ); + } + return ''; + } + + /** + * Whether we are showing link columns on this overview page. + * This depends on the post being accessible or not. + * + * @return bool Whether the linking columns are shown + */ + private function display_links() { + $current_post_type = $this->get_current_post_type(); + + if ( empty( $current_post_type ) ) { + return false; + } + + return WPSEO_Post_Type::is_post_type_accessible( $current_post_type ); + } + + /** + * Wraps the WPSEO_Metabox check to determine whether the metabox should be displayed either by + * choice of the admin or because the post type is not a public post type. + * + * @return bool Whether the meta box (and associated columns etc) should be hidden. + */ + private function display_meta_columns() { + $current_post_type = $this->get_current_post_type(); + + if ( empty( $current_post_type ) ) { + return false; + } + + return WPSEO_Utils::is_metabox_active( $current_post_type, 'post_type' ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-yoast-dashboard-widget.php b/wp-content/plugins/wordpress-seo/admin/class-yoast-dashboard-widget.php new file mode 100644 index 00000000..7b07fd99 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-yoast-dashboard-widget.php @@ -0,0 +1,160 @@ +statistics = $statistics; + $this->asset_manager = new WPSEO_Admin_Asset_Manager(); + } + + /** + * Register WordPress hooks. + * + * @return void + */ + public function register_hooks() { + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_dashboard_assets' ] ); + add_action( 'admin_init', [ $this, 'queue_dashboard_widget' ] ); + } + + /** + * Adds the dashboard widget if it should be shown. + * + * @return void + */ + public function queue_dashboard_widget() { + if ( $this->show_widget() ) { + add_action( 'wp_dashboard_setup', [ $this, 'add_dashboard_widget' ] ); + } + } + + /** + * Adds dashboard widget to WordPress. + * + * @return void + */ + public function add_dashboard_widget() { + add_filter( 'postbox_classes_dashboard_wpseo-dashboard-overview', [ $this, 'wpseo_dashboard_overview_class' ] ); + wp_add_dashboard_widget( + 'wpseo-dashboard-overview', + /* translators: %s is the plugin name */ + sprintf( __( '%s Posts Overview', 'wordpress-seo' ), 'Yoast SEO' ), + [ $this, 'display_dashboard_widget' ] + ); + } + + /** + * Adds CSS classes to the dashboard widget. + * + * @param array $classes An array of postbox CSS classes. + * + * @return array + */ + public function wpseo_dashboard_overview_class( $classes ) { + $classes[] = 'yoast wpseo-dashboard-overview'; + return $classes; + } + + /** + * Displays the dashboard widget. + * + * @return void + */ + public function display_dashboard_widget() { + echo '
    '; + } + + /** + * Enqueues assets for the dashboard if the current page is the dashboard. + * + * @return void + */ + public function enqueue_dashboard_assets() { + if ( ! $this->is_dashboard_screen() ) { + return; + } + + $this->asset_manager->localize_script( 'dashboard-widget', 'wpseoDashboardWidgetL10n', $this->localize_dashboard_script() ); + $this->asset_manager->enqueue_script( 'dashboard-widget' ); + $this->asset_manager->enqueue_style( 'wp-dashboard' ); + $this->asset_manager->enqueue_style( 'monorepo' ); + } + + /** + * Translates strings used in the dashboard widget. + * + * @return array The translated strings. + */ + public function localize_dashboard_script() { + return [ + 'feed_header' => sprintf( + /* translators: %1$s resolves to Yoast.com */ + __( 'Latest blog posts on %1$s', 'wordpress-seo' ), + 'Yoast.com' + ), + 'feed_footer' => __( 'Read more like this on our SEO blog', 'wordpress-seo' ), + 'wp_version' => substr( $GLOBALS['wp_version'], 0, 3 ) . '-' . ( is_plugin_active( 'classic-editor/classic-editor.php' ) ? '1' : '0' ), + 'php_version' => PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION, + ]; + } + + /** + * Checks if the current screen is the dashboard screen. + * + * @return bool Whether or not this is the dashboard screen. + */ + private function is_dashboard_screen() { + $current_screen = get_current_screen(); + + return ( $current_screen instanceof WP_Screen && $current_screen->id === 'dashboard' ); + } + + /** + * Returns true when the dashboard widget should be shown. + * + * @return bool + */ + private function show_widget() { + $analysis_seo = new WPSEO_Metabox_Analysis_SEO(); + + return $analysis_seo->is_enabled() && current_user_can( 'edit_posts' ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-yoast-form.php b/wp-content/plugins/wordpress-seo/admin/class-yoast-form.php new file mode 100644 index 00000000..a4ad63f8 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-yoast-form.php @@ -0,0 +1,1122 @@ + +
    + +

    +
    +
    +
    + meets_requirements() ) { + $action_url = network_admin_url( 'settings.php' ); + $hidden_fields_cb = [ $network_admin, 'settings_fields' ]; + } + else { + $action_url = admin_url( 'options.php' ); + $hidden_fields_cb = 'settings_fields'; + } + + echo '
    '; + call_user_func( $hidden_fields_cb, $option_long_name ); + } + $this->set_option( $option ); + } + + /** + * Set the option used in output for form elements. + * + * @since 2.0 + * + * @param string $option_name Option key. + * + * @return void + */ + public function set_option( $option_name ) { + $this->option_name = $option_name; + + $this->option_instance = WPSEO_Options::get_option_instance( $option_name ); + if ( ! $this->option_instance ) { + $this->option_instance = null; + } + } + + /** + * Generates the footer for admin pages. + * + * @since 2.0 + * + * @param bool $submit Whether or not a submit button and form end tag should be shown. + * @param bool $show_sidebar Whether or not to show the banner sidebar - used by premium plugins to disable it. + * + * @return void + */ + public function admin_footer( $submit = true, $show_sidebar = true ) { + if ( $submit ) { + $settings_changed_listener = new WPSEO_Admin_Settings_Changed_Listener(); + echo '
    '; + + echo '
    '; + submit_button( __( 'Save changes', 'wordpress-seo' ) ); + $settings_changed_listener->show_success_message(); + echo '
    '; + + echo ''; + + echo '
    '; + + echo ' +
    '; + } + + /** + * Apply general admin_footer hooks. + */ + do_action( 'wpseo_admin_footer', $this ); + + /** + * Run possibly set actions to add for example an i18n box. + */ + do_action( 'wpseo_admin_promo_footer' ); + + echo ' +
    '; + + if ( $show_sidebar ) { + $this->admin_sidebar(); + } + + echo '
    '; + + do_action( 'wpseo_admin_below_content', $this ); + + echo ' +
    '; + } + + /** + * Generates the sidebar for admin pages. + * + * @since 2.0 + * + * @return void + */ + public function admin_sidebar() { + // No banners in Premium. + $addon_manager = new WPSEO_Addon_Manager(); + if ( YoastSEO()->helpers->product->is_premium() && $addon_manager->has_valid_subscription( WPSEO_Addon_Manager::PREMIUM_SLUG ) ) { + return; + } + + $sidebar_presenter = new Sidebar_Presenter(); + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in presenter. + echo $sidebar_presenter->present(); + } + + /** + * Output a label element. + * + * @since 2.0 + * + * @param string $text Label text string, which can contain escaped html. + * @param array $attr HTML attributes set. + * + * @return void + */ + public function label( $text, $attr ) { + $defaults = [ + 'class' => 'checkbox', + 'close' => true, + 'for' => '', + 'aria_label' => '', + ]; + + $attr = wp_parse_args( $attr, $defaults ); + $aria_label = ''; + if ( $attr['aria_label'] !== '' ) { + $aria_label = ' aria-label="' . esc_attr( $attr['aria_label'] ) . '"'; + } + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before. Specifically, the $text variable can contain escaped html. + echo "'; + } + } + + /** + * Output a legend element. + * + * @since 3.4 + * + * @param string $text Legend text string. + * @param array $attr HTML attributes set. + * + * @return void + */ + public function legend( $text, $attr ) { + $defaults = [ + 'id' => '', + 'class' => '', + ]; + $attr = wp_parse_args( $attr, $defaults ); + + $id = ( $attr['id'] === '' ) ? '' : ' id="' . esc_attr( $attr['id'] ) . '"'; + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before. + echo '' . $text . ''; + } + + /** + * Create a Checkbox input field. + * + * @since 2.0 + * + * @param string $variable The variable within the option to create the checkbox for. + * @param string $label The label to show for the variable. + * @param bool $label_left Whether the label should be left (true) or right (false). + * @param array $attr Extra attributes to add to the checkbox. + * + * @return void + */ + public function checkbox( $variable, $label, $label_left = false, $attr = [] ) { + $val = $this->get_field_value( $variable, false ); + + $defaults = [ + 'disabled' => false, + ]; + $attr = wp_parse_args( $attr, $defaults ); + + if ( $val === true ) { + $val = 'on'; + } + + $class = ''; + if ( $label_left !== false ) { + $this->label( $label_left, [ 'for' => $variable ] ); + } + else { + $class = 'double'; + } + + $disabled_attribute = $this->get_disabled_attribute( $variable, $attr ); + + // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $disabled_attribute output is hardcoded and all other output is properly escaped. + echo ''; + + if ( ! empty( $label ) ) { + $this->label( $label, [ 'for' => $variable ] ); + } + + echo '
    '; + } + + /** + * Creates a Checkbox input field list. + * + * @since 12.8 + * + * @param string $variable The variables within the option to create the checkbox list for. + * @param string $labels The labels to show for the variable. + * @param array $attr Extra attributes to add to the checkbox list. + * + * @return void + */ + public function checkbox_list( $variable, $labels, $attr = [] ) { + $defaults = [ + 'disabled' => false, + ]; + $attr = wp_parse_args( $attr, $defaults ); + + $values = $this->get_field_value( $variable, [] ); + + foreach ( $labels as $name => $label ) { + printf( + '', + esc_attr( $variable . '-' . $name ), + esc_attr( $this->option_name . '[' . $variable . '][' . $name . ']' ), + checked( ! empty( $values[ $name ] ), true, false ), + esc_attr( $name ), + disabled( ( isset( $attr['disabled'] ) && $attr['disabled'] ), true, false ) + ); + + printf( + '', + esc_attr( $variable . '-' . $name ), // #1 + esc_html( $label ) + ); + echo '
    '; + } + } + + /** + * Create a light switch input field using a single checkbox. + * + * @since 3.1 + * + * @param string $variable The variable within the option to create the checkbox for. + * @param string $label The visual label text for the toggle. + * @param array $buttons Array of two visual labels for the buttons (defaults Disabled/Enabled). + * @param bool $reverse Reverse order of buttons (default true). + * @param string $help Inline Help that will be printed out before the toggle. + * @param bool $strong Whether the visual label is displayed in strong text. Default is false. + * Starting from Yoast SEO 16.5, the visual label is forced to bold via CSS. + * @param array $attr Extra attributes to add to the light switch. + * + * @return void + */ + public function light_switch( $variable, $label, $buttons = [], $reverse = true, $help = '', $strong = false, $attr = [] ) { + $val = $this->get_field_value( $variable, false ); + + $defaults = [ + 'disabled' => false, + ]; + $attr = wp_parse_args( $attr, $defaults ); + + if ( $val === true ) { + $val = 'on'; + } + + $disabled_attribute = $this->get_disabled_attribute( $variable, $attr ); + + $output = new Light_Switch_Presenter( + $variable, + $label, + $buttons, + $this->option_name . '[' . $variable . ']', + $val, + $reverse, + $help, + $strong, + $disabled_attribute + ); + + // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: All output is properly escaped or hardcoded in the presenter. + echo $output; + } + + /** + * Create a Text input field. + * + * @since 2.0 + * @since 2.1 Introduced the `$attr` parameter. + * + * @param string $variable The variable within the option to create the text input field for. + * @param string $label The label to show for the variable. + * @param array|string $attr Extra attributes to add to the input field. Can be class, disabled, autocomplete. + * + * @return void + */ + public function textinput( $variable, $label, $attr = [] ) { + $type = 'text'; + if ( ! is_array( $attr ) ) { + $attr = [ + 'class' => $attr, + 'disabled' => false, + ]; + } + + $defaults = [ + 'placeholder' => '', + 'class' => '', + ]; + $attr = wp_parse_args( $attr, $defaults ); + $val = $this->get_field_value( $variable, '' ); + if ( isset( $attr['type'] ) && $attr['type'] === 'url' ) { + $val = urldecode( $val ); + $type = 'url'; + } + $attributes = isset( $attr['autocomplete'] ) ? ' autocomplete="' . esc_attr( $attr['autocomplete'] ) . '"' : ''; + + $this->label( + $label, + [ + 'for' => $variable, + 'class' => 'textinput', + ] + ); + + $aria_attributes = Yoast_Input_Validation::get_the_aria_invalid_attribute( $variable ); + + Yoast_Input_Validation::set_error_descriptions(); + $aria_attributes .= Yoast_Input_Validation::get_the_aria_describedby_attribute( $variable ); + + $disabled_attribute = $this->get_disabled_attribute( $variable, $attr ); + + // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $disabled_attribute output is hardcoded and all other output is properly escaped. + echo '', '
    '; + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in getter. + echo Yoast_Input_Validation::get_the_error_description( $variable ); + } + + /** + * Create a Number input field. + * + * @param string $variable The variable within the option to create the text input field for. + * @param string $label The label to show for the variable. + * @param array|string $attr Extra attributes to add to the input field. Can be class, disabled, autocomplete. + * + * @return void + */ + public function number( $variable, $label, $attr = [] ) { + $type = 'number'; + $defaults = [ + 'placeholder' => '', + 'class' => 'number', + 'disabled' => false, + 'min' => 0, + 'max' => 100, + ]; + $attr = wp_parse_args( $attr, $defaults ); + $val = $this->get_field_value( $variable, 0 ); + + $this->label( + $label, + [ + 'for' => $variable, + 'class' => 'textinput ' . $attr['class'], + ] + ); + + $aria_attributes = Yoast_Input_Validation::get_the_aria_invalid_attribute( $variable ); + + Yoast_Input_Validation::set_error_descriptions(); + $aria_attributes .= Yoast_Input_Validation::get_the_aria_describedby_attribute( $variable ); + + $disabled_attribute = $this->get_disabled_attribute( $variable, $attr ); + + // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $disabled_attribute output is hardcoded and all other output is properly escaped. + echo '', '
    '; + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in getter. + echo Yoast_Input_Validation::get_the_error_description( $variable ); + } + + /** + * Creates a text input field with with the ability to add content after the label. + * + * @param string $variable The variable within the option to create the text input field for. + * @param string $label The label to show for the variable. + * @param array $attr Extra attributes to add to the input field. + * + * @return void + */ + public function textinput_extra_content( $variable, $label, $attr = [] ) { + $type = 'text'; + + $defaults = [ + 'class' => 'yoast-field-group__inputfield', + 'disabled' => false, + ]; + + $attr = wp_parse_args( $attr, $defaults ); + $val = $this->get_field_value( $variable, '' ); + + if ( isset( $attr['type'] ) && $attr['type'] === 'url' ) { + $val = urldecode( $val ); + $type = 'url'; + } + + echo '
    '; + $this->label( + $label, + [ + 'for' => $variable, + 'class' => $attr['class'] . '--label', + ] + ); + + if ( isset( $attr['extra_content'] ) ) { + // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: may contain HTML that should not be escaped. + echo $attr['extra_content']; + } + echo '
    '; + + $has_input_error = Yoast_Input_Validation::yoast_form_control_has_error( $variable ); + $aria_attributes = Yoast_Input_Validation::get_the_aria_invalid_attribute( $variable ); + + Yoast_Input_Validation::set_error_descriptions(); + $aria_attributes .= Yoast_Input_Validation::get_the_aria_describedby_attribute( $variable ); + + // phpcs:disable WordPress.Security.EscapeOutput -- Reason: output is properly escaped or hardcoded. + printf( + '', + $type, + esc_attr( $this->option_name . '[' . $variable . ']' ), + esc_attr( $variable ), + esc_attr( $attr['class'] ), + isset( $attr['placeholder'] ) ? ' placeholder="' . esc_attr( $attr['placeholder'] ) . '"' : '', + isset( $attr['autocomplete'] ) ? ' autocomplete="' . esc_attr( $attr['autocomplete'] ) . '"' : '', + $aria_attributes, + esc_attr( $val ), + $this->get_disabled_attribute( $variable, $attr ) + ); + // phpcs:enable + // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: output is properly escaped. + echo Yoast_Input_Validation::get_the_error_description( $variable ); + } + + /** + * Create a textarea. + * + * @since 2.0 + * + * @param string $variable The variable within the option to create the textarea for. + * @param string $label The label to show for the variable. + * @param string|array $attr The CSS class or an array of attributes to assign to the textarea. + * + * @return void + */ + public function textarea( $variable, $label, $attr = [] ) { + if ( ! is_array( $attr ) ) { + $attr = [ + 'class' => $attr, + ]; + } + + $defaults = [ + 'cols' => '', + 'rows' => '', + 'class' => '', + 'disabled' => false, + ]; + $attr = wp_parse_args( $attr, $defaults ); + $val = $this->get_field_value( $variable, '' ); + + $this->label( + $label, + [ + 'for' => $variable, + 'class' => 'textinput', + ] + ); + + $disabled_attribute = $this->get_disabled_attribute( $variable, $attr ); + + // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $disabled_attribute output is hardcoded and all other output is properly escaped. + echo '
    '; + } + + /** + * Create a hidden input field. + * + * @since 2.0 + * + * @param string $variable The variable within the option to create the hidden input for. + * @param string $id The ID of the element. + * @param mixed $val Optional. The value to set in the input field. Otherwise the value from the options will be used. + * + * @return void + */ + public function hidden( $variable, $id = '', $val = null ) { + if ( is_null( $val ) ) { + $val = $this->get_field_value( $variable, '' ); + } + + if ( is_bool( $val ) ) { + $val = ( $val === true ) ? 'true' : 'false'; + } + + if ( $id === '' ) { + $id = 'hidden_' . $variable; + } + + echo ''; + } + + /** + * Create a Select Box. + * + * @since 2.0 + * + * @param string $variable The variable within the option to create the select for. + * @param string $label The label to show for the variable. + * @param array $select_options The select options to choose from. + * @param string $styled The select style. Use 'styled' to get a styled select. Default 'unstyled'. + * @param bool $show_label Whether or not to show the label, if not, it will be applied as an aria-label. + * @param array $attr Extra attributes to add to the select. + * @param string $help Optional. Inline Help HTML that will be printed after the label. Default is empty. + * + * @return void + */ + public function select( $variable, $label, array $select_options, $styled = 'unstyled', $show_label = true, $attr = [], $help = '' ) { + if ( empty( $select_options ) ) { + return; + } + + $defaults = [ + 'disabled' => false, + ]; + $attr = wp_parse_args( $attr, $defaults ); + + if ( $show_label ) { + $this->label( + $label, + [ + 'for' => $variable, + 'class' => 'select', + ] + ); + echo $help; // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: The help contains HTML. + } + + $select_name = esc_attr( $this->option_name ) . '[' . esc_attr( $variable ) . ']'; + $active_option = $this->get_field_value( $variable, '' ); + $wrapper_start_tag = ''; + $wrapper_end_tag = ''; + + $select = new Yoast_Input_Select( $variable, $select_name, $select_options, $active_option ); + $select->add_attribute( 'class', 'select' ); + + if ( $this->is_control_disabled( $variable ) + || ( isset( $attr['disabled'] ) && $attr['disabled'] ) ) { + $select->add_attribute( 'disabled', 'disabled' ); + } + + if ( ! $show_label ) { + $select->add_attribute( 'aria-label', $label ); + } + + if ( $styled === 'styled' ) { + $wrapper_start_tag = ''; + $wrapper_end_tag = ''; + } + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before. + echo $wrapper_start_tag; + $select->output_html(); + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before. + echo $wrapper_end_tag; + echo '
    '; + } + + /** + * Create a File upload field. + * + * @since 2.0 + * + * @param string $variable The variable within the option to create the file upload field for. + * @param string $label The label to show for the variable. + * @param array $attr Extra attributes to add to the file upload input. + * + * @return void + */ + public function file_upload( $variable, $label, $attr = [] ) { + $val = $this->get_field_value( $variable, '' ); + if ( is_array( $val ) ) { + $val = $val['url']; + } + + $defaults = [ + 'disabled' => false, + ]; + $attr = wp_parse_args( $attr, $defaults ); + + $var_esc = esc_attr( $variable ); + $this->label( + $label, + [ + 'for' => $variable, + 'class' => 'select', + ] + ); + + $disabled_attribute = $this->get_disabled_attribute( $variable, $attr ); + + // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $disabled_attribute output is hardcoded and all other output is properly escaped. + echo ''; + + // Need to save separate array items in hidden inputs, because empty file inputs type will be deleted by settings API. + if ( ! empty( $val ) ) { + $this->hidden( 'file', $this->option_name . '_file' ); + $this->hidden( 'url', $this->option_name . '_url' ); + $this->hidden( 'type', $this->option_name . '_type' ); + } + echo '
    '; + } + + /** + * Media input. + * + * @since 2.0 + * + * @param string $variable Option name. + * @param string $label Label message. + * @param array $attr Extra attributes to add to the media input and buttons. + * + * @return void + */ + public function media_input( $variable, $label, $attr = [] ) { + $val = $this->get_field_value( $variable, '' ); + $id_value = $this->get_field_value( $variable . '_id', '' ); + + $var_esc = esc_attr( $variable ); + + $defaults = [ + 'disabled' => false, + ]; + $attr = wp_parse_args( $attr, $defaults ); + + $this->label( + $label, + [ + 'for' => 'wpseo_' . $variable, + 'class' => 'select', + ] + ); + + $id_field_id = 'wpseo_' . $var_esc . '_id'; + + $disabled_attribute = $this->get_disabled_attribute( $variable, $attr ); + + echo ''; + echo ' '; + echo ' '; + echo ''; + echo ''; + echo ''; + echo '
    '; + } + + /** + * Create a Radio input field. + * + * @since 2.0 + * + * @param string $variable The variable within the option to create the radio button for. + * @param array $values The radio options to choose from. + * @param string $legend Optional. The legend to show for the field set, if any. + * @param array $legend_attr Optional. The attributes for the legend, if any. + * @param array $attr Extra attributes to add to the radio button. + * + * @return void + */ + public function radio( $variable, $values, $legend = '', $legend_attr = [], $attr = [] ) { + if ( ! is_array( $values ) || $values === [] ) { + return; + } + $val = $this->get_field_value( $variable, false ); + + $var_esc = esc_attr( $variable ); + + $defaults = [ + 'disabled' => false, + ]; + $attr = wp_parse_args( $attr, $defaults ); + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before. + echo '
    '; + + if ( is_string( $legend ) && $legend !== '' ) { + + $legend_defaults = [ + 'id' => '', + 'class' => 'radiogroup', + ]; + + $legend_attr = wp_parse_args( $legend_attr, $legend_defaults ); + + $this->legend( $legend, $legend_attr ); + } + + foreach ( $values as $key => $value ) { + $label = $value; + $aria_label = ''; + + if ( is_array( $value ) ) { + $label = ( $value['label'] ?? '' ); + $aria_label = ( $value['aria_label'] ?? '' ); + } + + $key_esc = esc_attr( $key ); + + $disabled_attribute = $this->get_disabled_attribute( $variable, $attr ); + + // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $disabled_attribute output is hardcoded and all other output is properly escaped. + echo ''; + $this->label( + $label, + [ + 'for' => $var_esc . '-' . $key_esc, + 'class' => 'radio', + 'aria_label' => $aria_label, + ] + ); + } + echo '
    '; + } + + /** + * Create a toggle switch input field using two radio buttons. + * + * @since 3.1 + * + * @param string $variable The variable within the option to create the radio buttons for. + * @param array $values Associative array of on/off keys and their values to be used as + * the label elements text for the radio buttons. Optionally, each + * value can be an array of visible label text and screen reader text. + * @param string $label The visual label for the radio buttons group, used as the fieldset legend. + * @param string $help Inline Help that will be printed out before the visible toggles text. + * @param array $attr Extra attributes to add to the toggle switch. + * + * @return void + */ + public function toggle_switch( $variable, $values, $label, $help = '', $attr = [] ) { + if ( ! is_array( $values ) || $values === [] ) { + return; + } + + $defaults = [ + 'disabled' => false, + ]; + $attr = wp_parse_args( $attr, $defaults ); + + if ( isset( $attr['preserve_disabled_value'] ) && $attr['preserve_disabled_value'] ) { + $this->hidden( $variable ); + $variable .= '_disabled'; + } + + $val = $this->get_field_value( $variable, false ); + if ( $val === true ) { + $val = 'on'; + } + if ( $val === false ) { + $val = 'off'; + } + + $help_class = ! empty( $help ) ? ' switch-container__has-help' : ''; + + $has_premium_upsell = ( isset( $attr['show_premium_upsell'] ) && $attr['show_premium_upsell'] && isset( $attr['premium_upsell_url'] ) && ! empty( $attr['premium_upsell_url'] ) ); + $upsell_class = ( $has_premium_upsell ) ? ' premium-upsell' : ''; + + $var_esc = esc_attr( $variable ); + + printf( '
    ', esc_attr( 'switch-container' . $help_class . $upsell_class ) ); + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before. + echo '
    ', $label, '', $help; + + // Show disabled note if attribute does not exists or does exist and is set to true. + if ( ! isset( $attr['show_disabled_note'] ) || ( $attr['show_disabled_note'] === true ) ) { + if ( isset( $attr['note_when_disabled'] ) ) { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before. + echo $this->get_disabled_note( $variable, $attr['note_when_disabled'] ); + } + else { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before. + echo $this->get_disabled_note( $variable ); + } + } + + echo '
    '; + + foreach ( $values as $key => $value ) { + $screen_reader_text_html = ''; + + if ( is_array( $value ) ) { + $screen_reader_text = $value['screen_reader_text']; + $screen_reader_text_html = ' ' . esc_html( $screen_reader_text ) . ''; + $value = $value['text']; + } + + $key_esc = esc_attr( $key ); + $for = $var_esc . '-' . $key_esc; + $disabled_attribute = $this->get_disabled_attribute( $variable, $attr ); + + // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $disabled_attribute output is hardcoded and all other output is properly escaped. + echo '', + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before. + ''; + } + + $upsell_button = ''; + if ( $has_premium_upsell ) { + $upsell_button = '' + . esc_html__( 'Unlock with Premium!', 'wordpress-seo' ) + /* translators: Hidden accessibility text. */ + . '' . esc_html__( '(Opens in a new browser tab)', 'wordpress-seo' ) . '' + . ''; + } + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- All variable output is escaped above. + echo '
    ' . $upsell_button . '
    ' . PHP_EOL . PHP_EOL; + } + + /** + * Creates a toggle switch to define whether an indexable should be indexed or not. + * + * @param string $variable The variable within the option to create the radio buttons for. + * @param string $label The visual label for the radio buttons group, used as the fieldset legend. + * @param string $help Inline Help that will be printed out before the visible toggles text. + * @param array $attr Extra attributes to add to the index switch. + * + * @return void + */ + public function index_switch( $variable, $label, $help = '', $attr = [] ) { + $defaults = [ + 'disabled' => false, + ]; + $attr = wp_parse_args( $attr, $defaults ); + + $index_switch_values = [ + 'off' => __( 'On', 'wordpress-seo' ), + 'on' => __( 'Off', 'wordpress-seo' ), + ]; + + $is_disabled = ( isset( $attr['disabled'] ) && $attr['disabled'] ); + + $this->toggle_switch( + $variable, + $index_switch_values, + sprintf( + /* translators: %s expands to an indexable object's name, like a post type or taxonomy */ + esc_html__( 'Show %s in search results?', 'wordpress-seo' ), + $label + ), + $help, + [ 'disabled' => $is_disabled ] + ); + } + + /** + * Creates a toggle switch to show hide certain options. + * + * @param string $variable The variable within the option to create the radio buttons for. + * @param string $label The visual label for the radio buttons group, used as the fieldset legend. + * @param bool $inverse_keys Whether or not the option keys need to be inverted to support older functions. + * @param string $help Inline Help that will be printed out before the visible toggles text. + * @param array $attr Extra attributes to add to the show-hide switch. + * + * @return void + */ + public function show_hide_switch( $variable, $label, $inverse_keys = false, $help = '', $attr = [] ) { + $defaults = [ + 'disabled' => false, + ]; + $attr = wp_parse_args( $attr, $defaults ); + + $on_key = ( $inverse_keys ) ? 'off' : 'on'; + $off_key = ( $inverse_keys ) ? 'on' : 'off'; + + $show_hide_switch = [ + $on_key => __( 'On', 'wordpress-seo' ), + $off_key => __( 'Off', 'wordpress-seo' ), + ]; + + $is_disabled = ( isset( $attr['disabled'] ) && $attr['disabled'] ); + + $this->toggle_switch( + $variable, + $show_hide_switch, + $label, + $help, + [ 'disabled' => $is_disabled ] + ); + } + + /** + * Retrieves the value for the form field. + * + * @param string $field_name The field name to retrieve the value for. + * @param string|null $default_value The default value, when field has no value. + * + * @return mixed|null The retrieved value. + */ + protected function get_field_value( $field_name, $default_value = null ) { + // On multisite subsites, the Usage tracking feature should always be set to Off. + if ( $this->is_tracking_on_subsite( $field_name ) ) { + return false; + } + + return WPSEO_Options::get( $field_name, $default_value ); + } + + /** + * Checks whether a given control should be disabled. + * + * @param string $variable The variable within the option to check whether its control should be disabled. + * + * @return bool True if control should be disabled, false otherwise. + */ + protected function is_control_disabled( $variable ) { + if ( $this->option_instance === null ) { + return false; + } + + // Disable the Usage tracking feature for multisite subsites. + if ( $this->is_tracking_on_subsite( $variable ) ) { + return true; + } + + return $this->option_instance->is_disabled( $variable ); + } + + /** + * Gets the explanation note to print if a given control is disabled. + * + * @param string $variable The variable within the option to print a disabled note for. + * @param string $custom_note An optional custom note to print instead. + * + * @return string Explanation note HTML string, or empty string if no note necessary. + */ + protected function get_disabled_note( $variable, $custom_note = '' ) { + if ( $custom_note === '' && ! $this->is_control_disabled( $variable ) ) { + return ''; + } + $disabled_message = esc_html__( 'This feature has been disabled by the network admin.', 'wordpress-seo' ); + + // The explanation to show when disabling the Usage tracking feature for multisite subsites. + if ( $this->is_tracking_on_subsite( $variable ) ) { + $disabled_message = esc_html__( 'This feature has been disabled since subsites never send tracking data.', 'wordpress-seo' ); + } + + if ( $custom_note ) { + $disabled_message = esc_html( $custom_note ); + } + + return '

    ' . $disabled_message . '

    '; + } + + /** + * Determines whether we are dealing with the Usage tracking feature on a multisite subsite. + * This feature requires specific behavior for the toggle switch. + * + * @param string $feature_setting The feature setting. + * + * @return bool True if we are dealing with the Usage tracking feature on a multisite subsite. + */ + protected function is_tracking_on_subsite( $feature_setting ) { + return ( $feature_setting === 'tracking' && ! is_network_admin() && ! is_main_site() ); + } + + /** + * Returns the disabled attribute HTML. + * + * @param string $variable The variable within the option of the related form element. + * @param array $attr Extra attributes added to the form element. + * + * @return string The disabled attribute HTML. + */ + protected function get_disabled_attribute( $variable, $attr ) { + if ( $this->is_control_disabled( $variable ) || ( isset( $attr['disabled'] ) && $attr['disabled'] ) ) { + return ' disabled'; + } + + return ''; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-yoast-input-validation.php b/wp-content/plugins/wordpress-seo/admin/class-yoast-input-validation.php new file mode 100644 index 00000000..573840e6 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-yoast-input-validation.php @@ -0,0 +1,328 @@ + 0 ) { + return sprintf( + /* translators: %1$s: amount of errors, %2$s: the admin page title */ + _n( 'The form contains %1$s error. %2$s', 'The form contains %1$s errors. %2$s', $error_count, 'wordpress-seo' ), + number_format_i18n( $error_count ), + $admin_title + ); + } + + return $admin_title; + } + + /** + * Checks whether a specific form input field was submitted with an invalid value. + * + * @since 12.1 + * + * @param string $error_code Must be the same slug-name used for the field variable and for `add_settings_error()`. + * + * @return bool Whether or not the submitted input field contained an invalid value. + */ + public static function yoast_form_control_has_error( $error_code ) { + $errors = get_settings_errors(); + + foreach ( $errors as $error ) { + if ( $error['code'] === $error_code ) { + return true; + } + } + + return false; + } + + /** + * Sets the error descriptions. + * + * @since 12.1 + * + * @param array $descriptions An associative array of error descriptions. + * For each entry, the key must be the setting variable. + * + * @return void + */ + public static function set_error_descriptions( $descriptions = [] ) { + $defaults = [ + 'baiduverify' => sprintf( + /* translators: %s: additional message with the submitted invalid value */ + esc_html__( 'Baidu verification codes can only contain letters, numbers, hyphens, and underscores. %s', 'wordpress-seo' ), + self::get_dirty_value_message( 'baiduverify' ) + ), + 'facebook_site' => sprintf( + /* translators: %s: additional message with the submitted invalid value */ + esc_html__( 'Please check the format of the Facebook Page URL you entered. %s', 'wordpress-seo' ), + self::get_dirty_value_message( 'facebook_site' ) + ), + 'googleverify' => sprintf( + /* translators: %s: additional message with the submitted invalid value */ + esc_html__( 'Google verification codes can only contain letters, numbers, hyphens, and underscores. %s', 'wordpress-seo' ), + self::get_dirty_value_message( 'googleverify' ) + ), + 'instagram_url' => sprintf( + /* translators: %s: additional message with the submitted invalid value */ + esc_html__( 'Please check the format of the Instagram URL you entered. %s', 'wordpress-seo' ), + self::get_dirty_value_message( 'instagram_url' ) + ), + 'linkedin_url' => sprintf( + /* translators: %s: additional message with the submitted invalid value */ + esc_html__( 'Please check the format of the LinkedIn URL you entered. %s', 'wordpress-seo' ), + self::get_dirty_value_message( 'linkedin_url' ) + ), + 'msverify' => sprintf( + /* translators: %s: additional message with the submitted invalid value */ + esc_html__( 'Bing confirmation codes can only contain letters from A to F, numbers, hyphens, and underscores. %s', 'wordpress-seo' ), + self::get_dirty_value_message( 'msverify' ) + ), + 'myspace_url' => sprintf( + /* translators: %s: additional message with the submitted invalid value */ + esc_html__( 'Please check the format of the MySpace URL you entered. %s', 'wordpress-seo' ), + self::get_dirty_value_message( 'myspace_url' ) + ), + 'pinterest_url' => sprintf( + /* translators: %s: additional message with the submitted invalid value */ + esc_html__( 'Please check the format of the Pinterest URL you entered. %s', 'wordpress-seo' ), + self::get_dirty_value_message( 'pinterest_url' ) + ), + 'pinterestverify' => sprintf( + /* translators: %s: additional message with the submitted invalid value */ + esc_html__( 'Pinterest confirmation codes can only contain letters from A to F, numbers, hyphens, and underscores. %s', 'wordpress-seo' ), + self::get_dirty_value_message( 'pinterestverify' ) + ), + 'twitter_site' => sprintf( + /* translators: %s: additional message with the submitted invalid value */ + esc_html__( 'Twitter usernames can only contain letters, numbers, and underscores. %s', 'wordpress-seo' ), + self::get_dirty_value_message( 'twitter_site' ) + ), + 'wikipedia_url' => sprintf( + /* translators: %s: additional message with the submitted invalid value */ + esc_html__( 'Please check the format of the Wikipedia URL you entered. %s', 'wordpress-seo' ), + self::get_dirty_value_message( 'wikipedia_url' ) + ), + 'yandexverify' => sprintf( + /* translators: %s: additional message with the submitted invalid value */ + esc_html__( 'Yandex confirmation codes can only contain letters from A to F, numbers, hyphens, and underscores. %s', 'wordpress-seo' ), + self::get_dirty_value_message( 'yandexverify' ) + ), + 'youtube_url' => sprintf( + /* translators: %s: additional message with the submitted invalid value */ + esc_html__( 'Please check the format of the YouTube URL you entered. %s', 'wordpress-seo' ), + self::get_dirty_value_message( 'youtube_url' ) + ), + ]; + + $descriptions = wp_parse_args( $descriptions, $defaults ); + + self::$error_descriptions = $descriptions; + } + + /** + * Gets all the error descriptions. + * + * @since 12.1 + * + * @return array An associative array of error descriptions. + */ + public static function get_error_descriptions() { + return self::$error_descriptions; + } + + /** + * Gets a specific error description. + * + * @since 12.1 + * + * @param string $error_code Code of the error set via `add_settings_error()`, normally the variable name. + * + * @return string|null The error description. + */ + public static function get_error_description( $error_code ) { + if ( ! isset( self::$error_descriptions[ $error_code ] ) ) { + return null; + } + + return self::$error_descriptions[ $error_code ]; + } + + /** + * Gets the aria-invalid HTML attribute based on the submitted invalid value. + * + * @since 12.1 + * + * @param string $error_code Code of the error set via `add_settings_error()`, normally the variable name. + * + * @return string The aria-invalid HTML attribute or empty string. + */ + public static function get_the_aria_invalid_attribute( $error_code ) { + if ( self::yoast_form_control_has_error( $error_code ) ) { + return ' aria-invalid="true"'; + } + + return ''; + } + + /** + * Gets the aria-describedby HTML attribute based on the submitted invalid value. + * + * @since 12.1 + * + * @param string $error_code Code of the error set via `add_settings_error()`, normally the variable name. + * + * @return string The aria-describedby HTML attribute or empty string. + */ + public static function get_the_aria_describedby_attribute( $error_code ) { + if ( self::yoast_form_control_has_error( $error_code ) && self::get_error_description( $error_code ) ) { + return ' aria-describedby="' . esc_attr( $error_code ) . '-error-description"'; + } + + return ''; + } + + /** + * Gets the error description wrapped in a HTML paragraph. + * + * @since 12.1 + * + * @param string $error_code Code of the error set via `add_settings_error()`, normally the variable name. + * + * @return string The error description HTML or empty string. + */ + public static function get_the_error_description( $error_code ) { + $error_description = self::get_error_description( $error_code ); + + if ( self::yoast_form_control_has_error( $error_code ) && $error_description ) { + return '

    ' . $error_description . '

    '; + } + + return ''; + } + + /** + * Adds the submitted invalid value to the WordPress `$wp_settings_errors` global. + * + * @since 12.1 + * + * @param string $error_code Code of the error set via `add_settings_error()`, normally the variable name. + * @param string $dirty_value The submitted invalid value. + * + * @return void + */ + public static function add_dirty_value_to_settings_errors( $error_code, $dirty_value ) { + global $wp_settings_errors; + + if ( ! is_array( $wp_settings_errors ) ) { + return; + } + + foreach ( $wp_settings_errors as $index => $error ) { + if ( $error['code'] === $error_code ) { + // phpcs:ignore WordPress.WP.GlobalVariablesOverride -- This is a deliberate action. + $wp_settings_errors[ $index ]['yoast_dirty_value'] = $dirty_value; + } + } + } + + /** + * Gets an invalid submitted value. + * + * @since 12.1 + * + * @param string $error_code Code of the error set via `add_settings_error()`, normally the variable name. + * + * @return string The submitted invalid input field value. + */ + public static function get_dirty_value( $error_code ) { + $errors = get_settings_errors(); + + foreach ( $errors as $error ) { + if ( $error['code'] === $error_code && isset( $error['yoast_dirty_value'] ) ) { + return $error['yoast_dirty_value']; + } + } + + return ''; + } + + /** + * Gets a specific invalid value message. + * + * @since 12.1 + * + * @param string $error_code Code of the error set via `add_settings_error()`, normally the variable name. + * + * @return string The error invalid value message or empty string. + */ + public static function get_dirty_value_message( $error_code ) { + $dirty_value = self::get_dirty_value( $error_code ); + + if ( $dirty_value ) { + return sprintf( + /* translators: %s: form value as submitted. */ + esc_html__( 'The submitted value was: %s', 'wordpress-seo' ), + esc_html( $dirty_value ) + ); + } + + return ''; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-yoast-network-admin.php b/wp-content/plugins/wordpress-seo/admin/class-yoast-network-admin.php new file mode 100644 index 00000000..01f8f2f3 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-yoast-network-admin.php @@ -0,0 +1,334 @@ + $site_label pairs. + */ + public function get_site_choices( $include_empty = false, $show_title = false ) { + $choices = []; + + if ( $include_empty ) { + $choices['-'] = __( 'None', 'wordpress-seo' ); + } + + $criteria = [ + 'deleted' => 0, + 'network_id' => get_current_network_id(), + ]; + $sites = get_sites( $criteria ); + + foreach ( $sites as $site ) { + $site_name = $site->domain . $site->path; + if ( $show_title ) { + $site_name = $site->blogname . ' (' . $site->domain . $site->path . ')'; + } + $choices[ $site->blog_id ] = $site->blog_id . ': ' . $site_name; + + $site_states = $this->get_site_states( $site ); + if ( ! empty( $site_states ) ) { + $choices[ $site->blog_id ] .= ' [' . implode( ', ', $site_states ) . ']'; + } + } + + return $choices; + } + + /** + * Gets the states of a site. + * + * @param WP_Site $site Site object. + * + * @return array Array of $state_slug => $state_label pairs. + */ + public function get_site_states( $site ) { + $available_states = [ + 'public' => __( 'public', 'wordpress-seo' ), + 'archived' => __( 'archived', 'wordpress-seo' ), + 'mature' => __( 'mature', 'wordpress-seo' ), + 'spam' => __( 'spam', 'wordpress-seo' ), + 'deleted' => __( 'deleted', 'wordpress-seo' ), + ]; + + $site_states = []; + foreach ( $available_states as $state_slug => $state_label ) { + if ( $site->$state_slug === '1' ) { + $site_states[ $state_slug ] = $state_label; + } + } + + return $site_states; + } + + /** + * Handles a request to update plugin network options. + * + * This method works similar to how option updates are handled in `wp-admin/options.php` and + * `wp-admin/network/settings.php`. + * + * @return void + */ + public function handle_update_options_request() { + // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: Nonce verification will happen in verify_request below. + if ( ! isset( $_POST['network_option_group'] ) || ! is_string( $_POST['network_option_group'] ) ) { + return; + } + + // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: Nonce verification will happen in verify_request below. + $option_group = sanitize_text_field( wp_unslash( $_POST['network_option_group'] ) ); + + if ( empty( $option_group ) ) { + return; + } + + $this->verify_request( "{$option_group}-network-options" ); + + $whitelist_options = Yoast_Network_Settings_API::get()->get_whitelist_options( $option_group ); + + if ( empty( $whitelist_options ) ) { + add_settings_error( $option_group, 'settings_updated', __( 'You are not allowed to modify unregistered network settings.', 'wordpress-seo' ), 'error' ); + + $this->terminate_request(); + return; + } + + // phpcs:disable WordPress.Security.NonceVerification -- Nonce verified via `verify_request()` above. + foreach ( $whitelist_options as $option_name ) { + $value = null; + if ( isset( $_POST[ $option_name ] ) ) { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: Adding sanitize_text_field around this will break the saving of settings because it expects a string: https://github.com/Yoast/wordpress-seo/issues/12440. + $value = wp_unslash( $_POST[ $option_name ] ); + } + + WPSEO_Options::update_site_option( $option_name, $value ); + } + // phpcs:enable WordPress.Security.NonceVerification + + $settings_errors = get_settings_errors(); + if ( empty( $settings_errors ) ) { + add_settings_error( $option_group, 'settings_updated', __( 'Settings Updated.', 'wordpress-seo' ), 'updated' ); + } + + $this->terminate_request(); + } + + /** + * Handles a request to restore a site's default settings. + * + * @return void + */ + public function handle_restore_site_request() { + $this->verify_request( 'wpseo-network-restore', 'restore_site_nonce' ); + + $option_group = 'wpseo_ms'; + + // phpcs:ignore WordPress.Security.NonceVerification -- Nonce verified via `verify_request()` above. + $site_id = ! empty( $_POST[ $option_group ]['site_id'] ) ? (int) $_POST[ $option_group ]['site_id'] : 0; + if ( ! $site_id ) { + add_settings_error( $option_group, 'settings_updated', __( 'No site has been selected to restore.', 'wordpress-seo' ), 'error' ); + + $this->terminate_request(); + return; + } + + $site = get_site( $site_id ); + if ( ! $site ) { + /* translators: %s expands to the ID of a site within a multisite network. */ + add_settings_error( $option_group, 'settings_updated', sprintf( __( 'Site with ID %d not found.', 'wordpress-seo' ), $site_id ), 'error' ); + } + else { + WPSEO_Options::reset_ms_blog( $site_id ); + + /* translators: %s expands to the name of a site within a multisite network. */ + add_settings_error( $option_group, 'settings_updated', sprintf( __( '%s restored to default SEO settings.', 'wordpress-seo' ), esc_html( $site->blogname ) ), 'updated' ); + } + + $this->terminate_request(); + } + + /** + * Outputs nonce, action and option group fields for a network settings page in the plugin. + * + * @param string $option_group Option group name for the current page. + * + * @return void + */ + public function settings_fields( $option_group ) { + ?> + + + enqueue_script( 'network-admin' ); + + $translations = [ + /* translators: %s: success message */ + 'success_prefix' => __( 'Success: %s', 'wordpress-seo' ), + /* translators: %s: error message */ + 'error_prefix' => __( 'Error: %s', 'wordpress-seo' ), + ]; + $asset_manager->localize_script( + 'network-admin', + 'wpseoNetworkAdminGlobalL10n', + $translations + ); + } + + /** + * Hooks in the necessary actions and filters. + * + * @return void + */ + public function register_hooks() { + + if ( ! $this->meets_requirements() ) { + return; + } + + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); + + add_action( 'admin_action_' . self::UPDATE_OPTIONS_ACTION, [ $this, 'handle_update_options_request' ] ); + add_action( 'admin_action_' . self::RESTORE_SITE_ACTION, [ $this, 'handle_restore_site_request' ] ); + } + + /** + * Hooks in the necessary AJAX actions. + * + * @return void + */ + public function register_ajax_hooks() { + add_action( 'wp_ajax_' . self::UPDATE_OPTIONS_ACTION, [ $this, 'handle_update_options_request' ] ); + add_action( 'wp_ajax_' . self::RESTORE_SITE_ACTION, [ $this, 'handle_restore_site_request' ] ); + } + + /** + * Checks whether the requirements to use this class are met. + * + * @return bool True if requirements are met, false otherwise. + */ + public function meets_requirements() { + return is_multisite() && is_network_admin(); + } + + /** + * Verifies that the current request is valid. + * + * @param string $action Nonce action. + * @param string $query_arg Optional. Nonce query argument. Default '_wpnonce'. + * + * @return void + */ + public function verify_request( $action, $query_arg = '_wpnonce' ) { + $has_access = current_user_can( 'wpseo_manage_network_options' ); + + if ( wp_doing_ajax() ) { + check_ajax_referer( $action, $query_arg ); + + if ( ! $has_access ) { + wp_die( -1, 403 ); + } + return; + } + + check_admin_referer( $action, $query_arg ); + + if ( ! $has_access ) { + wp_die( esc_html__( 'You are not allowed to perform this action.', 'wordpress-seo' ) ); + } + } + + /** + * Terminates the current request by either redirecting back or sending an AJAX response. + * + * @return void + */ + public function terminate_request() { + if ( wp_doing_ajax() ) { + $settings_errors = get_settings_errors(); + + if ( ! empty( $settings_errors ) && $settings_errors[0]['type'] === 'updated' ) { + wp_send_json_success( $settings_errors, 200 ); + } + + wp_send_json_error( $settings_errors, 400 ); + } + + $this->persist_settings_errors(); + $this->redirect_back( [ 'settings-updated' => 'true' ] ); + } + + /** + * Persists settings errors. + * + * Settings errors are stored in a transient for 30 seconds so that this transient + * can be retrieved on the next page load. + * + * @return void + */ + protected function persist_settings_errors() { + /* + * A regular transient is used here, since it is automatically cleared right after the redirect. + * A network transient would be cleaner, but would require a lot of copied code from core for + * just a minor adjustment when displaying settings errors. + */ + set_transient( 'settings_errors', get_settings_errors(), 30 ); + } + + /** + * Redirects back to the referer URL, with optional query arguments. + * + * @param array $query_args Optional. Query arguments to add to the redirect URL. Default none. + * + * @return void + */ + protected function redirect_back( $query_args = [] ) { + $sendback = wp_get_referer(); + + if ( ! empty( $query_args ) ) { + $sendback = add_query_arg( $query_args, $sendback ); + } + + wp_safe_redirect( $sendback ); + exit; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-yoast-network-settings-api.php b/wp-content/plugins/wordpress-seo/admin/class-yoast-network-settings-api.php new file mode 100644 index 00000000..990f78ad --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-yoast-network-settings-api.php @@ -0,0 +1,164 @@ + $option_group, + 'sanitize_callback' => null, + ]; + $args = wp_parse_args( $args, $defaults ); + + if ( ! isset( $this->whitelist_options[ $option_group ] ) ) { + $this->whitelist_options[ $option_group ] = []; + } + + $this->whitelist_options[ $option_group ][] = $option_name; + + if ( ! empty( $args['sanitize_callback'] ) ) { + add_filter( "sanitize_option_{$option_name}", [ $this, 'filter_sanitize_option' ], 10, 2 ); + } + + if ( array_key_exists( 'default', $args ) ) { + add_filter( "default_site_option_{$option_name}", [ $this, 'filter_default_option' ], 10, 2 ); + } + + $this->registered_settings[ $option_name ] = $args; + } + + /** + * Gets the registered settings and their data. + * + * @return array Array of $option_name => $data pairs. + */ + public function get_registered_settings() { + return $this->registered_settings; + } + + /** + * Gets the whitelisted options for a given option group. + * + * @param string $option_group Option group. + * + * @return array List of option names, or empty array if unknown option group. + */ + public function get_whitelist_options( $option_group ) { + if ( ! isset( $this->whitelist_options[ $option_group ] ) ) { + return []; + } + + return $this->whitelist_options[ $option_group ]; + } + + /** + * Filters sanitization for a network option value. + * + * This method is added as a filter to `sanitize_option_{$option}` for network options that are + * registered with a sanitize callback. + * + * @param string $value The sanitized option value. + * @param string $option The option name. + * + * @return string The filtered sanitized option value. + */ + public function filter_sanitize_option( $value, $option ) { + + if ( empty( $this->registered_settings[ $option ] ) ) { + return $value; + } + + return call_user_func( $this->registered_settings[ $option ]['sanitize_callback'], $value ); + } + + /** + * Filters the default value for a network option. + * + * This function is added as a filter to `default_site_option_{$option}` for network options that + * are registered with a default. + * + * @param mixed $default_value Existing default value to return. + * @param string $option The option name. + * + * @return mixed The filtered default value. + */ + public function filter_default_option( $default_value, $option ) { + + // If a default value was manually passed to the function, allow it to override. + if ( $default_value !== false ) { + return $default_value; + } + + if ( empty( $this->registered_settings[ $option ] ) ) { + return $default_value; + } + + return $this->registered_settings[ $option ]['default']; + } + + /** + * Checks whether the requirements to use this class are met. + * + * @return bool True if requirements are met, false otherwise. + */ + public function meets_requirements() { + return is_multisite(); + } + + /** + * Gets the singleton instance of this class. + * + * @return Yoast_Network_Settings_API The singleton instance. + */ + public static function get() { + + if ( self::$instance === null ) { + self::$instance = new self(); + } + + return self::$instance; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-yoast-notification-center.php b/wp-content/plugins/wordpress-seo/admin/class-yoast-notification-center.php new file mode 100644 index 00000000..fcbc734d --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-yoast-notification-center.php @@ -0,0 +1,954 @@ +get_notification_by_id( $notification_id ); + if ( ( $notification instanceof Yoast_Notification ) === false ) { + + // Permit legacy. + $options = [ + 'id' => $notification_id, + 'dismissal_key' => $notification_id, + ]; + $notification = new Yoast_Notification( '', $options ); + } + + if ( self::maybe_dismiss_notification( $notification ) ) { + die( '1' ); + } + + die( '-1' ); + } + + /** + * Check if the user has dismissed a notification. + * + * @param Yoast_Notification $notification The notification to check for dismissal. + * @param int|null $user_id User ID to check on. + * + * @return bool + */ + public static function is_notification_dismissed( Yoast_Notification $notification, $user_id = null ) { + + $user_id = self::get_user_id( $user_id ); + $dismissal_key = $notification->get_dismissal_key(); + + // This checks both the site-specific user option and the meta value. + $current_value = get_user_option( $dismissal_key, $user_id ); + + // Migrate old user meta to user option on-the-fly. + if ( ! empty( $current_value ) + && metadata_exists( 'user', $user_id, $dismissal_key ) + && update_user_option( $user_id, $dismissal_key, $current_value ) ) { + delete_user_meta( $user_id, $dismissal_key ); + } + + return ! empty( $current_value ); + } + + /** + * Checks if the notification is being dismissed. + * + * @param Yoast_Notification $notification Notification to check dismissal of. + * @param string $meta_value Value to set the meta value to if dismissed. + * + * @return bool True if dismissed. + */ + public static function maybe_dismiss_notification( Yoast_Notification $notification, $meta_value = 'seen' ) { + + // Only persistent notifications are dismissible. + if ( ! $notification->is_persistent() ) { + return false; + } + + // If notification is already dismissed, we're done. + if ( self::is_notification_dismissed( $notification ) ) { + return true; + } + + $dismissal_key = $notification->get_dismissal_key(); + $notification_id = $notification->get_id(); + + $is_dismissing = ( $dismissal_key === self::get_user_input( 'notification' ) ); + if ( ! $is_dismissing ) { + $is_dismissing = ( $notification_id === self::get_user_input( 'notification' ) ); + } + + // Fallback to ?dismissal_key=1&nonce=bla when JavaScript fails. + if ( ! $is_dismissing ) { + $is_dismissing = ( self::get_user_input( $dismissal_key ) === '1' ); + } + + if ( ! $is_dismissing ) { + return false; + } + + $user_nonce = self::get_user_input( 'nonce' ); + if ( wp_verify_nonce( $user_nonce, $notification_id ) === false ) { + return false; + } + + return self::dismiss_notification( $notification, $meta_value ); + } + + /** + * Dismisses a notification. + * + * @param Yoast_Notification $notification Notification to dismiss. + * @param string $meta_value Value to save in the dismissal. + * + * @return bool True if dismissed, false otherwise. + */ + public static function dismiss_notification( Yoast_Notification $notification, $meta_value = 'seen' ) { + // Dismiss notification. + return update_user_option( get_current_user_id(), $notification->get_dismissal_key(), $meta_value ) !== false; + } + + /** + * Restores a notification. + * + * @param Yoast_Notification $notification Notification to restore. + * + * @return bool True if restored, false otherwise. + */ + public static function restore_notification( Yoast_Notification $notification ) { + + $user_id = get_current_user_id(); + $dismissal_key = $notification->get_dismissal_key(); + + // Restore notification. + $restored = delete_user_option( $user_id, $dismissal_key ); + + // Delete unprefixed user meta too for backward-compatibility. + if ( metadata_exists( 'user', $user_id, $dismissal_key ) ) { + $restored = delete_user_meta( $user_id, $dismissal_key ) && $restored; + } + + return $restored; + } + + /** + * Clear dismissal information for the specified Notification. + * + * When a cause is resolved, the next time it is present we want to show + * the message again. + * + * @param string|Yoast_Notification $notification Notification to clear the dismissal of. + * + * @return bool + */ + public function clear_dismissal( $notification ) { + + global $wpdb; + + if ( $notification instanceof Yoast_Notification ) { + $dismissal_key = $notification->get_dismissal_key(); + } + + if ( is_string( $notification ) ) { + $dismissal_key = $notification; + } + + if ( empty( $dismissal_key ) ) { + return false; + } + + // Remove notification dismissal for all users. + $deleted = delete_metadata( 'user', 0, $wpdb->get_blog_prefix() . $dismissal_key, '', true ); + + // Delete unprefixed user meta too for backward-compatibility. + $deleted = delete_metadata( 'user', 0, $dismissal_key, '', true ) || $deleted; + + return $deleted; + } + + /** + * Retrieves notifications from the storage and merges in previous notification changes. + * + * The current user in WordPress is not loaded shortly before the 'init' hook, but the plugin + * sometimes needs to add or remove notifications before that. In such cases, the transactions + * are not actually executed, but added to a queue. That queue is then handled in this method, + * after notifications for the current user have been set up. + * + * @return void + */ + public function setup_current_notifications() { + $this->retrieve_notifications_from_storage( get_current_user_id() ); + + foreach ( $this->queued_transactions as $transaction ) { + list( $callback, $args ) = $transaction; + + call_user_func_array( $callback, $args ); + } + + $this->queued_transactions = []; + } + + /** + * Add notification to the cookie. + * + * @param Yoast_Notification $notification Notification object instance. + * + * @return void + */ + public function add_notification( Yoast_Notification $notification ) { + + $callback = [ $this, __FUNCTION__ ]; + $args = func_get_args(); + if ( $this->queue_transaction( $callback, $args ) ) { + return; + } + + // Don't add if the user can't see it. + if ( ! $notification->display_for_current_user() ) { + return; + } + + $notification_id = $notification->get_id(); + $user_id = $notification->get_user_id(); + + // Empty notifications are always added. + if ( $notification_id !== '' ) { + + // If notification ID exists in notifications, don't add again. + $present_notification = $this->get_notification_by_id( $notification_id, $user_id ); + if ( ! is_null( $present_notification ) ) { + $this->remove_notification( $present_notification, false ); + } + + if ( is_null( $present_notification ) ) { + $this->new[] = $notification_id; + } + } + + // Add to list. + $this->notifications[ $user_id ][] = $notification; + + $this->notifications_need_storage = true; + } + + /** + * Get the notification by ID and user ID. + * + * @param string $notification_id The ID of the notification to search for. + * @param int|null $user_id The ID of the user. + * + * @return Yoast_Notification|null + */ + public function get_notification_by_id( $notification_id, $user_id = null ) { + $user_id = self::get_user_id( $user_id ); + + $notifications = $this->get_notifications_for_user( $user_id ); + + foreach ( $notifications as $notification ) { + if ( $notification_id === $notification->get_id() ) { + return $notification; + } + } + + return null; + } + + /** + * Display the notifications. + * + * @param bool $echo_as_json True when notifications should be printed directly. + * + * @return void + */ + public function display_notifications( $echo_as_json = false ) { + + // Never display notifications for network admin. + if ( is_network_admin() ) { + return; + } + + $sorted_notifications = $this->get_sorted_notifications(); + $notifications = array_filter( $sorted_notifications, [ $this, 'is_notification_persistent' ] ); + + if ( empty( $notifications ) ) { + return; + } + + array_walk( $notifications, [ $this, 'remove_notification' ] ); + + $notifications = array_unique( $notifications ); + if ( $echo_as_json ) { + $notification_json = []; + + foreach ( $notifications as $notification ) { + $notification_json[] = $notification->render(); + } + + // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: WPSEO_Utils::format_json_encode is safe. + echo WPSEO_Utils::format_json_encode( $notification_json ); + + return; + } + + foreach ( $notifications as $notification ) { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: Temporarily disabled, see: https://github.com/Yoast/wordpress-seo-premium/issues/2510 and https://github.com/Yoast/wordpress-seo-premium/issues/2511. + echo $notification; + } + } + + /** + * Remove notification after it has been displayed. + * + * @param Yoast_Notification $notification Notification to remove. + * @param bool $resolve Resolve as fixed. + * + * @return void + */ + public function remove_notification( Yoast_Notification $notification, $resolve = true ) { + + $callback = [ $this, __FUNCTION__ ]; + $args = func_get_args(); + if ( $this->queue_transaction( $callback, $args ) ) { + return; + } + + $index = false; + + // ID of the user to show the notification for, defaults to current user id. + $user_id = $notification->get_user_id(); + $notifications = $this->get_notifications_for_user( $user_id ); + + // Match persistent Notifications by ID, non persistent by item in the array. + if ( $notification->is_persistent() ) { + foreach ( $notifications as $current_index => $present_notification ) { + if ( $present_notification->get_id() === $notification->get_id() ) { + $index = $current_index; + break; + } + } + } + else { + $index = array_search( $notification, $notifications, true ); + } + + if ( $index === false ) { + return; + } + + if ( $notification->is_persistent() && $resolve ) { + ++$this->resolved; + $this->clear_dismissal( $notification ); + } + + unset( $notifications[ $index ] ); + $this->notifications[ $user_id ] = array_values( $notifications ); + + $this->notifications_need_storage = true; + } + + /** + * Removes a notification by its ID. + * + * @param string $notification_id The notification id. + * @param bool $resolve Resolve as fixed. + * + * @return void + */ + public function remove_notification_by_id( $notification_id, $resolve = true ) { + $notification = $this->get_notification_by_id( $notification_id ); + + if ( $notification === null ) { + return; + } + + $this->remove_notification( $notification, $resolve ); + $this->notifications_need_storage = true; + } + + /** + * Get the notification count. + * + * @param bool $dismissed Count dismissed notifications. + * + * @return int Number of notifications + */ + public function get_notification_count( $dismissed = false ) { + + $notifications = $this->get_notifications_for_user( get_current_user_id() ); + $notifications = array_filter( $notifications, [ $this, 'filter_persistent_notifications' ] ); + + if ( ! $dismissed ) { + $notifications = array_filter( $notifications, [ $this, 'filter_dismissed_notifications' ] ); + } + + return count( $notifications ); + } + + /** + * Get the number of notifications resolved this execution. + * + * These notifications have been resolved and should be counted when active again. + * + * @return int + */ + public function get_resolved_notification_count() { + + return $this->resolved; + } + + /** + * Return the notifications sorted on type and priority. + * + * @return array|Yoast_Notification[] Sorted Notifications + */ + public function get_sorted_notifications() { + $notifications = $this->get_notifications_for_user( get_current_user_id() ); + if ( empty( $notifications ) ) { + return []; + } + + // Sort by severity, error first. + usort( $notifications, [ $this, 'sort_notifications' ] ); + + return $notifications; + } + + /** + * AJAX display notifications. + * + * @return void + */ + public function ajax_get_notifications() { + $echo = false; + // phpcs:ignore WordPress.Security.NonceVerification.Missing,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form data. + if ( isset( $_POST['version'] ) && is_string( $_POST['version'] ) ) { + // phpcs:ignore WordPress.Security.NonceVerification.Missing,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are only comparing the variable in a condition. + $echo = wp_unslash( $_POST['version'] ) === '2'; + } + + // Display the notices. + $this->display_notifications( $echo ); + + // AJAX die. + exit; + } + + /** + * Remove storage when the plugin is deactivated. + * + * @return void + */ + public function deactivate_hook() { + + $this->clear_notifications(); + } + + /** + * Returns the given user ID if it exists. + * Otherwise, this function returns the ID of the current user. + * + * @param int $user_id The user ID to check. + * + * @return int The user ID to use. + */ + private static function get_user_id( $user_id ) { + if ( $user_id ) { + return $user_id; + } + return get_current_user_id(); + } + + /** + * Splits the notifications on user ID. + * + * In other terms, it returns an associative array, + * mapping user ID to a list of notifications for this user. + * + * @param array|Yoast_Notification[] $notifications The notifications to split. + * + * @return array The notifications, split on user ID. + */ + private function split_on_user_id( $notifications ) { + $split_notifications = []; + foreach ( $notifications as $notification ) { + $split_notifications[ $notification->get_user_id() ][] = $notification; + } + return $split_notifications; + } + + /** + * Save persistent notifications to storage. + * + * We need to be able to retrieve these so they can be dismissed at any time during the execution. + * + * @since 3.2 + * + * @return void + */ + public function update_storage() { + + $notifications = $this->notifications; + + /** + * One array of Yoast_Notifications, merged from multiple arrays. + * + * @var Yoast_Notification[] $merged_notifications + */ + $merged_notifications = []; + if ( ! empty( $notifications ) ) { + $merged_notifications = array_merge( ...$notifications ); + } + + /** + * Filter: 'yoast_notifications_before_storage' - Allows developer to filter notifications before saving them. + * + * @param Yoast_Notification[] $notifications + */ + $filtered_merged_notifications = apply_filters( 'yoast_notifications_before_storage', $merged_notifications ); + + // The notifications were filtered and therefore need to be stored. + if ( $merged_notifications !== $filtered_merged_notifications ) { + $merged_notifications = $filtered_merged_notifications; + $this->notifications_need_storage = true; + } + + $notifications = $this->split_on_user_id( $merged_notifications ); + + // No notifications to store, clear storage if it was previously present. + if ( empty( $notifications ) ) { + $this->remove_storage(); + + return; + } + + // Only store notifications if changes are made. + if ( $this->notifications_need_storage ) { + array_walk( $notifications, [ $this, 'store_notifications_for_user' ] ); + } + } + + /** + * Stores the notifications to its respective user's storage. + * + * @param array|Yoast_Notification[] $notifications The notifications to store. + * @param int $user_id The ID of the user for which to store the notifications. + * + * @return void + */ + private function store_notifications_for_user( $notifications, $user_id ) { + $notifications_as_arrays = array_map( [ $this, 'notification_to_array' ], $notifications ); + update_user_option( $user_id, self::STORAGE_KEY, $notifications_as_arrays ); + } + + /** + * Provide a way to verify present notifications. + * + * @return array|Yoast_Notification[] Registered notifications. + */ + public function get_notifications() { + if ( ! $this->notifications ) { + return []; + } + return array_merge( ...$this->notifications ); + } + + /** + * Returns the notifications for the given user. + * + * @param int $user_id The id of the user to check. + * + * @return Yoast_Notification[] The notifications for the user with the given ID. + */ + public function get_notifications_for_user( $user_id ) { + if ( array_key_exists( $user_id, $this->notifications ) ) { + return $this->notifications[ $user_id ]; + } + return []; + } + + /** + * Get newly added notifications. + * + * @return array + */ + public function get_new_notifications() { + + return array_map( [ $this, 'get_notification_by_id' ], $this->new ); + } + + /** + * Get information from the User input. + * + * Note that this function does not handle nonce verification. + * + * @param string $key Key to retrieve. + * + * @return string non-sanitized value of key if set, an empty string otherwise. + */ + private static function get_user_input( $key ) { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized,WordPress.Security.NonceVerification.Missing -- Reason: We are not processing form information and only using this variable in a comparison. + $request_method = isset( $_SERVER['REQUEST_METHOD'] ) && is_string( $_SERVER['REQUEST_METHOD'] ) ? strtoupper( wp_unslash( $_SERVER['REQUEST_METHOD'] ) ) : ''; + // phpcs:disable WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: This function does not sanitize variables. + // phpcs:disable WordPress.Security.NonceVerification.Recommended,WordPress.Security.NonceVerification.Missing -- Reason: This function does not verify a nonce. + if ( $request_method === 'POST' ) { + if ( isset( $_POST[ $key ] ) && is_string( $_POST[ $key ] ) ) { + return wp_unslash( $_POST[ $key ] ); + } + } + elseif ( isset( $_GET[ $key ] ) && is_string( $_GET[ $key ] ) ) { + return wp_unslash( $_GET[ $key ] ); + } + // phpcs:enable WordPress.Security.NonceVerification.Missing,WordPress.Security.NonceVerification.Missing,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + return ''; + } + + /** + * Retrieve the notifications from storage and fill the relevant property. + * + * @param int $user_id The ID of the user to retrieve notifications for. + * + * @return void + */ + private function retrieve_notifications_from_storage( $user_id ) { + if ( $this->notifications_retrieved ) { + return; + } + + $this->notifications_retrieved = true; + + $stored_notifications = get_user_option( self::STORAGE_KEY, $user_id ); + + // Check if notifications are stored. + if ( empty( $stored_notifications ) ) { + return; + } + + if ( is_array( $stored_notifications ) ) { + $notifications = array_map( [ $this, 'array_to_notification' ], $stored_notifications ); + + // Apply array_values to ensure we get a 0-indexed array. + $notifications = array_values( array_filter( $notifications, [ $this, 'filter_notification_current_user' ] ) ); + + $this->notifications[ $user_id ] = $notifications; + } + } + + /** + * Sort on type then priority. + * + * @param Yoast_Notification $a Compare with B. + * @param Yoast_Notification $b Compare with A. + * + * @return int 1, 0 or -1 for sorting offset. + */ + private function sort_notifications( Yoast_Notification $a, Yoast_Notification $b ) { + + $a_type = $a->get_type(); + $b_type = $b->get_type(); + + if ( $a_type === $b_type ) { + return WPSEO_Utils::calc( $b->get_priority(), 'compare', $a->get_priority() ); + } + + if ( $a_type === 'error' ) { + return -1; + } + + if ( $b_type === 'error' ) { + return 1; + } + + return 0; + } + + /** + * Clear local stored notifications. + * + * @return void + */ + private function clear_notifications() { + + $this->notifications = []; + $this->notifications_retrieved = false; + } + + /** + * Filter out non-persistent notifications. + * + * @since 3.2 + * + * @param Yoast_Notification $notification Notification to test for persistent. + * + * @return bool + */ + private function filter_persistent_notifications( Yoast_Notification $notification ) { + + return $notification->is_persistent(); + } + + /** + * Filter out dismissed notifications. + * + * @param Yoast_Notification $notification Notification to check. + * + * @return bool + */ + private function filter_dismissed_notifications( Yoast_Notification $notification ) { + + return ! self::maybe_dismiss_notification( $notification ); + } + + /** + * Convert Notification to array representation. + * + * @since 3.2 + * + * @param Yoast_Notification $notification Notification to convert. + * + * @return array + */ + private function notification_to_array( Yoast_Notification $notification ) { + + $notification_data = $notification->to_array(); + + if ( isset( $notification_data['nonce'] ) ) { + unset( $notification_data['nonce'] ); + } + + return $notification_data; + } + + /** + * Convert stored array to Notification. + * + * @param array $notification_data Array to convert to Notification. + * + * @return Yoast_Notification + */ + private function array_to_notification( $notification_data ) { + + if ( isset( $notification_data['options']['nonce'] ) ) { + unset( $notification_data['options']['nonce'] ); + } + + if ( isset( $notification_data['message'] ) + && is_subclass_of( $notification_data['message'], Abstract_Presenter::class, false ) + ) { + $notification_data['message'] = $notification_data['message']->present(); + } + + if ( isset( $notification_data['options']['user'] ) ) { + $notification_data['options']['user_id'] = $notification_data['options']['user']->ID; + unset( $notification_data['options']['user'] ); + + $this->notifications_need_storage = true; + } + + return new Yoast_Notification( + $notification_data['message'], + $notification_data['options'] + ); + } + + /** + * Filter notifications that should not be displayed for the current user. + * + * @param Yoast_Notification $notification Notification to test. + * + * @return bool + */ + private function filter_notification_current_user( Yoast_Notification $notification ) { + return $notification->display_for_current_user(); + } + + /** + * Checks if given notification is persistent. + * + * @param Yoast_Notification $notification The notification to check. + * + * @return bool True when notification is not persistent. + */ + private function is_notification_persistent( Yoast_Notification $notification ) { + return ! $notification->is_persistent(); + } + + /** + * Queues a notification transaction for later execution if notifications are not yet set up. + * + * @param callable $callback Callback that performs the transaction. + * @param array $args Arguments to pass to the callback. + * + * @return bool True if transaction was queued, false if it can be performed immediately. + */ + private function queue_transaction( $callback, $args ) { + if ( $this->notifications_retrieved ) { + return false; + } + + $this->add_transaction_to_queue( $callback, $args ); + + return true; + } + + /** + * Adds a notification transaction to the queue for later execution. + * + * @param callable $callback Callback that performs the transaction. + * @param array $args Arguments to pass to the callback. + * + * @return void + */ + private function add_transaction_to_queue( $callback, $args ) { + $this->queued_transactions[] = [ $callback, $args ]; + } + + /** + * Removes all notifications from storage. + * + * @return bool True when notifications got removed. + */ + protected function remove_storage() { + if ( ! $this->has_stored_notifications() ) { + return false; + } + + delete_user_option( get_current_user_id(), self::STORAGE_KEY ); + return true; + } + + /** + * Checks if there are stored notifications. + * + * @return bool True when there are stored notifications. + */ + protected function has_stored_notifications() { + $stored_notifications = $this->get_stored_notifications(); + + return ! empty( $stored_notifications ); + } + + /** + * Retrieves the stored notifications. + * + * @codeCoverageIgnore + * + * @return array|false Array with notifications or false when not set. + */ + protected function get_stored_notifications() { + return get_user_option( self::STORAGE_KEY, get_current_user_id() ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-yoast-notification.php b/wp-content/plugins/wordpress-seo/admin/class-yoast-notification.php new file mode 100644 index 00000000..3191827b --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-yoast-notification.php @@ -0,0 +1,429 @@ + self::UPDATED, + 'id' => '', + 'user_id' => null, + 'nonce' => null, + 'priority' => 0.5, + 'data_json' => [], + 'dismissal_key' => null, + 'capabilities' => [], + 'capability_check' => self::MATCH_ALL, + 'yoast_branding' => false, + ]; + + /** + * The message for the notification. + * + * @var string + */ + private $message; + + /** + * Notification class constructor. + * + * @param string $message Message string. + * @param array $options Set of options. + */ + public function __construct( $message, $options = [] ) { + $this->message = $message; + $this->options = $this->normalize_options( $options ); + } + + /** + * Retrieve notification ID string. + * + * @return string + */ + public function get_id() { + return $this->options['id']; + } + + /** + * Retrieve the user to show the notification for. + * + * @deprecated 21.6 + * @codeCoverageIgnore + * + * @return WP_User The user to show this notification for. + */ + public function get_user() { + _deprecated_function( __METHOD__, 'Yoast SEO 21.6' ); + return null; + } + + /** + * Retrieve the id of the user to show the notification for. + * + * Returns the id of the current user if not user has been sent. + * + * @return int The user id + */ + public function get_user_id() { + return ( $this->options['user_id'] ?? get_current_user_id() ); + } + + /** + * Retrieve nonce identifier. + * + * @return string|null Nonce for this Notification. + */ + public function get_nonce() { + if ( $this->options['id'] && empty( $this->options['nonce'] ) ) { + $this->options['nonce'] = wp_create_nonce( $this->options['id'] ); + } + + return $this->options['nonce']; + } + + /** + * Make sure the nonce is up to date. + * + * @return void + */ + public function refresh_nonce() { + if ( $this->options['id'] ) { + $this->options['nonce'] = wp_create_nonce( $this->options['id'] ); + } + } + + /** + * Get the type of the notification. + * + * @return string + */ + public function get_type() { + return $this->options['type']; + } + + /** + * Priority of the notification. + * + * Relative to the type. + * + * @return float Returns the priority between 0 and 1. + */ + public function get_priority() { + return $this->options['priority']; + } + + /** + * Get the User Meta key to check for dismissal of notification. + * + * @return string User Meta Option key that registers dismissal. + */ + public function get_dismissal_key() { + if ( empty( $this->options['dismissal_key'] ) ) { + return $this->options['id']; + } + + return $this->options['dismissal_key']; + } + + /** + * Is this Notification persistent. + * + * @return bool True if persistent, False if fire and forget. + */ + public function is_persistent() { + $id = $this->get_id(); + + return ! empty( $id ); + } + + /** + * Check if the notification is relevant for the current user. + * + * @return bool True if a user needs to see this notification, false if not. + */ + public function display_for_current_user() { + // If the notification is for the current page only, always show. + if ( ! $this->is_persistent() ) { + return true; + } + + // If the current user doesn't match capabilities. + return $this->match_capabilities(); + } + + /** + * Does the current user match required capabilities. + * + * @return bool + */ + public function match_capabilities() { + // Super Admin can do anything. + if ( is_multisite() && is_super_admin( $this->options['user_id'] ) ) { + return true; + } + + /** + * Filter capabilities that enable the displaying of this notification. + * + * @param array $capabilities The capabilities that must be present for this notification. + * @param Yoast_Notification $notification The notification object. + * + * @return array Array of capabilities or empty for no restrictions. + * + * @since 3.2 + */ + $capabilities = apply_filters( 'wpseo_notification_capabilities', $this->options['capabilities'], $this ); + + // Should be an array. + if ( ! is_array( $capabilities ) ) { + $capabilities = (array) $capabilities; + } + + /** + * Filter capability check to enable all or any capabilities. + * + * @param string $capability_check The type of check that will be used to determine if an capability is present. + * @param Yoast_Notification $notification The notification object. + * + * @return string self::MATCH_ALL or self::MATCH_ANY. + * + * @since 3.2 + */ + $capability_check = apply_filters( 'wpseo_notification_capability_check', $this->options['capability_check'], $this ); + + if ( ! in_array( $capability_check, [ self::MATCH_ALL, self::MATCH_ANY ], true ) ) { + $capability_check = self::MATCH_ALL; + } + + if ( ! empty( $capabilities ) ) { + + $has_capabilities = array_filter( $capabilities, [ $this, 'has_capability' ] ); + + switch ( $capability_check ) { + case self::MATCH_ALL: + return $has_capabilities === $capabilities; + case self::MATCH_ANY: + return ! empty( $has_capabilities ); + } + } + + return true; + } + + /** + * Array filter function to find matched capabilities. + * + * @param string $capability Capability to test. + * + * @return bool + */ + private function has_capability( $capability ) { + $user_id = $this->options['user_id']; + if ( ! is_numeric( $user_id ) ) { + return false; + } + $user = get_user_by( 'id', $user_id ); + if ( ! $user ) { + return false; + } + + return $user->has_cap( $capability ); + } + + /** + * Return the object properties as an array. + * + * @return array + */ + public function to_array() { + return [ + 'message' => $this->message, + 'options' => $this->options, + ]; + } + + /** + * Adds string (view) behaviour to the notification. + * + * @return string + */ + public function __toString() { + return $this->render(); + } + + /** + * Renders the notification as a string. + * + * @return string The rendered notification. + */ + public function render() { + $attributes = []; + + // Default notification classes. + $classes = [ + 'yoast-notification', + ]; + + // Maintain WordPress visualisation of notifications when they are not persistent. + if ( ! $this->is_persistent() ) { + $classes[] = 'notice'; + $classes[] = $this->get_type(); + } + + if ( ! empty( $classes ) ) { + $attributes['class'] = implode( ' ', $classes ); + } + + // Combined attribute key and value into a string. + array_walk( $attributes, [ $this, 'parse_attributes' ] ); + + $message = null; + if ( $this->options['yoast_branding'] ) { + $message = $this->wrap_yoast_seo_icon( $this->message ); + } + + if ( $message === null ) { + $message = wpautop( $this->message ); + } + + // Build the output DIV. + return '
    ' . $message . '
    ' . PHP_EOL; + } + + /** + * Wraps the message with a Yoast SEO icon. + * + * @param string $message The message to wrap. + * + * @return string The wrapped message. + */ + private function wrap_yoast_seo_icon( $message ) { + $out = sprintf( + '', + esc_url( plugin_dir_url( WPSEO_FILE ) . 'packages/js/images/Yoast_SEO_Icon.svg' ), + 60, + 60 + ); + $out .= '
    '; + $out .= $message; + $out .= '
    '; + + return $out; + } + + /** + * Get the JSON if provided. + * + * @return false|string + */ + public function get_json() { + if ( empty( $this->options['data_json'] ) ) { + return ''; + } + + return WPSEO_Utils::format_json_encode( $this->options['data_json'] ); + } + + /** + * Make sure we only have values that we can work with. + * + * @param array $options Options to normalize. + * + * @return array + */ + private function normalize_options( $options ) { + $options = wp_parse_args( $options, $this->defaults ); + + // Should not exceed 0 or 1. + $options['priority'] = min( 1, max( 0, $options['priority'] ) ); + + // Set default capabilities when not supplied. + if ( empty( $options['capabilities'] ) || $options['capabilities'] === [] ) { + $options['capabilities'] = [ 'wpseo_manage_options' ]; + } + + // Set to the id of the current user if not supplied. + if ( $options['user_id'] === null ) { + $options['user_id'] = get_current_user_id(); + } + + return $options; + } + + /** + * Format HTML element attributes. + * + * @param string $value Attribute value. + * @param string $key Attribute name. + * + * @return void + */ + private function parse_attributes( &$value, $key ) { + $value = sprintf( '%s="%s"', sanitize_key( $key ), esc_attr( $value ) ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/class-yoast-notifications.php b/wp-content/plugins/wordpress-seo/admin/class-yoast-notifications.php new file mode 100644 index 00000000..c3847e01 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-yoast-notifications.php @@ -0,0 +1,319 @@ +add_hooks(); + } + + /** + * Add hooks + * + * @return void + */ + private function add_hooks() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + if ( isset( $_GET['page'] ) && is_string( $_GET['page'] ) ) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + $page = sanitize_text_field( wp_unslash( $_GET['page'] ) ); + if ( $page === self::ADMIN_PAGE ) { + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); + } + } + + // Needed for adminbar and Notifications page. + add_action( 'admin_init', [ self::class, 'collect_notifications' ], 99 ); + + // Add AJAX hooks. + add_action( 'wp_ajax_yoast_dismiss_notification', [ $this, 'ajax_dismiss_notification' ] ); + add_action( 'wp_ajax_yoast_restore_notification', [ $this, 'ajax_restore_notification' ] ); + } + + /** + * Enqueue assets. + * + * @return void + */ + public function enqueue_assets() { + $asset_manager = new WPSEO_Admin_Asset_Manager(); + + $asset_manager->enqueue_style( 'notifications' ); + } + + /** + * Handle ajax request to dismiss a notification. + * + * @return void + */ + public function ajax_dismiss_notification() { + + $notification = $this->get_notification_from_ajax_request(); + if ( $notification ) { + $notification_center = Yoast_Notification_Center::get(); + $notification_center->maybe_dismiss_notification( $notification ); + + $this->output_ajax_response( $notification->get_type() ); + } + + wp_die(); + } + + /** + * Handle ajax request to restore a notification. + * + * @return void + */ + public function ajax_restore_notification() { + + $notification = $this->get_notification_from_ajax_request(); + if ( $notification ) { + $notification_center = Yoast_Notification_Center::get(); + $notification_center->restore_notification( $notification ); + + $this->output_ajax_response( $notification->get_type() ); + } + + wp_die(); + } + + /** + * Create AJAX response data. + * + * @param string $type Notification type. + * + * @return void + */ + private function output_ajax_response( $type ) { + + $html = $this->get_view_html( $type ); + // phpcs:disable WordPress.Security.EscapeOutput -- Reason: WPSEO_Utils::format_json_encode is safe. + echo WPSEO_Utils::format_json_encode( + [ + 'html' => $html, + 'total' => self::get_active_notification_count(), + ] + ); + // phpcs:enable -- Reason: WPSEO_Utils::format_json_encode is safe. + } + + /** + * Get the HTML to return in the AJAX request. + * + * @param string $type Notification type. + * + * @return bool|string + */ + private function get_view_html( $type ) { + + switch ( $type ) { + case 'error': + $view = 'errors'; + break; + + case 'warning': + default: + $view = 'warnings'; + break; + } + + // Re-collect notifications. + self::collect_notifications(); + + /** + * Stops PHPStorm from nagging about this variable being unused. The variable is used in the view. + * + * @noinspection PhpUnusedLocalVariableInspection + */ + $notifications_data = self::get_template_variables(); + + ob_start(); + include WPSEO_PATH . 'admin/views/partial-notifications-' . $view . '.php'; + $html = ob_get_clean(); + + return $html; + } + + /** + * Extract the Yoast Notification from the AJAX request. + * + * This function does not handle nonce verification. + * + * @return Yoast_Notification|null A Yoast_Notification on success, null on failure. + */ + private function get_notification_from_ajax_request() { + // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: This function does not handle nonce verification. + if ( ! isset( $_POST['notification'] ) || ! is_string( $_POST['notification'] ) ) { + return null; + } + // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: This function does not handle nonce verification. + $notification_id = sanitize_text_field( wp_unslash( $_POST['notification'] ) ); + + if ( empty( $notification_id ) ) { + return null; + } + $notification_center = Yoast_Notification_Center::get(); + return $notification_center->get_notification_by_id( $notification_id ); + } + + /** + * Collect the notifications and group them together. + * + * @return void + */ + public static function collect_notifications() { + + $notification_center = Yoast_Notification_Center::get(); + + $notifications = $notification_center->get_sorted_notifications(); + self::$notification_count = count( $notifications ); + + self::$errors = array_filter( $notifications, [ self::class, 'filter_error_notifications' ] ); + self::$dismissed_errors = array_filter( self::$errors, [ self::class, 'filter_dismissed_notifications' ] ); + self::$active_errors = array_diff( self::$errors, self::$dismissed_errors ); + + self::$warnings = array_filter( $notifications, [ self::class, 'filter_warning_notifications' ] ); + self::$dismissed_warnings = array_filter( self::$warnings, [ self::class, 'filter_dismissed_notifications' ] ); + self::$active_warnings = array_diff( self::$warnings, self::$dismissed_warnings ); + } + + /** + * Get the variables needed in the views. + * + * @return array + */ + public static function get_template_variables() { + + return [ + 'metrics' => [ + 'total' => self::$notification_count, + 'active' => self::get_active_notification_count(), + 'errors' => count( self::$errors ), + 'warnings' => count( self::$warnings ), + ], + 'errors' => [ + 'dismissed' => self::$dismissed_errors, + 'active' => self::$active_errors, + ], + 'warnings' => [ + 'dismissed' => self::$dismissed_warnings, + 'active' => self::$active_warnings, + ], + ]; + } + + /** + * Get the number of active notifications. + * + * @return int + */ + public static function get_active_notification_count() { + + return ( count( self::$active_errors ) + count( self::$active_warnings ) ); + } + + /** + * Filter out any non-errors. + * + * @param Yoast_Notification $notification Notification to test. + * + * @return bool + */ + private static function filter_error_notifications( Yoast_Notification $notification ) { + + return $notification->get_type() === 'error'; + } + + /** + * Filter out any non-warnings. + * + * @param Yoast_Notification $notification Notification to test. + * + * @return bool + */ + private static function filter_warning_notifications( Yoast_Notification $notification ) { + + return $notification->get_type() !== 'error'; + } + + /** + * Filter out any dismissed notifications. + * + * @param Yoast_Notification $notification Notification to test. + * + * @return bool + */ + private static function filter_dismissed_notifications( Yoast_Notification $notification ) { + + return Yoast_Notification_Center::is_notification_dismissed( $notification ); + } +} + +class_alias( Yoast_Notifications::class, 'Yoast_Alerts' ); diff --git a/wp-content/plugins/wordpress-seo/admin/class-yoast-plugin-conflict.php b/wp-content/plugins/wordpress-seo/admin/class-yoast-plugin-conflict.php new file mode 100644 index 00000000..302cd495 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/class-yoast-plugin-conflict.php @@ -0,0 +1,342 @@ +plugins the active plugins will be stored in this + * property. + * + * @var array + */ + protected $active_conflicting_plugins = []; + + /** + * Property for holding instance of itself. + * + * @var Yoast_Plugin_Conflict + */ + protected static $instance; + + /** + * For the use of singleton pattern. Create instance of itself and return this instance. + * + * @param string $class_name Give the classname to initialize. If classname is + * false (empty) it will use it's own __CLASS__. + * + * @return Yoast_Plugin_Conflict + */ + public static function get_instance( $class_name = '' ) { + + if ( is_null( self::$instance ) ) { + if ( ! is_string( $class_name ) || $class_name === '' ) { + $class_name = self::class; + } + + self::$instance = new $class_name(); + } + + return self::$instance; + } + + /** + * Setting instance, all active plugins and search for active plugins. + * + * Protected constructor to prevent creating a new instance of the + * *Singleton* via the `new` operator from outside this class. + */ + protected function __construct() { + // Set active plugins. + $this->all_active_plugins = get_option( 'active_plugins' ); + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + if ( isset( $_GET['action'] ) && is_string( $_GET['action'] ) ) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information and only comparing the variable in a condition. + $action = wp_unslash( $_GET['action'] ); + if ( $action === 'deactivate' ) { + $this->remove_deactivated_plugin(); + } + } + + // Search for active plugins. + $this->search_active_plugins(); + } + + /** + * Check if there are conflicting plugins for given $plugin_section. + * + * @param string $plugin_section Type of plugin conflict (such as Open Graph or sitemap). + * + * @return bool + */ + public function check_for_conflicts( $plugin_section ) { + + static $sections_checked; + + // Return early if there are no active conflicting plugins at all. + if ( empty( $this->active_conflicting_plugins ) ) { + return false; + } + + if ( $sections_checked === null ) { + $sections_checked = []; + } + + if ( ! in_array( $plugin_section, $sections_checked, true ) ) { + $sections_checked[] = $plugin_section; + return ( ! empty( $this->active_conflicting_plugins[ $plugin_section ] ) ); + } + + return false; + } + + /** + * Checks for given $plugin_sections for conflicts. + * + * @param array $plugin_sections Set of sections. + * + * @return void + */ + public function check_plugin_conflicts( $plugin_sections ) { + foreach ( $plugin_sections as $plugin_section => $readable_plugin_section ) { + // Check for conflicting plugins and show error if there are conflicts. + if ( $this->check_for_conflicts( $plugin_section ) ) { + $this->set_error( $plugin_section, $readable_plugin_section ); + } + } + + // List of all active sections. + $sections = array_keys( $plugin_sections ); + // List of all sections. + $all_plugin_sections = array_keys( $this->plugins ); + + /* + * Get all sections that are inactive. + * These plugins need to be cleared. + * + * This happens when Sitemaps or OpenGraph implementations toggle active/disabled. + */ + $inactive_sections = array_diff( $all_plugin_sections, $sections ); + if ( ! empty( $inactive_sections ) ) { + foreach ( $inactive_sections as $section ) { + array_walk( $this->plugins[ $section ], [ $this, 'clear_error' ] ); + } + } + + // For active sections clear errors for inactive plugins. + foreach ( $sections as $section ) { + // By default, clear errors for all plugins of the section. + $inactive_plugins = $this->plugins[ $section ]; + + // If there are active plugins, filter them from being cleared. + if ( isset( $this->active_conflicting_plugins[ $section ] ) ) { + $inactive_plugins = array_diff( $this->plugins[ $section ], $this->active_conflicting_plugins[ $section ] ); + } + + array_walk( $inactive_plugins, [ $this, 'clear_error' ] ); + } + } + + /** + * Setting an error on the screen. + * + * @param string $plugin_section Type of conflict group (such as Open Graph or sitemap). + * @param string $readable_plugin_section This is the value for the translation. + * + * @return void + */ + protected function set_error( $plugin_section, $readable_plugin_section ) { + + $notification_center = Yoast_Notification_Center::get(); + + foreach ( $this->active_conflicting_plugins[ $plugin_section ] as $plugin_file ) { + + $plugin_name = $this->get_plugin_name( $plugin_file ); + + $error_message = ''; + /* translators: %1$s: 'Facebook & Open Graph' plugin name(s) of possibly conflicting plugin(s), %2$s to Yoast SEO */ + $error_message .= '

    ' . sprintf( __( 'The %1$s plugin might cause issues when used in conjunction with %2$s.', 'wordpress-seo' ), '' . $plugin_name . '', 'Yoast SEO' ) . '

    '; + $error_message .= '

    ' . sprintf( $readable_plugin_section, 'Yoast SEO', $plugin_name ) . '

    '; + + /* translators: %s: 'Facebook' plugin name of possibly conflicting plugin */ + $error_message .= '' . sprintf( __( 'Deactivate %s', 'wordpress-seo' ), $this->get_plugin_name( $plugin_file ) ) . ' '; + + $identifier = $this->get_notification_identifier( $plugin_file ); + + // Add the message to the notifications center. + $notification_center->add_notification( + new Yoast_Notification( + $error_message, + [ + 'type' => Yoast_Notification::ERROR, + 'id' => 'wpseo-conflict-' . $identifier, + ] + ) + ); + } + } + + /** + * Clear the notification for a plugin. + * + * @param string $plugin_file Clear the optional notification for this plugin. + * + * @return void + */ + public function clear_error( $plugin_file ) { + $identifier = $this->get_notification_identifier( $plugin_file ); + + $notification_center = Yoast_Notification_Center::get(); + $notification_center->remove_notification_by_id( 'wpseo-conflict-' . $identifier ); + } + + /** + * Loop through the $this->plugins to check if one of the plugins is active. + * + * This method will store the active plugins in $this->active_plugins. + * + * @return void + */ + protected function search_active_plugins() { + foreach ( $this->plugins as $plugin_section => $plugins ) { + $this->check_plugins_active( $plugins, $plugin_section ); + } + } + + /** + * Loop through plugins and check if each plugin is active. + * + * @param array $plugins Set of plugins. + * @param string $plugin_section Type of conflict group (such as Open Graph or sitemap). + * + * @return void + */ + protected function check_plugins_active( $plugins, $plugin_section ) { + foreach ( $plugins as $plugin ) { + if ( $this->check_plugin_is_active( $plugin ) ) { + $this->add_active_plugin( $plugin_section, $plugin ); + } + } + } + + /** + * Check if given plugin exists in array with all_active_plugins. + * + * @param string $plugin Plugin basename string. + * + * @return bool + */ + protected function check_plugin_is_active( $plugin ) { + return in_array( $plugin, $this->all_active_plugins, true ); + } + + /** + * Add plugin to the list of active plugins. + * + * This method will check first if key $plugin_section exists, if not it will create an empty array + * If $plugin itself doesn't exist it will be added. + * + * @param string $plugin_section Type of conflict group (such as Open Graph or sitemap). + * @param string $plugin Plugin basename string. + * + * @return void + */ + protected function add_active_plugin( $plugin_section, $plugin ) { + if ( ! array_key_exists( $plugin_section, $this->active_conflicting_plugins ) ) { + $this->active_conflicting_plugins[ $plugin_section ] = []; + } + + if ( ! in_array( $plugin, $this->active_conflicting_plugins[ $plugin_section ], true ) ) { + $this->active_conflicting_plugins[ $plugin_section ][] = $plugin; + } + } + + /** + * Search in $this->plugins for the given $plugin. + * + * If there is a result it will return the plugin category. + * + * @param string $plugin Plugin basename string. + * + * @return int|string + */ + protected function find_plugin_category( $plugin ) { + foreach ( $this->plugins as $plugin_section => $plugins ) { + if ( in_array( $plugin, $plugins, true ) ) { + return $plugin_section; + } + } + } + + /** + * Get plugin name from file. + * + * @param string $plugin Plugin path relative to plugins directory. + * + * @return string|bool Plugin name or false when no name is set. + */ + protected function get_plugin_name( $plugin ) { + $plugin_details = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ); + + if ( $plugin_details['Name'] !== '' ) { + return $plugin_details['Name']; + } + + return false; + } + + /** + * When being in the deactivation process the currently deactivated plugin has to be removed. + * + * @return void + */ + private function remove_deactivated_plugin() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: On the deactivation screen the nonce is already checked by WordPress itself. + if ( ! isset( $_GET['plugin'] ) || ! is_string( $_GET['plugin'] ) ) { + return; + } + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: On the deactivation screen the nonce is already checked by WordPress itself. + $deactivated_plugin = sanitize_text_field( wp_unslash( $_GET['plugin'] ) ); + $key_to_remove = array_search( $deactivated_plugin, $this->all_active_plugins, true ); + + if ( $key_to_remove !== false ) { + unset( $this->all_active_plugins[ $key_to_remove ] ); + } + } + + /** + * Get the identifier from the plugin file. + * + * @param string $plugin_file Plugin file to get Identifier from. + * + * @return string + */ + private function get_notification_identifier( $plugin_file ) { + return md5( $plugin_file ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/endpoints/class-endpoint-file-size.php b/wp-content/plugins/wordpress-seo/admin/endpoints/class-endpoint-file-size.php new file mode 100644 index 00000000..9f2bec07 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/endpoints/class-endpoint-file-size.php @@ -0,0 +1,85 @@ +service = $service; + } + + /** + * Registers the routes for the endpoints. + * + * @return void + */ + public function register() { + $route_args = [ + 'methods' => 'GET', + 'args' => [ + 'url' => [ + 'required' => true, + 'type' => 'string', + 'description' => 'The url to retrieve', + ], + ], + 'callback' => [ + $this->service, + 'get', + ], + 'permission_callback' => [ + $this, + 'can_retrieve_data', + ], + ]; + register_rest_route( self::REST_NAMESPACE, self::ENDPOINT_SINGULAR, $route_args ); + } + + /** + * Determines whether or not data can be retrieved for the registered endpoints. + * + * @return bool Whether or not data can be retrieved. + */ + public function can_retrieve_data() { + return current_user_can( self::CAPABILITY_RETRIEVE ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/endpoints/class-endpoint-statistics.php b/wp-content/plugins/wordpress-seo/admin/endpoints/class-endpoint-statistics.php new file mode 100644 index 00000000..392d1c13 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/endpoints/class-endpoint-statistics.php @@ -0,0 +1,73 @@ +service = $service; + } + + /** + * Registers the REST routes that are available on the endpoint. + * + * @return void + */ + public function register() { + // Register fetch config. + $route_args = [ + 'methods' => 'GET', + 'callback' => [ $this->service, 'get_statistics' ], + 'permission_callback' => [ $this, 'can_retrieve_data' ], + ]; + register_rest_route( self::REST_NAMESPACE, self::ENDPOINT_RETRIEVE, $route_args ); + } + + /** + * Determines whether or not data can be retrieved for the registered endpoints. + * + * @return bool Whether or not data can be retrieved. + */ + public function can_retrieve_data() { + return current_user_can( self::CAPABILITY_RETRIEVE ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/endpoints/class-endpoint.php b/wp-content/plugins/wordpress-seo/admin/endpoints/class-endpoint.php new file mode 100644 index 00000000..abbc9d0e --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/endpoints/class-endpoint.php @@ -0,0 +1,26 @@ +is_filter_active() ) { + add_action( 'restrict_manage_posts', [ $this, 'render_hidden_input' ] ); + } + + if ( $this->is_filter_active() && $this->get_explanation() !== null ) { + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_explanation_assets' ] ); + } + } + + /** + * Adds the filter links to the view_edit screens to give the user a filter link. + * + * @return void + */ + public function add_filter_links() { + foreach ( $this->get_post_types() as $post_type ) { + add_filter( 'views_edit-' . $post_type, [ $this, 'add_filter_link' ] ); + } + } + + /** + * Enqueues the necessary assets to display a filter explanation. + * + * @return void + */ + public function enqueue_explanation_assets() { + $asset_manager = new WPSEO_Admin_Asset_Manager(); + $asset_manager->enqueue_script( 'filter-explanation' ); + $asset_manager->enqueue_style( 'filter-explanation' ); + $asset_manager->localize_script( + 'filter-explanation', + 'yoastFilterExplanation', + [ 'text' => $this->get_explanation() ] + ); + } + + /** + * Adds a filter link to the views. + * + * @param array $views Array with the views. + * + * @return array Array of views including the added view. + */ + public function add_filter_link( $views ) { + $views[ 'yoast_' . $this->get_query_val() ] = sprintf( + '%3$s (%4$s)', + esc_url( $this->get_filter_url() ), + ( $this->is_filter_active() ) ? ' class="current" aria-current="page"' : '', + $this->get_label(), + $this->get_post_total() + ); + + return $views; + } + + /** + * Returns a text explaining this filter. Null if no explanation is necessary. + * + * @return string|null The explanation or null. + */ + protected function get_explanation() { + return null; + } + + /** + * Renders a hidden input to preserve this filter's state when using sub-filters. + * + * @return void + */ + public function render_hidden_input() { + echo ''; + } + + /** + * Returns an url to edit.php with post_type and this filter as the query arguments. + * + * @return string The url to activate this filter. + */ + protected function get_filter_url() { + $query_args = [ + self::FILTER_QUERY_ARG => $this->get_query_val(), + 'post_type' => $this->get_current_post_type(), + ]; + + return add_query_arg( $query_args, 'edit.php' ); + } + + /** + * Returns true when the filter is active. + * + * @return bool Whether the filter is active. + */ + protected function is_filter_active() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + if ( isset( $_GET[ self::FILTER_QUERY_ARG ] ) && is_string( $_GET[ self::FILTER_QUERY_ARG ] ) ) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + return sanitize_text_field( wp_unslash( $_GET[ self::FILTER_QUERY_ARG ] ) ) === $this->get_query_val(); + } + return false; + } + + /** + * Returns the current post type. + * + * @return string The current post type. + */ + protected function get_current_post_type() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + if ( isset( $_GET['post_type'] ) && is_string( $_GET['post_type'] ) ) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + $post_type = sanitize_text_field( wp_unslash( $_GET['post_type'] ) ); + if ( ! empty( $post_type ) ) { + return $post_type; + } + } + return 'post'; + } + + /** + * Returns the post types to which this filter should be added. + * + * @return array The post types to which this filter should be added. + */ + protected function get_post_types() { + return WPSEO_Post_Type::get_accessible_post_types(); + } + + /** + * Checks if the post type is supported. + * + * @param string $post_type Post type to check against. + * + * @return bool True when it is supported. + */ + protected function is_supported_post_type( $post_type ) { + return in_array( $post_type, $this->get_post_types(), true ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/filters/class-cornerstone-filter.php b/wp-content/plugins/wordpress-seo/admin/filters/class-cornerstone-filter.php new file mode 100644 index 00000000..19831289 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/filters/class-cornerstone-filter.php @@ -0,0 +1,150 @@ +is_filter_active() ) { + global $wpdb; + + $where .= $wpdb->prepare( + " AND {$wpdb->posts}.ID IN ( SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = %s AND meta_value = '1' ) ", + WPSEO_Meta::$meta_prefix . self::META_NAME + ); + } + + return $where; + } + + /** + * Filters the post types that have the metabox disabled. + * + * @param array $post_types The post types to filter. + * + * @return array The filtered post types. + */ + public function filter_metabox_disabled( $post_types ) { + $filtered_post_types = []; + foreach ( $post_types as $post_type_key => $post_type ) { + if ( ! WPSEO_Post_Type::has_metabox_enabled( $post_type_key ) ) { + continue; + } + + $filtered_post_types[ $post_type_key ] = $post_type; + } + + return $filtered_post_types; + } + + /** + * Returns the label for this filter. + * + * @return string The label for this filter. + */ + protected function get_label() { + return __( 'Cornerstone content', 'wordpress-seo' ); + } + + /** + * Returns a text explaining this filter. + * + * @return string|null The explanation. + */ + protected function get_explanation() { + $post_type_object = get_post_type_object( $this->get_current_post_type() ); + + if ( $post_type_object === null ) { + return null; + } + + return sprintf( + /* translators: %1$s expands to the posttype label, %2$s expands anchor to blog post about cornerstone content, %3$s expands to */ + __( 'Mark the most important %1$s as \'cornerstone content\' to improve your site structure. %2$sLearn more about cornerstone content%3$s.', 'wordpress-seo' ), + strtolower( $post_type_object->labels->name ), + '', + '' + ); + } + + /** + * Returns the total amount of articles marked as cornerstone content. + * + * @return int + */ + protected function get_post_total() { + global $wpdb; + + return (int) $wpdb->get_var( + $wpdb->prepare( + "SELECT COUNT( 1 ) + FROM {$wpdb->postmeta} + WHERE post_id IN( SELECT ID FROM {$wpdb->posts} WHERE post_type = %s ) AND + meta_key = %s AND meta_value = '1' + ", + $this->get_current_post_type(), + WPSEO_Meta::$meta_prefix . self::META_NAME + ) + ); + } + + /** + * Returns the post types to which this filter should be added. + * + * @return array The post types to which this filter should be added. + */ + protected function get_post_types() { + /** + * Filter: 'wpseo_cornerstone_post_types' - Filters post types to exclude the cornerstone feature for. + * + * @param array $post_types The accessible post types to filter. + */ + $post_types = apply_filters( 'wpseo_cornerstone_post_types', parent::get_post_types() ); + if ( ! is_array( $post_types ) ) { + return []; + } + + return $post_types; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/formatter/class-metabox-formatter.php b/wp-content/plugins/wordpress-seo/admin/formatter/class-metabox-formatter.php new file mode 100644 index 00000000..2c4e8d7b --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/formatter/class-metabox-formatter.php @@ -0,0 +1,208 @@ +formatter = $formatter; + } + + /** + * Returns the values. + * + * @return array|bool|int> + */ + public function get_values() { + $defaults = $this->get_defaults(); + $values = $this->formatter->get_values(); + + return ( $values + $defaults ); + } + + /** + * Returns array with all the values always needed by a scraper object. + * + * @return array|bool|int> Default settings for the metabox. + */ + private function get_defaults() { + $schema_types = new Schema_Types(); + $host = YoastSEO()->helpers->url->get_url_host( get_site_url() ); + + $defaults = [ + 'author_name' => get_the_author_meta( 'display_name' ), + 'sitewide_social_image' => WPSEO_Options::get( 'og_default_image' ), + 'translations' => $this->get_translations(), + 'keyword_usage' => [], + 'title_template' => '', + 'metadesc_template' => '', + 'showSocial' => [ + 'facebook' => WPSEO_Options::get( 'opengraph', false ), + 'twitter' => WPSEO_Options::get( 'twitter', false ), + ], + 'schema' => [ + 'displayFooter' => WPSEO_Capability_Utils::current_user_can( 'wpseo_manage_options' ), + 'pageTypeOptions' => $schema_types->get_page_type_options(), + 'articleTypeOptions' => $schema_types->get_article_type_options(), + ], + 'twitterCardType' => 'summary_large_image', + 'publish_box' => [ + 'labels' => [ + 'keyword' => [ + 'na' => sprintf( + /* translators: %1$s expands to the opening anchor tag, %2$s to the closing anchor tag, %3$s to the SEO score. */ + __( '%1$sSEO%2$s: %3$s', 'wordpress-seo' ), + '', + '', + '' . __( 'Not available', 'wordpress-seo' ) . '' + ), + 'bad' => sprintf( + /* translators: %1$s expands to the opening anchor tag, %2$s to the closing anchor tag, %3$s to the SEO score. */ + __( '%1$sSEO%2$s: %3$s', 'wordpress-seo' ), + '', + '', + '' . __( 'Needs improvement', 'wordpress-seo' ) . '' + ), + 'ok' => sprintf( + /* translators: %1$s expands to the opening anchor tag, %2$s to the closing anchor tag, %3$s to the SEO score. */ + __( '%1$sSEO%2$s: %3$s', 'wordpress-seo' ), + '', + '', + '' . __( 'OK', 'wordpress-seo' ) . '' + ), + 'good' => sprintf( + /* translators: %1$s expands to the opening anchor tag, %2$s to the closing anchor tag, %3$s to the SEO score. */ + __( '%1$sSEO%2$s: %3$s', 'wordpress-seo' ), + '', + '', + '' . __( 'Good', 'wordpress-seo' ) . '' + ), + ], + 'content' => [ + 'na' => sprintf( + /* translators: %1$s expands to the opening anchor tag, %2$s to the closing anchor tag, %3$s to the readability score. */ + __( '%1$sReadability%2$s: %3$s', 'wordpress-seo' ), + '', + '', + '' . __( 'Not available', 'wordpress-seo' ) . '' + ), + 'bad' => sprintf( + /* translators: %1$s expands to the opening anchor tag, %2$s to the closing anchor tag, %3$s to the readability score. */ + __( '%1$sReadability%2$s: %3$s', 'wordpress-seo' ), + '', + '', + '' . __( 'Needs improvement', 'wordpress-seo' ) . '' + ), + 'ok' => sprintf( + /* translators: %1$s expands to the opening anchor tag, %2$s to the closing anchor tag, %3$s to the readability score. */ + __( '%1$sReadability%2$s: %3$s', 'wordpress-seo' ), + '', + '', + '' . __( 'OK', 'wordpress-seo' ) . '' + ), + 'good' => sprintf( + /* translators: %1$s expands to the opening anchor tag, %2$s to the closing anchor tag, %3$s to the readability score. */ + __( '%1$sReadability%2$s: %3$s', 'wordpress-seo' ), + '', + '', + '' . __( 'Good', 'wordpress-seo' ) . '' + ), + ], + 'inclusive-language' => [ + 'na' => sprintf( + /* translators: %1$s expands to the opening anchor tag, %2$s to the closing anchor tag, %3$s to the inclusive language score. */ + __( '%1$sInclusive language%2$s: %3$s', 'wordpress-seo' ), + '', + '', + '' . __( 'Not available', 'wordpress-seo' ) . '' + ), + 'bad' => sprintf( + /* translators: %1$s expands to the opening anchor tag, %2$s to the closing anchor tag, %3$s to the inclusive language score. */ + __( '%1$sInclusive language%2$s: %3$s', 'wordpress-seo' ), + '', + '', + '' . __( 'Needs improvement', 'wordpress-seo' ) . '' + ), + 'ok' => sprintf( + /* translators: %1$s expands to the opening anchor tag, %2$s to the closing anchor tag, %3$s to the inclusive language score. */ + __( '%1$sInclusive language%2$s: %3$s', 'wordpress-seo' ), + '', + '', + '' . __( 'Potentially non-inclusive', 'wordpress-seo' ) . '' + ), + 'good' => sprintf( + /* translators: %1$s expands to the opening anchor tag, %2$s to the closing anchor tag, %3$s to the inclusive language score. */ + __( '%1$sInclusive language%2$s: %3$s', 'wordpress-seo' ), + '', + '', + '' . __( 'Good', 'wordpress-seo' ) . '' + ), + ], + ], + ], + /** + * Filter to determine if the markers should be enabled or not. + * + * @param bool $showMarkers Should the markers being enabled. Default = true. + */ + 'show_markers' => apply_filters( 'wpseo_enable_assessment_markers', true ), + 'zapierIntegrationActive' => WPSEO_Options::get( 'zapier_integration_active', false ) ? 1 : 0, + 'zapierConnectedStatus' => ! empty( WPSEO_Options::get( 'zapier_subscription', [] ) ) ? 1 : 0, + 'getJetpackBoostPrePublishLink' => WPSEO_Shortlinker::get( 'https://yoa.st/jetpack-boost-get-prepublish?domain=' . $host ), + 'upgradeJetpackBoostPrePublishLink' => WPSEO_Shortlinker::get( 'https://yoa.st/jetpack-boost-upgrade-prepublish?domain=' . $host ), + 'woocommerceUpsellSchemaLink' => WPSEO_Shortlinker::get( 'https://yoa.st/product-schema-metabox' ), + 'woocommerceUpsellGooglePreviewLink' => WPSEO_Shortlinker::get( 'https://yoa.st/product-google-preview-metabox' ), + ]; + + $integration_information_repo = YoastSEO()->classes->get( Integration_Information_Repository::class ); + + $enabled_integrations = $integration_information_repo->get_integration_information(); + $defaults = array_merge( $defaults, $enabled_integrations ); + $enabled_features_repo = YoastSEO()->classes->get( Enabled_Analysis_Features_Repository::class ); + + $enabled_features = $enabled_features_repo->get_enabled_features()->parse_to_legacy_array(); + return array_merge( $defaults, $enabled_features ); + } + + /** + * Returns Jed compatible YoastSEO.js translations. + * + * @return string[] + */ + private function get_translations() { + $locale = get_user_locale(); + + $file = WPSEO_PATH . 'languages/wordpress-seo-' . $locale . '.json'; + if ( file_exists( $file ) ) { + // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents -- Retrieving a local file. + $file = file_get_contents( $file ); + if ( is_string( $file ) && $file !== '' ) { + return json_decode( $file, true ); + } + } + + return []; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/formatter/class-post-metabox-formatter.php b/wp-content/plugins/wordpress-seo/admin/formatter/class-post-metabox-formatter.php new file mode 100644 index 00000000..a9d3e0d0 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/formatter/class-post-metabox-formatter.php @@ -0,0 +1,93 @@ +post = $post; + $this->permalink = $structure; + } + + /** + * Determines whether the social templates should be used. + * + * @deprecated 23.1 + * @codeCoverageIgnore + */ + public function use_social_templates() { + _deprecated_function( __METHOD__, 'Yoast SEO 23.1' ); + } + + /** + * Returns the translated values. + * + * @return array + */ + public function get_values() { + + $values = [ + 'metaDescriptionDate' => '', + ]; + + if ( $this->post instanceof WP_Post ) { + + /** @var Post_Seo_Information_Repository $repo */ + $repo = YoastSEO()->classes->get( Post_Seo_Information_Repository::class ); + $repo->set_post( $this->post ); + + $values_to_set = [ + 'isInsightsEnabled' => $this->is_insights_enabled(), + ]; + + $values = ( $values_to_set + $values ); + $values = ( $repo->get_seo_data() + $values ); + } + + /** + * Filter: 'wpseo_post_edit_values' - Allows changing the values Yoast SEO uses inside the post editor. + * + * @param array $values The key-value map Yoast SEO uses inside the post editor. + * @param WP_Post $post The post opened in the editor. + */ + return apply_filters( 'wpseo_post_edit_values', $values, $this->post ); + } + + /** + * Determines whether the insights feature is enabled for this post. + * + * @return bool + */ + protected function is_insights_enabled() { + return WPSEO_Options::get( 'enable_metabox_insights', false ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/formatter/class-term-metabox-formatter.php b/wp-content/plugins/wordpress-seo/admin/formatter/class-term-metabox-formatter.php new file mode 100644 index 00000000..29218d38 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/formatter/class-term-metabox-formatter.php @@ -0,0 +1,98 @@ +taxonomy = $taxonomy; + $this->term = $term; + + $this->use_social_templates = $this->use_social_templates(); + } + + /** + * Determines whether the social templates should be used. + * + * @return bool Whether the social templates should be used. + */ + public function use_social_templates() { + return WPSEO_Options::get( 'opengraph', false ) === true; + } + + /** + * Returns the translated values. + * + * @return array + */ + public function get_values() { + $values = []; + + // Todo: a column needs to be added on the termpages to add a filter for the keyword, so this can be used in the focus keyphrase doubles. + if ( is_object( $this->term ) && property_exists( $this->term, 'taxonomy' ) ) { + $values = [ + 'taxonomy' => $this->term->taxonomy, + 'semrushIntegrationActive' => 0, + 'wincherIntegrationActive' => 0, + 'isInsightsEnabled' => $this->is_insights_enabled(), + ]; + + $repo = YoastSEO()->classes->get( Term_Seo_Information_Repository::class ); + $repo->set_term( $this->term ); + $values = ( $repo->get_seo_data() + $values ); + } + + return $values; + } + + /** + * Determines whether the insights feature is enabled for this taxonomy. + * + * @return bool + */ + protected function is_insights_enabled() { + return WPSEO_Options::get( 'enable_metabox_insights', false ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/formatter/interface-metabox-formatter.php b/wp-content/plugins/wordpress-seo/admin/formatter/interface-metabox-formatter.php new file mode 100644 index 00000000..8c220480 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/formatter/interface-metabox-formatter.php @@ -0,0 +1,19 @@ +admin_header( false, 'wpseo-gsc', false, 'yoast_wpseo_gsc_options' ); + +// GSC Error notification. +$gsc_url = 'https://search.google.com/search-console/index'; +$gsc_post_url = 'https://yoa.st/google-search-console-deprecated'; +$gsc_style_alert = ' + display: flex; + align-items: baseline; + position: relative; + padding: 16px; + border: 1px solid rgba(0, 0, 0, 0.2); + font-size: 14px; + font-weight: 400; + line-height: 1.5; + margin: 16px 0; + color: #450c11; + background: #f8d7da; +'; +$gsc_style_alert_icon = 'display: block; margin-right: 8px;'; +$gsc_style_alert_content = 'max-width: 600px;'; +$gsc_style_alert_link = 'color: #004973;'; +$gsc_notification = sprintf( + /* Translators: %1$s: expands to opening anchor tag, %2$s expands to closing anchor tag. */ + __( 'Google has discontinued its Crawl Errors API. Therefore, any possible crawl errors you might have cannot be displayed here anymore. %1$sRead our statement on this for further information%2$s.', 'wordpress-seo' ), + '', + WPSEO_Admin_Utils::get_new_tab_message() . '' +); +$gsc_notification .= '

    '; +$gsc_notification .= sprintf( + /* Translators: %1$s: expands to opening anchor tag, %2$s expands to closing anchor tag. */ + __( 'To view your current crawl errors, %1$splease visit Google Search Console%2$s.', 'wordpress-seo' ), + '', + WPSEO_Admin_Utils::get_new_tab_message() . '' +); +?> +
    + + + + +
    +'; +printf( + /* Translators: %s: expands to Yoast SEO Premium */ + esc_html__( 'Creating redirects is a %s feature', 'wordpress-seo' ), + 'Yoast SEO Premium' +); +echo ''; +echo '

    '; +printf( + /* Translators: %1$s: expands to 'Yoast SEO Premium', %2$s: links to Yoast SEO Premium plugin page. */ + esc_html__( 'To be able to create a redirect and fix this issue, you need %1$s. You can buy the plugin, including one year of support and updates, on %2$s.', 'wordpress-seo' ), + 'Yoast SEO Premium', + 'yoast.com' +); +echo '

    '; +echo ''; diff --git a/wp-content/plugins/wordpress-seo/admin/import/class-import-detector.php b/wp-content/plugins/wordpress-seo/admin/import/class-import-detector.php new file mode 100644 index 00000000..48d31cc1 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/import/class-import-detector.php @@ -0,0 +1,36 @@ +status->status ) { + $this->needs_import[ $importer_class ] = $importer->get_plugin_name(); + } + } + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/import/class-import-plugin.php b/wp-content/plugins/wordpress-seo/admin/import/class-import-plugin.php new file mode 100644 index 00000000..d71fff83 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/import/class-import-plugin.php @@ -0,0 +1,63 @@ +importer = $importer; + + switch ( $action ) { + case 'cleanup': + $this->status = $this->importer->run_cleanup(); + break; + case 'import': + $this->status = $this->importer->run_import(); + break; + case 'detect': + default: + $this->status = $this->importer->run_detect(); + } + + $this->status->set_msg( $this->complete_msg( $this->status->get_msg() ) ); + } + + /** + * Convenience function to replace %s with plugin name in import message. + * + * @param string $msg Message string. + * + * @return string Returns message with plugin name instead of replacement variables. + */ + protected function complete_msg( $msg ) { + return sprintf( $msg, $this->importer->get_plugin_name() ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/import/class-import-settings.php b/wp-content/plugins/wordpress-seo/admin/import/class-import-settings.php new file mode 100644 index 00000000..3bec4c8f --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/import/class-import-settings.php @@ -0,0 +1,127 @@ +status = new WPSEO_Import_Status( 'import', false ); + } + + /** + * Imports the data submitted by the user. + * + * @return void + */ + public function import() { + check_admin_referer( self::NONCE_ACTION ); + + if ( ! WPSEO_Capability_Utils::current_user_can( 'wpseo_manage_options' ) ) { + return; + } + + if ( ! isset( $_POST['settings_import'] ) || ! is_string( $_POST['settings_import'] ) ) { + return; + } + + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: The raw content will be parsed afterwards. + $content = wp_unslash( $_POST['settings_import'] ); + + if ( empty( $content ) ) { + return; + } + + $this->parse_options( $content ); + } + + /** + * Parse the options. + * + * @param string $raw_options The content to parse. + * + * @return void + */ + protected function parse_options( $raw_options ) { + $options = parse_ini_string( $raw_options, true, INI_SCANNER_RAW ); + + if ( is_array( $options ) && $options !== [] ) { + $this->import_options( $options ); + + return; + } + + $this->status->set_msg( __( 'Settings could not be imported:', 'wordpress-seo' ) . ' ' . __( 'No settings found.', 'wordpress-seo' ) ); + } + + /** + * Parse the option group and import it. + * + * @param string $name Name string. + * @param array $option_group Option group data. + * @param array $options Options data. + * + * @return void + */ + protected function parse_option_group( $name, $option_group, $options ) { + // Make sure that the imported options are cleaned/converted on import. + $option_instance = WPSEO_Options::get_option_instance( $name ); + if ( is_object( $option_instance ) && method_exists( $option_instance, 'import' ) ) { + $option_instance->import( $option_group, $this->old_wpseo_version, $options ); + } + } + + /** + * Imports the options if found. + * + * @param array $options The options parsed from the provided settings. + * + * @return void + */ + protected function import_options( $options ) { + if ( isset( $options['wpseo']['version'] ) && $options['wpseo']['version'] !== '' ) { + $this->old_wpseo_version = $options['wpseo']['version']; + } + + foreach ( $options as $name => $option_group ) { + $this->parse_option_group( $name, $option_group, $options ); + } + + $this->status->set_msg( __( 'Settings successfully imported.', 'wordpress-seo' ) ); + $this->status->set_status( true ); + + // Reset the cached option values. + WPSEO_Options::clear_cache(); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/import/class-import-status.php b/wp-content/plugins/wordpress-seo/admin/import/class-import-status.php new file mode 100644 index 00000000..c105d4a7 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/import/class-import-status.php @@ -0,0 +1,131 @@ +action = $action; + $this->status = $status; + $this->msg = $msg; + } + + /** + * Get the import message. + * + * @return string Message about current status. + */ + public function get_msg() { + if ( $this->msg !== '' ) { + return $this->msg; + } + + if ( $this->status === false ) { + /* translators: %s is replaced with the name of the plugin we're trying to find data from. */ + return __( '%s data not found.', 'wordpress-seo' ); + } + + return $this->get_default_success_message(); + } + + /** + * Get the import action. + * + * @return string Import action type. + */ + public function get_action() { + return $this->action; + } + + /** + * Set the import action, set status to false. + * + * @param string $action The type of action to set as import action. + * + * @return void + */ + public function set_action( $action ) { + $this->action = $action; + $this->status = false; + } + + /** + * Sets the importer status message. + * + * @param string $msg The message to set. + * + * @return void + */ + public function set_msg( $msg ) { + $this->msg = $msg; + } + + /** + * Sets the importer status. + * + * @param bool $status The status to set. + * + * @return WPSEO_Import_Status The current object. + */ + public function set_status( $status ) { + $this->status = (bool) $status; + + return $this; + } + + /** + * Returns a success message depending on the action. + * + * @return string Returns a success message for the current action. + */ + private function get_default_success_message() { + switch ( $this->action ) { + case 'import': + /* translators: %s is replaced with the name of the plugin we're importing data from. */ + return __( '%s data successfully imported.', 'wordpress-seo' ); + case 'cleanup': + /* translators: %s is replaced with the name of the plugin we're removing data from. */ + return __( '%s data successfully removed.', 'wordpress-seo' ); + case 'detect': + default: + /* translators: %s is replaced with the name of the plugin we've found data from. */ + return __( '%s data found.', 'wordpress-seo' ); + } + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/import/plugins/class-abstract-plugin-importer.php b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-abstract-plugin-importer.php new file mode 100644 index 00000000..6f5674f2 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-abstract-plugin-importer.php @@ -0,0 +1,329 @@ +plugin_name; + } + + /** + * Imports the settings and post meta data from another SEO plugin. + * + * @return WPSEO_Import_Status Import status object. + */ + public function run_import() { + $this->status = new WPSEO_Import_Status( 'import', false ); + + if ( ! $this->detect() ) { + return $this->status; + } + + $this->status->set_status( $this->import() ); + + // Flush the entire cache, as we no longer know what's valid and what's not. + wp_cache_flush(); + + return $this->status; + } + + /** + * Handles post meta data to import. + * + * @return bool Import success status. + */ + protected function import() { + return $this->meta_keys_clone( $this->clone_keys ); + } + + /** + * Removes the plugin data from the database. + * + * @return WPSEO_Import_Status Import status object. + */ + public function run_cleanup() { + $this->status = new WPSEO_Import_Status( 'cleanup', false ); + + if ( ! $this->detect() ) { + return $this->status; + } + + return $this->status->set_status( $this->cleanup() ); + } + + /** + * Removes the plugin data from the database. + * + * @return bool Cleanup status. + */ + protected function cleanup() { + global $wpdb; + if ( empty( $this->meta_key ) ) { + return true; + } + $wpdb->query( + $wpdb->prepare( + "DELETE FROM {$wpdb->postmeta} WHERE meta_key LIKE %s", + $this->meta_key + ) + ); + $result = $wpdb->__get( 'result' ); + if ( ! $result ) { + $this->cleanup_error_msg(); + } + + return $result; + } + + /** + * Sets the status message for when a cleanup has gone bad. + * + * @return void + */ + protected function cleanup_error_msg() { + /* translators: %s is replaced with the plugin's name. */ + $this->status->set_msg( sprintf( __( 'Cleanup of %s data failed.', 'wordpress-seo' ), $this->plugin_name ) ); + } + + /** + * Detects whether an import for this plugin is needed. + * + * @return WPSEO_Import_Status Import status object. + */ + public function run_detect() { + $this->status = new WPSEO_Import_Status( 'detect', false ); + + if ( ! $this->detect() ) { + return $this->status; + } + + return $this->status->set_status( true ); + } + + /** + * Detects whether there is post meta data to import. + * + * @return bool Boolean indicating whether there is something to import. + */ + protected function detect() { + global $wpdb; + + $meta_keys = wp_list_pluck( $this->clone_keys, 'old_key' ); + $result = $wpdb->get_var( + $wpdb->prepare( + "SELECT COUNT(*) AS `count` + FROM {$wpdb->postmeta} + WHERE meta_key IN ( " . implode( ', ', array_fill( 0, count( $meta_keys ), '%s' ) ) . ' )', + $meta_keys + ) + ); + + if ( $result === '0' ) { + return false; + } + + return true; + } + + /** + * Helper function to clone meta keys and (optionally) change their values in bulk. + * + * @param string $old_key The existing meta key. + * @param string $new_key The new meta key. + * @param array $replace_values An array, keys old value, values new values. + * + * @return bool Clone status. + */ + protected function meta_key_clone( $old_key, $new_key, $replace_values = [] ) { + global $wpdb; + + // First we create a temp table with all the values for meta_key. + $result = $wpdb->query( + $wpdb->prepare( + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.SchemaChange -- This is intentional + temporary. + "CREATE TEMPORARY TABLE tmp_meta_table SELECT * FROM {$wpdb->postmeta} WHERE meta_key = %s", + $old_key + ) + ); + if ( $result === false ) { + $this->set_missing_db_rights_status(); + return false; + } + + // Delete all the values in our temp table for posts that already have data for $new_key. + $wpdb->query( + $wpdb->prepare( + "DELETE FROM tmp_meta_table WHERE post_id IN ( SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = %s )", + WPSEO_Meta::$meta_prefix . $new_key + ) + ); + + /* + * We set meta_id to NULL so on re-insert into the postmeta table, MYSQL can set + * new meta_id's and we don't get duplicates. + */ + $wpdb->query( 'UPDATE tmp_meta_table SET meta_id = NULL' ); + + // Now we rename the meta_key. + $wpdb->query( + $wpdb->prepare( + 'UPDATE tmp_meta_table SET meta_key = %s', + WPSEO_Meta::$meta_prefix . $new_key + ) + ); + + $this->meta_key_clone_replace( $replace_values ); + + // With everything done, we insert all our newly cloned lines into the postmeta table. + $wpdb->query( "INSERT INTO {$wpdb->postmeta} SELECT * FROM tmp_meta_table" ); + + // Now we drop our temporary table. + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.SchemaChange -- This is intentional + a temporary table. + $wpdb->query( 'DROP TEMPORARY TABLE IF EXISTS tmp_meta_table' ); + + return true; + } + + /** + * Clones multiple meta keys. + * + * @param array $clone_keys The keys to clone. + * + * @return bool Success status. + */ + protected function meta_keys_clone( $clone_keys ) { + foreach ( $clone_keys as $clone_key ) { + $result = $this->meta_key_clone( $clone_key['old_key'], $clone_key['new_key'], ( $clone_key['convert'] ?? [] ) ); + if ( ! $result ) { + return false; + } + } + return true; + } + + /** + * Sets the import status to false and returns a message about why it failed. + * + * @return void + */ + protected function set_missing_db_rights_status() { + $this->status->set_status( false ); + /* translators: %s is replaced with Yoast SEO. */ + $this->status->set_msg( sprintf( __( 'The %s importer functionality uses temporary database tables. It seems your WordPress install does not have the capability to do this, please consult your hosting provider.', 'wordpress-seo' ), 'Yoast SEO' ) ); + } + + /** + * Helper function to search for a key in an array and maybe save it as a meta field. + * + * @param string $plugin_key The key in the $data array to check. + * @param string $yoast_key The identifier we use in our meta settings. + * @param array $data The array of data for this post to sift through. + * @param int $post_id The post ID. + * + * @return void + */ + protected function import_meta_helper( $plugin_key, $yoast_key, $data, $post_id ) { + if ( ! empty( $data[ $plugin_key ] ) ) { + $this->maybe_save_post_meta( $yoast_key, $data[ $plugin_key ], $post_id ); + } + } + + /** + * Saves a post meta value if it doesn't already exist. + * + * @param string $new_key The key to save. + * @param mixed $value The value to set the key to. + * @param int $post_id The Post to save the meta for. + * + * @return void + */ + protected function maybe_save_post_meta( $new_key, $value, $post_id ) { + // Big. Fat. Sigh. Mostly used for _yst_is_cornerstone, but might be useful for other hidden meta's. + $key = WPSEO_Meta::$meta_prefix . $new_key; + $wpseo_meta = true; + if ( substr( $new_key, 0, 1 ) === '_' ) { + $key = $new_key; + $wpseo_meta = false; + } + + $existing_value = get_post_meta( $post_id, $key, true ); + if ( empty( $existing_value ) ) { + if ( $wpseo_meta ) { + WPSEO_Meta::set_value( $new_key, $value, $post_id ); + return; + } + update_post_meta( $post_id, $new_key, $value ); + } + } + + /** + * Replaces values in our temporary table according to our settings. + * + * @param array $replace_values Key value pair of values to replace with other values. + * + * @return void + */ + protected function meta_key_clone_replace( $replace_values ) { + global $wpdb; + + // Now we replace values if needed. + if ( is_array( $replace_values ) && $replace_values !== [] ) { + foreach ( $replace_values as $old_value => $new_value ) { + $wpdb->query( + $wpdb->prepare( + 'UPDATE tmp_meta_table SET meta_value = %s WHERE meta_value = %s', + $new_value, + $old_value + ) + ); + } + } + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-aioseo-v4.php b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-aioseo-v4.php new file mode 100644 index 00000000..122ce46d --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-aioseo-v4.php @@ -0,0 +1,241 @@ + '_aioseo_title', + 'new_key' => 'title', + ], + [ + 'old_key' => '_aioseo_description', + 'new_key' => 'metadesc', + ], + [ + 'old_key' => '_aioseo_og_title', + 'new_key' => 'opengraph-title', + ], + [ + 'old_key' => '_aioseo_og_description', + 'new_key' => 'opengraph-description', + ], + [ + 'old_key' => '_aioseo_twitter_title', + 'new_key' => 'twitter-title', + ], + [ + 'old_key' => '_aioseo_twitter_description', + 'new_key' => 'twitter-description', + ], + ]; + + /** + * Mapping between the AiOSEO replace vars and the Yoast replace vars. + * + * @var array + * + * @see https://yoast.com/help/list-available-snippet-variables-yoast-seo/ + */ + protected $replace_vars = [ + // They key is the AiOSEO replace var, the value is the Yoast replace var (see class-wpseo-replace-vars). + '#author_first_name' => '%%author_first_name%%', + '#author_last_name' => '%%author_last_name%%', + '#author_name' => '%%name%%', + '#categories' => '%%category%%', + '#current_date' => '%%currentdate%%', + '#current_day' => '%%currentday%%', + '#current_month' => '%%currentmonth%%', + '#current_year' => '%%currentyear%%', + '#permalink' => '%%permalink%%', + '#post_content' => '%%post_content%%', + '#post_date' => '%%date%%', + '#post_day' => '%%post_day%%', + '#post_month' => '%%post_month%%', + '#post_title' => '%%title%%', + '#post_year' => '%%post_year%%', + '#post_excerpt_only' => '%%excerpt_only%%', + '#post_excerpt' => '%%excerpt%%', + '#separator_sa' => '%%sep%%', + '#site_title' => '%%sitename%%', + '#tagline' => '%%sitedesc%%', + '#taxonomy_title' => '%%category_title%%', + ]; + + /** + * Replaces the AiOSEO variables in our temporary table with Yoast variables (replace vars). + * + * @param array $replace_values Key value pair of values to replace with other values. This is only used in the base class but not here. + * That is because this class doesn't have any `convert` keys in `$clone_keys`. + * For that reason, we're overwriting the base class' `meta_key_clone_replace()` function without executing that base functionality. + * + * @return void + */ + protected function meta_key_clone_replace( $replace_values ) { + global $wpdb; + + // At this point we're already looping through all the $clone_keys (this happens in meta_keys_clone() in the abstract class). + // Now, we'll also loop through the replace_vars array, which holds the mappings between the AiOSEO variables and the Yoast variables. + // We'll replace all the AiOSEO variables in the temporary table with their Yoast equivalents. + foreach ( $this->replace_vars as $aioseo_variable => $yoast_variable ) { + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: We need this query and this is done at many other places as well, for example class-import-rankmath. + $wpdb->query( + $wpdb->prepare( + 'UPDATE tmp_meta_table SET meta_value = REPLACE( meta_value, %s, %s )', + $aioseo_variable, + $yoast_variable + ) + ); + } + + // The AiOSEO custom fields take the form of `#custom_field-myfield`. + // These should be mapped to %%cf_myfield%%. + $meta_values_with_custom_fields = $this->get_meta_values_with_custom_field_or_taxonomy( $wpdb, 'custom_field' ); + $unique_custom_fields = $this->get_unique_custom_fields_or_taxonomies( $meta_values_with_custom_fields, 'custom_field' ); + $this->replace_custom_field_or_taxonomy_replace_vars( $unique_custom_fields, $wpdb, 'custom_field', 'cf' ); + + // Map `#tax_name-{tax-slug}` to `%%ct_{tax-slug}%%``. + $meta_values_with_custom_taxonomies = $this->get_meta_values_with_custom_field_or_taxonomy( $wpdb, 'tax_name' ); + $unique_custom_taxonomies = $this->get_unique_custom_fields_or_taxonomies( $meta_values_with_custom_taxonomies, 'tax_name' ); + $this->replace_custom_field_or_taxonomy_replace_vars( $unique_custom_taxonomies, $wpdb, 'tax_name', 'ct' ); + } + + /** + * Filters out all unique custom fields/taxonomies/etc. used in an AiOSEO replace var. + * + * @param string[] $meta_values An array of all the meta values that + * contain one or more AIOSEO custom field replace vars + * (in the form `#custom_field-xyz`). + * @param string $aioseo_prefix The AiOSEO prefix to use + * (e.g. `custom-field` for custom fields or `tax_name` for custom taxonomies). + * + * @return string[] An array of all the unique custom fields/taxonomies/etc. used in the replace vars. + * E.g. `xyz` in the above example. + */ + protected function get_unique_custom_fields_or_taxonomies( $meta_values, $aioseo_prefix ) { + $unique_custom_fields_or_taxonomies = []; + + foreach ( $meta_values as $meta_value ) { + // Find all custom field replace vars, store them in `$matches`. + preg_match_all( + "/#$aioseo_prefix-([\w-]+)/", + $meta_value, + $matches + ); + + /* + * `$matches[1]` contain the captured matches of the + * first capturing group (the `([\w-]+)` in the regex above). + */ + $custom_fields_or_taxonomies = $matches[1]; + + foreach ( $custom_fields_or_taxonomies as $custom_field_or_taxonomy ) { + $unique_custom_fields_or_taxonomies[ trim( $custom_field_or_taxonomy ) ] = 1; + } + } + + return array_keys( $unique_custom_fields_or_taxonomies ); + } + + /** + * Replaces every AIOSEO custom field/taxonomy/etc. replace var with the Yoast version. + * + * E.g. `#custom_field-xyz` becomes `%%cf_xyz%%`. + * + * @param string[] $unique_custom_fields_or_taxonomies An array of unique custom fields to replace the replace vars of. + * @param wpdb $wpdb The WordPress database object. + * @param string $aioseo_prefix The AiOSEO prefix to use + * (e.g. `custom-field` for custom fields or `tax_name` for custom taxonomies). + * @param string $yoast_prefix The Yoast prefix to use (e.g. `cf` for custom fields). + * + * @return void + */ + protected function replace_custom_field_or_taxonomy_replace_vars( $unique_custom_fields_or_taxonomies, $wpdb, $aioseo_prefix, $yoast_prefix ) { + foreach ( $unique_custom_fields_or_taxonomies as $unique_custom_field_or_taxonomy ) { + $aioseo_variable = "#{$aioseo_prefix}-{$unique_custom_field_or_taxonomy}"; + $yoast_variable = "%%{$yoast_prefix}_{$unique_custom_field_or_taxonomy}%%"; + + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching + $wpdb->query( + $wpdb->prepare( + 'UPDATE tmp_meta_table SET meta_value = REPLACE( meta_value, %s, %s )', + $aioseo_variable, + $yoast_variable + ) + ); + } + } + + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching + + /** + * Retrieve all the meta values from the temporary meta table that contain + * at least one AiOSEO custom field replace var. + * + * @param wpdb $wpdb The WordPress database object. + * @param string $aioseo_prefix The AiOSEO prefix to use + * (e.g. `custom-field` for custom fields or `tax_name` for custom taxonomies). + * + * @return string[] All meta values that contain at least one AioSEO custom field replace var. + */ + protected function get_meta_values_with_custom_field_or_taxonomy( $wpdb, $aioseo_prefix ) { + return $wpdb->get_col( + $wpdb->prepare( + 'SELECT meta_value FROM tmp_meta_table WHERE meta_value LIKE %s', + "%#$aioseo_prefix-%" + ) + ); + } + + // phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching + + /** + * Detects whether there is AIOSEO data to import by looking whether the AIOSEO data have been cleaned up. + * + * @return bool Boolean indicating whether there is something to import. + */ + protected function detect() { + $aioseo_cleanup_action = YoastSEO()->classes->get( Aioseo_Cleanup_Action::class ); + return ( $aioseo_cleanup_action->get_total_unindexed() > 0 ); + } + + /** + * Import AIOSEO post data from their custom indexable table. Not currently used. + * + * @return void + */ + protected function import() { + // This is overriden from the import.js and never run. + $aioseo_posts_import_action = YoastSEO()->classes->get( Aioseo_Posts_Importing_Action::class ); + $aioseo_posts_import_action->index(); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-aioseo.php b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-aioseo.php new file mode 100644 index 00000000..cf7ab491 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-aioseo.php @@ -0,0 +1,110 @@ + 'opengraph-title', + 'aioseop_opengraph_settings_desc' => 'opengraph-description', + 'aioseop_opengraph_settings_customimg' => 'opengraph-image', + 'aioseop_opengraph_settings_customimg_twitter' => 'twitter-image', + ]; + + /** + * Array of meta keys to detect and import. + * + * @var array + */ + protected $clone_keys = [ + [ + 'old_key' => '_aioseop_title', + 'new_key' => 'title', + ], + [ + 'old_key' => '_aioseop_description', + 'new_key' => 'metadesc', + ], + [ + 'old_key' => '_aioseop_noindex', + 'new_key' => 'meta-robots-noindex', + 'convert' => [ 'on' => 1 ], + ], + [ + 'old_key' => '_aioseop_nofollow', + 'new_key' => 'meta-robots-nofollow', + 'convert' => [ 'on' => 1 ], + ], + ]; + + /** + * Import All In One SEO meta values. + * + * @return bool Import success status. + */ + protected function import() { + $status = parent::import(); + if ( $status ) { + $this->import_opengraph(); + } + return $status; + } + + /** + * Imports the OpenGraph and Twitter settings for all posts. + * + * @return bool + */ + protected function import_opengraph() { + $query_posts = new WP_Query( 'post_type=any&meta_key=_aioseop_opengraph_settings&order=ASC&fields=ids&nopaging=true' ); + + if ( ! empty( $query_posts->posts ) ) { + foreach ( array_values( $query_posts->posts ) as $post_id ) { + $this->import_post_opengraph( $post_id ); + } + } + + return true; + } + + /** + * Imports the OpenGraph and Twitter settings for a single post. + * + * @param int $post_id Post ID. + * + * @return void + */ + private function import_post_opengraph( $post_id ) { + $meta = get_post_meta( $post_id, '_aioseop_opengraph_settings', true ); + $meta = maybe_unserialize( $meta ); + + foreach ( $this->import_keys as $old_key => $new_key ) { + $this->maybe_save_post_meta( $new_key, $meta[ $old_key ], $post_id ); + } + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-greg-high-performance-seo.php b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-greg-high-performance-seo.php new file mode 100644 index 00000000..8925421f --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-greg-high-performance-seo.php @@ -0,0 +1,42 @@ + '_ghpseo_alternative_description', + 'new_key' => 'metadesc', + ], + [ + 'old_key' => '_ghpseo_secondary_title', + 'new_key' => 'title', + ], + ]; +} diff --git a/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-headspace.php b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-headspace.php new file mode 100644 index 00000000..3a43d169 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-headspace.php @@ -0,0 +1,54 @@ + '_headspace_description', + 'new_key' => 'metadesc', + ], + [ + 'old_key' => '_headspace_page_title', + 'new_key' => 'title', + ], + [ + 'old_key' => '_headspace_noindex', + 'new_key' => 'meta-robots-noindex', + 'convert' => [ 'on' => 1 ], + ], + [ + 'old_key' => '_headspace_nofollow', + 'new_key' => 'meta-robots-nofollow', + 'convert' => [ 'on' => 1 ], + ], + ]; +} diff --git a/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-jetpack.php b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-jetpack.php new file mode 100644 index 00000000..5f57d816 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-jetpack.php @@ -0,0 +1,40 @@ + 'advanced_seo_description', + 'new_key' => 'metadesc', + ], + ]; +} diff --git a/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-platinum-seo-pack.php b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-platinum-seo-pack.php new file mode 100644 index 00000000..16a5ce9e --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-platinum-seo-pack.php @@ -0,0 +1,138 @@ + 'description', + 'new_key' => 'metadesc', + ], + [ + 'old_key' => 'title', + 'new_key' => 'title', + ], + ]; + + /** + * Runs the import of post meta keys stored by Platinum SEO Pack. + * + * @return bool + */ + protected function import() { + $return = parent::import(); + if ( $return ) { + $this->import_robots_meta(); + } + + return $return; + } + + /** + * Cleans up all the meta values Platinum SEO pack creates. + * + * @return bool + */ + protected function cleanup() { + $this->meta_key = 'title'; + parent::cleanup(); + + $this->meta_key = 'description'; + parent::cleanup(); + + $this->meta_key = 'metarobots'; + parent::cleanup(); + + return true; + } + + /** + * Finds all the robotsmeta fields to import and deals with them. + * + * There are four potential values that Platinum SEO stores: + * - index,folllow + * - index,nofollow + * - noindex,follow + * - noindex,nofollow + * + * We only have to deal with the latter 3, the first is our default. + * + * @return void + */ + protected function import_robots_meta() { + $this->import_by_meta_robots( 'index,nofollow', [ 'nofollow' ] ); + $this->import_by_meta_robots( 'noindex,follow', [ 'noindex' ] ); + $this->import_by_meta_robots( 'noindex,nofollow', [ 'noindex', 'nofollow' ] ); + } + + /** + * Imports the values for all index, nofollow posts. + * + * @param string $value The meta robots value to find posts for. + * @param array $metas The meta field(s) to save. + * + * @return void + */ + protected function import_by_meta_robots( $value, $metas ) { + $posts = $this->find_posts_by_robots_meta( $value ); + if ( ! $posts ) { + return; + } + + foreach ( $posts as $post_id ) { + foreach ( $metas as $meta ) { + $this->maybe_save_post_meta( 'meta-robots-' . $meta, 1, $post_id ); + } + } + } + + /** + * Finds posts by a given meta robots value. + * + * @param string $meta_value Robots meta value. + * + * @return array|bool Array of Post IDs on success, false on failure. + */ + protected function find_posts_by_robots_meta( $meta_value ) { + $posts = get_posts( + [ + 'post_type' => 'any', + 'meta_key' => 'robotsmeta', + 'meta_value' => $meta_value, + 'order' => 'ASC', + 'fields' => 'ids', + 'nopaging' => true, + ] + ); + if ( empty( $posts ) ) { + return false; + } + return $posts; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-premium-seo-pack.php b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-premium-seo-pack.php new file mode 100644 index 00000000..bd93b91e --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-premium-seo-pack.php @@ -0,0 +1,39 @@ +table_name = $wpdb->prefix . 'psp'; + $this->meta_key = ''; + } + + /** + * Returns the query to return an identifier for the posts to import. + * + * @return string + */ + protected function retrieve_posts_query() { + return "SELECT URL AS identifier FROM {$this->table_name} WHERE blog_id = %d"; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-rankmath.php b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-rankmath.php new file mode 100644 index 00000000..68e7c0c1 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-rankmath.php @@ -0,0 +1,179 @@ + 'rank_math_description', + 'new_key' => 'metadesc', + ], + [ + 'old_key' => 'rank_math_title', + 'new_key' => 'title', + ], + [ + 'old_key' => 'rank_math_canonical_url', + 'new_key' => 'canonical', + ], + [ + 'old_key' => 'rank_math_primary_category', + 'new_key' => 'primary_category', + ], + [ + 'old_key' => 'rank_math_facebook_title', + 'new_key' => 'opengraph-title', + ], + [ + 'old_key' => 'rank_math_facebook_description', + 'new_key' => 'opengraph-description', + ], + [ + 'old_key' => 'rank_math_facebook_image', + 'new_key' => 'opengraph-image', + ], + [ + 'old_key' => 'rank_math_facebook_image_id', + 'new_key' => 'opengraph-image-id', + ], + [ + 'old_key' => 'rank_math_twitter_title', + 'new_key' => 'twitter-title', + ], + [ + 'old_key' => 'rank_math_twitter_description', + 'new_key' => 'twitter-description', + ], + [ + 'old_key' => 'rank_math_twitter_image', + 'new_key' => 'twitter-image', + ], + [ + 'old_key' => 'rank_math_twitter_image_id', + 'new_key' => 'twitter-image-id', + ], + [ + 'old_key' => 'rank_math_focus_keyword', + 'new_key' => 'focuskw', + ], + ]; + + /** + * Handles post meta data to import. + * + * @return bool Import success status. + */ + protected function import() { + global $wpdb; + // Replace % with %% as their variables are the same except for that. + $wpdb->query( "UPDATE $wpdb->postmeta SET meta_value = REPLACE( meta_value, '%', '%%' ) WHERE meta_key IN ( 'rank_math_description', 'rank_math_title' )" ); + + $this->import_meta_robots(); + $return = $this->meta_keys_clone( $this->clone_keys ); + + // Return %% to % so our import is non-destructive. + $wpdb->query( "UPDATE $wpdb->postmeta SET meta_value = REPLACE( meta_value, '%%', '%' ) WHERE meta_key IN ( 'rank_math_description', 'rank_math_title' )" ); + + if ( $return ) { + $this->import_settings(); + } + + return $return; + } + + /** + * RankMath stores robots meta quite differently, so we have to parse it out. + * + * @return void + */ + private function import_meta_robots() { + global $wpdb; + $post_metas = $wpdb->get_results( "SELECT post_id, meta_value FROM $wpdb->postmeta WHERE meta_key = 'rank_math_robots'" ); + foreach ( $post_metas as $post_meta ) { + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- Reason: We can't control the form in which Rankmath sends the data. + $robots_values = unserialize( $post_meta->meta_value ); + foreach ( [ 'noindex', 'nofollow' ] as $directive ) { + $directive_key = array_search( $directive, $robots_values, true ); + if ( $directive_key !== false ) { + update_post_meta( $post_meta->post_id, '_yoast_wpseo_meta-robots-' . $directive, 1 ); + unset( $robots_values[ $directive_key ] ); + } + } + if ( count( $robots_values ) > 0 ) { + $value = implode( ',', $robots_values ); + update_post_meta( $post_meta->post_id, '_yoast_wpseo_meta-robots-adv', $value ); + } + } + } + + /** + * Imports some of the RankMath settings. + * + * @return void + */ + private function import_settings() { + $settings = [ + 'title_separator' => 'separator', + 'homepage_title' => 'title-home-wpseo', + 'homepage_description' => 'metadesc-home-wpseo', + 'author_archive_title' => 'title-author-wpseo', + 'date_archive_title' => 'title-archive-wpseo', + 'search_title' => 'title-search-wpseo', + '404_title' => 'title-404-wpseo', + 'pt_post_title' => 'title-post', + 'pt_page_title' => 'title-page', + ]; + $options = get_option( 'rank-math-options-titles' ); + + foreach ( $settings as $import_setting_key => $setting_key ) { + if ( ! empty( $options[ $import_setting_key ] ) ) { + $value = $options[ $import_setting_key ]; + // Make sure replace vars work. + $value = str_replace( '%', '%%', $value ); + WPSEO_Options::set( $setting_key, $value ); + } + } + } + + /** + * Removes the plugin data from the database. + * + * @return bool Cleanup status. + */ + protected function cleanup() { + $return = parent::cleanup(); + if ( $return ) { + global $wpdb; + $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE 'rank-math-%'" ); + $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE '%rank_math%'" ); + } + + return $return; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-seo-framework.php b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-seo-framework.php new file mode 100644 index 00000000..8a8ac9e1 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-seo-framework.php @@ -0,0 +1,94 @@ + '_genesis_description', + 'new_key' => 'metadesc', + ], + [ + 'old_key' => '_genesis_title', + 'new_key' => 'title', + ], + [ + 'old_key' => '_genesis_noindex', + 'new_key' => 'meta-robots-noindex', + ], + [ + 'old_key' => '_genesis_nofollow', + 'new_key' => 'meta-robots-nofollow', + ], + [ + 'old_key' => '_genesis_canonical_uri', + 'new_key' => 'canonical', + ], + [ + 'old_key' => '_open_graph_title', + 'new_key' => 'opengraph-title', + ], + [ + 'old_key' => '_open_graph_description', + 'new_key' => 'opengraph-description', + ], + [ + 'old_key' => '_social_image_url', + 'new_key' => 'opengraph-image', + ], + [ + 'old_key' => '_twitter_title', + 'new_key' => 'twitter-title', + ], + [ + 'old_key' => '_twitter_description', + 'new_key' => 'twitter-description', + ], + ]; + + /** + * Removes all the metadata set by the SEO Framework plugin. + * + * @return bool + */ + protected function cleanup() { + $set1 = parent::cleanup(); + + $this->meta_key = '_social_image_%'; + $set2 = parent::cleanup(); + + $this->meta_key = '_twitter_%'; + $set3 = parent::cleanup(); + + $this->meta_key = '_open_graph_%'; + $set4 = parent::cleanup(); + + return ( $set1 || $set2 || $set3 || $set4 ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-seopressor.php b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-seopressor.php new file mode 100644 index 00000000..4009c798 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-seopressor.php @@ -0,0 +1,175 @@ + '_seop_settings', + ], + ]; + + /** + * Imports the post meta values to Yoast SEO. + * + * @return bool Import success status. + */ + protected function import() { + // Query for all the posts that have an _seop_settings meta set. + $query_posts = new WP_Query( 'post_type=any&meta_key=_seop_settings&order=ASC&fields=ids&nopaging=true' ); + foreach ( $query_posts->posts as $post_id ) { + $this->import_post_focus_keywords( $post_id ); + $this->import_seopressor_post_settings( $post_id ); + } + + return true; + } + + /** + * Removes all the post meta fields SEOpressor creates. + * + * @return bool Cleanup status. + */ + protected function cleanup() { + global $wpdb; + + // If we get to replace the data, let's do some proper cleanup. + return $wpdb->query( "DELETE FROM {$wpdb->postmeta} WHERE meta_key LIKE '_seop_%'" ); + } + + /** + * Imports the data. SEOpressor stores most of the data in one post array, this loops over it. + * + * @param int $post_id Post ID. + * + * @return void + */ + private function import_seopressor_post_settings( $post_id ) { + $settings = get_post_meta( $post_id, '_seop_settings', true ); + + foreach ( + [ + 'fb_description' => 'opengraph-description', + 'fb_title' => 'opengraph-title', + 'fb_type' => 'og_type', + 'fb_img' => 'opengraph-image', + 'meta_title' => 'title', + 'meta_description' => 'metadesc', + 'meta_canonical' => 'canonical', + 'tw_description' => 'twitter-description', + 'tw_title' => 'twitter-title', + 'tw_image' => 'twitter-image', + ] as $seopressor_key => $yoast_key ) { + $this->import_meta_helper( $seopressor_key, $yoast_key, $settings, $post_id ); + } + + if ( isset( $settings['meta_rules'] ) ) { + $this->import_post_robots( $settings['meta_rules'], $post_id ); + } + } + + /** + * Imports the focus keywords, and stores them for later use. + * + * @param int $post_id Post ID. + * + * @return void + */ + private function import_post_focus_keywords( $post_id ) { + // Import the focus keyword. + $focuskw = trim( get_post_meta( $post_id, '_seop_kw_1', true ) ); + $this->maybe_save_post_meta( 'focuskw', $focuskw, $post_id ); + + // Import additional focus keywords for use in premium. + $focuskw2 = trim( get_post_meta( $post_id, '_seop_kw_2', true ) ); + $focuskw3 = trim( get_post_meta( $post_id, '_seop_kw_3', true ) ); + + $focus_keywords = []; + if ( ! empty( $focuskw2 ) ) { + $focus_keywords[] = $focuskw2; + } + if ( ! empty( $focuskw3 ) ) { + $focus_keywords[] = $focuskw3; + } + + if ( $focus_keywords !== [] ) { + $this->maybe_save_post_meta( 'focuskeywords', WPSEO_Utils::format_json_encode( $focus_keywords ), $post_id ); + } + } + + /** + * Retrieves the SEOpressor robot value and map this to Yoast SEO values. + * + * @param string $meta_rules The meta rules taken from the SEOpressor settings array. + * @param int $post_id The post id of the current post. + * + * @return void + */ + private function import_post_robots( $meta_rules, $post_id ) { + $seopressor_robots = explode( '#|#|#', $meta_rules ); + $robot_value = $this->get_robot_value( $seopressor_robots ); + + // Saving the new meta values for Yoast SEO. + $this->maybe_save_post_meta( 'meta-robots-noindex', $robot_value['index'], $post_id ); + $this->maybe_save_post_meta( 'meta-robots-nofollow', $robot_value['follow'], $post_id ); + $this->maybe_save_post_meta( 'meta-robots-adv', $robot_value['advanced'], $post_id ); + } + + /** + * Gets the robot config by given SEOpressor robots value. + * + * @param array $seopressor_robots The value in SEOpressor that needs to be converted to the Yoast format. + * + * @return array The robots values in Yoast format. + */ + private function get_robot_value( $seopressor_robots ) { + $return = [ + 'index' => 2, + 'follow' => 0, + 'advanced' => '', + ]; + + if ( in_array( 'noindex', $seopressor_robots, true ) ) { + $return['index'] = 1; + } + if ( in_array( 'nofollow', $seopressor_robots, true ) ) { + $return['follow'] = 1; + } + foreach ( [ 'noarchive', 'nosnippet', 'noimageindex' ] as $needle ) { + if ( in_array( $needle, $seopressor_robots, true ) ) { + $return['advanced'] .= $needle . ','; + } + } + $return['advanced'] = rtrim( $return['advanced'], ',' ); + + return $return; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-smartcrawl.php b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-smartcrawl.php new file mode 100644 index 00000000..507120c6 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-smartcrawl.php @@ -0,0 +1,151 @@ + '_wds_metadesc', + 'new_key' => 'metadesc', + ], + [ + 'old_key' => '_wds_title', + 'new_key' => 'title', + ], + [ + 'old_key' => '_wds_canonical', + 'new_key' => 'canonical', + ], + [ + 'old_key' => '_wds_focus-keywords', + 'new_key' => 'focuskw', + ], + [ + 'old_key' => '_wds_meta-robots-noindex', + 'new_key' => 'meta-robots-noindex', + ], + [ + 'old_key' => '_wds_meta-robots-nofollow', + 'new_key' => 'meta-robots-nofollow', + ], + ]; + + /** + * Used for importing Twitter and Facebook meta's. + * + * @var array + */ + protected $social_keys = []; + + /** + * Handles post meta data to import. + * + * @return bool Import success status. + */ + protected function import() { + $return = parent::import(); + if ( $return ) { + $this->import_opengraph(); + $this->import_twitter(); + } + + return $return; + } + + /** + * Imports the OpenGraph meta keys saved by Smartcrawl. + * + * @return bool Import status. + */ + protected function import_opengraph() { + $this->social_keys = [ + 'title' => 'opengraph-title', + 'description' => 'opengraph-description', + 'images' => 'opengraph-image', + ]; + return $this->post_find_import( '_wds_opengraph' ); + } + + /** + * Imports the Twitter meta keys saved by Smartcrawl. + * + * @return bool Import status. + */ + protected function import_twitter() { + $this->social_keys = [ + 'title' => 'twitter-title', + 'description' => 'twitter-description', + ]; + return $this->post_find_import( '_wds_twitter' ); + } + + /** + * Imports a post's serialized post meta values. + * + * @param int $post_id Post ID. + * @param string $key The meta key to import. + * + * @return void + */ + protected function import_serialized_post_meta( $post_id, $key ) { + $data = get_post_meta( $post_id, $key, true ); + $data = maybe_unserialize( $data ); + foreach ( $this->social_keys as $key => $meta_key ) { + if ( ! isset( $data[ $key ] ) ) { + return; + } + $value = $data[ $key ]; + if ( is_array( $value ) ) { + $value = $value[0]; + } + $this->maybe_save_post_meta( $meta_key, $value, $post_id ); + } + } + + /** + * Finds all the posts with a certain meta key and imports its values. + * + * @param string $key The meta key to search for. + * + * @return bool Import status. + */ + protected function post_find_import( $key ) { + $query_posts = new WP_Query( 'post_type=any&meta_key=' . $key . '&order=ASC&fields=ids&nopaging=true' ); + + if ( empty( $query_posts->posts ) ) { + return false; + } + + foreach ( array_values( $query_posts->posts ) as $post_id ) { + $this->import_serialized_post_meta( $post_id, $key ); + } + + return true; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-squirrly.php b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-squirrly.php new file mode 100644 index 00000000..2c088e26 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-squirrly.php @@ -0,0 +1,224 @@ + 'meta-robots-noindex', + 'nofollow' => 'meta-robots-nofollow', + 'title' => 'title', + 'description' => 'metadesc', + 'canonical' => 'canonical', + 'cornerstone' => '_yst_is_cornerstone', + 'tw_media' => 'twitter-image', + 'tw_title' => 'twitter-title', + 'tw_description' => 'twitter-description', + 'og_title' => 'opengraph-title', + 'og_description' => 'opengraph-description', + 'og_media' => 'opengraph-image', + 'focuskw' => 'focuskw', + ]; + + /** + * WPSEO_Import_Squirrly constructor. + */ + public function __construct() { + parent::__construct(); + + global $wpdb; + $this->table_name = $wpdb->prefix . 'qss'; + } + + /** + * Imports the post meta values to Yoast SEO. + * + * @return bool Import success status. + */ + protected function import() { + $results = $this->retrieve_posts(); + foreach ( $results as $post ) { + $return = $this->import_post_values( $post->identifier ); + if ( ! $return ) { + return false; + } + } + + return true; + } + + /** + * Retrieve the posts from the Squirrly Database. + * + * @return array Array of post IDs from the DB. + */ + protected function retrieve_posts() { + global $wpdb; + return $wpdb->get_results( + $wpdb->prepare( + $this->retrieve_posts_query(), + get_current_blog_id() + ) + ); + } + + /** + * Returns the query to return an identifier for the posts to import. + * + * @return string Query to get post ID's from the DB. + */ + protected function retrieve_posts_query() { + return "SELECT post_id AS identifier FROM {$this->table_name} WHERE blog_id = %d"; + } + + /** + * Removes the DB table and the post meta field Squirrly creates. + * + * @return bool Cleanup status. + */ + protected function cleanup() { + global $wpdb; + + // If we can clean, let's clean. + $wpdb->query( "DROP TABLE {$this->table_name}" ); + + // This removes the post meta field for the focus keyword from the DB. + parent::cleanup(); + + // If we can still see the table, something went wrong. + if ( $this->detect() ) { + $this->cleanup_error_msg(); + return false; + } + + return true; + } + + /** + * Detects whether there is post meta data to import. + * + * @return bool Boolean indicating whether there is something to import. + */ + protected function detect() { + global $wpdb; + + $result = $wpdb->get_var( "SHOW TABLES LIKE '{$this->table_name}'" ); + if ( is_wp_error( $result ) || is_null( $result ) ) { + return false; + } + + return true; + } + + /** + * Imports the data of a post out of Squirrly's DB table. + * + * @param mixed $post_identifier Post identifier, can be ID or string. + * + * @return bool Import status. + */ + private function import_post_values( $post_identifier ) { + $data = $this->retrieve_post_data( $post_identifier ); + if ( ! $data ) { + return false; + } + + if ( ! is_numeric( $post_identifier ) ) { + $post_id = url_to_postid( $post_identifier ); + } + + if ( is_numeric( $post_identifier ) ) { + $post_id = (int) $post_identifier; + $data['focuskw'] = $this->maybe_add_focus_kw( $post_identifier ); + } + + foreach ( $this->seo_field_keys as $squirrly_key => $yoast_key ) { + $this->import_meta_helper( $squirrly_key, $yoast_key, $data, $post_id ); + } + return true; + } + + /** + * Retrieves the Squirrly SEO data for a post from the DB. + * + * @param int $post_identifier Post ID. + * + * @return array|bool Array of data or false. + */ + private function retrieve_post_data( $post_identifier ) { + global $wpdb; + + if ( is_numeric( $post_identifier ) ) { + $post_identifier = (int) $post_identifier; + $query_where = 'post_id = %d'; + } + if ( ! is_numeric( $post_identifier ) ) { + $query_where = 'URL = %s'; + } + + $replacements = [ + get_current_blog_id(), + $post_identifier, + ]; + + $data = $wpdb->get_var( + $wpdb->prepare( + "SELECT seo FROM {$this->table_name} WHERE blog_id = %d AND " . $query_where, + $replacements + ) + ); + if ( ! $data || is_wp_error( $data ) ) { + return false; + } + $data = maybe_unserialize( $data ); + return $data; + } + + /** + * Squirrly stores the focus keyword in post meta. + * + * @param int $post_id Post ID. + * + * @return string The focus keyword. + */ + private function maybe_add_focus_kw( $post_id ) { + $focuskw = get_post_meta( $post_id, '_sq_post_keyword', true ); + if ( $focuskw ) { + $focuskw = json_decode( $focuskw ); + return $focuskw->keyword; + } + return ''; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-ultimate-seo.php b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-ultimate-seo.php new file mode 100644 index 00000000..a5113650 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-ultimate-seo.php @@ -0,0 +1,64 @@ + '_su_description', + 'new_key' => 'metadesc', + ], + [ + 'old_key' => '_su_title', + 'new_key' => 'title', + ], + [ + 'old_key' => '_su_og_title', + 'new_key' => 'opengraph-title', + ], + [ + 'old_key' => '_su_og_description', + 'new_key' => 'opengraph-description', + ], + [ + 'old_key' => '_su_og_image', + 'new_key' => 'opengraph-image', + ], + [ + 'old_key' => '_su_meta_robots_noindex', + 'new_key' => 'meta-robots-noindex', + 'convert' => [ 'on' => 1 ], + ], + [ + 'old_key' => '_su_meta_robots_nofollow', + 'new_key' => 'meta-robots-nofollow', + 'convert' => [ 'on' => 1 ], + ], + ]; +} diff --git a/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-woothemes-seo.php b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-woothemes-seo.php new file mode 100644 index 00000000..5ee943c3 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-woothemes-seo.php @@ -0,0 +1,138 @@ + 'seo_description', + 'new_key' => 'metadesc', + ], + [ + 'old_key' => 'seo_title', + 'new_key' => 'title', + ], + [ + 'old_key' => 'seo_noindex', + 'new_key' => 'meta-robots-noindex', + ], + [ + 'old_key' => 'seo_follow', + 'new_key' => 'meta-robots-nofollow', + ], + ]; + + /** + * Holds the meta fields we can delete after import. + * + * @var array + */ + protected $cleanup_metas = [ + 'seo_follow', + 'seo_noindex', + 'seo_title', + 'seo_description', + 'seo_keywords', + ]; + + /** + * Holds the options we can delete after import. + * + * @var array + */ + protected $cleanup_options = [ + 'seo_woo_archive_layout', + 'seo_woo_single_layout', + 'seo_woo_page_layout', + 'seo_woo_wp_title', + 'seo_woo_meta_single_desc', + 'seo_woo_meta_single_key', + 'seo_woo_home_layout', + ]; + + /** + * Cleans up the WooThemes SEO settings. + * + * @return bool Cleanup status. + */ + protected function cleanup() { + $result = $this->cleanup_meta(); + if ( $result ) { + $this->cleanup_options(); + } + return $result; + } + + /** + * Removes the Woo Options from the database. + * + * @return void + */ + private function cleanup_options() { + foreach ( $this->cleanup_options as $option ) { + delete_option( $option ); + } + } + + /** + * Removes the post meta fields from the database. + * + * @return bool Cleanup status. + */ + private function cleanup_meta() { + foreach ( $this->cleanup_metas as $key ) { + $result = $this->cleanup_meta_key( $key ); + if ( ! $result ) { + return false; + } + } + return true; + } + + /** + * Removes a single meta field from the postmeta table in the database. + * + * @param string $key The meta_key to delete. + * + * @return bool Cleanup status. + */ + private function cleanup_meta_key( $key ) { + global $wpdb; + + $wpdb->query( + $wpdb->prepare( + "DELETE FROM {$wpdb->postmeta} WHERE meta_key = %s", + $key + ) + ); + return $wpdb->__get( 'result' ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-wp-meta-seo.php b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-wp-meta-seo.php new file mode 100644 index 00000000..e6a55efb --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-wp-meta-seo.php @@ -0,0 +1,82 @@ + '_metaseo_metadesc', + 'new_key' => 'metadesc', + ], + [ + 'old_key' => '_metaseo_metatitle', + 'new_key' => 'title', + ], + [ + 'old_key' => '_metaseo_metaopengraph-title', + 'new_key' => 'opengraph-title', + ], + [ + 'old_key' => '_metaseo_metaopengraph-desc', + 'new_key' => 'opengraph-description', + ], + [ + 'old_key' => '_metaseo_metaopengraph-image', + 'new_key' => 'opengraph-image', + ], + [ + 'old_key' => '_metaseo_metatwitter-title', + 'new_key' => 'twitter-title', + ], + [ + 'old_key' => '_metaseo_metatwitter-desc', + 'new_key' => 'twitter-description', + ], + [ + 'old_key' => '_metaseo_metatwitter-image', + 'new_key' => 'twitter-image', + ], + [ + 'old_key' => '_metaseo_metaindex', + 'new_key' => 'meta-robots-noindex', + 'convert' => [ + 'index' => 0, + 'noindex' => 1, + ], + ], + [ + 'old_key' => '_metaseo_metafollow', + 'new_key' => 'meta-robots-nofollow', + 'convert' => [ + 'follow' => 0, + 'nofollow' => 1, + ], + ], + ]; +} diff --git a/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-wpseo.php b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-wpseo.php new file mode 100644 index 00000000..0d138f2b --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-import-wpseo.php @@ -0,0 +1,310 @@ + '_wpseo_edit_description', + 'new_key' => 'metadesc', + ], + [ + 'old_key' => '_wpseo_edit_title', + 'new_key' => 'title', + ], + [ + 'old_key' => '_wpseo_edit_canonical', + 'new_key' => 'canonical', + ], + [ + 'old_key' => '_wpseo_edit_og_title', + 'new_key' => 'opengraph-title', + ], + [ + 'old_key' => '_wpseo_edit_og_description', + 'new_key' => 'opengraph-description', + ], + [ + 'old_key' => '_wpseo_edit_og_image', + 'new_key' => 'opengraph-image', + ], + [ + 'old_key' => '_wpseo_edit_twittercard_title', + 'new_key' => 'twitter-title', + ], + [ + 'old_key' => '_wpseo_edit_twittercard_description', + 'new_key' => 'twitter-description', + ], + [ + 'old_key' => '_wpseo_edit_twittercard_image', + 'new_key' => 'twitter-image', + ], + ]; + + /** + * The values 1 - 6 are the configured values from wpSEO. This array will map the values of wpSEO to our values. + * + * There are some double array like 1-6 and 3-4. The reason is they only set the index value. The follow value is + * the default we use in the cases there isn't a follow value present. + * + * @var array + */ + private $robot_values = [ + // In wpSEO: index, follow. + 1 => [ + 'index' => 2, + 'follow' => 0, + ], + // In wpSEO: index, nofollow. + 2 => [ + 'index' => 2, + 'follow' => 1, + ], + // In wpSEO: noindex. + 3 => [ + 'index' => 1, + 'follow' => 0, + ], + // In wpSEO: noindex, follow. + 4 => [ + 'index' => 1, + 'follow' => 0, + ], + // In wpSEO: noindex, nofollow. + 5 => [ + 'index' => 1, + 'follow' => 1, + ], + // In wpSEO: index. + 6 => [ + 'index' => 2, + 'follow' => 0, + ], + ]; + + /** + * Imports wpSEO settings. + * + * @return bool Import success status. + */ + protected function import() { + $status = parent::import(); + if ( $status ) { + $this->import_post_robots(); + $this->import_taxonomy_metas(); + } + + return $status; + } + + /** + * Removes wpseo.de post meta's. + * + * @return bool Cleanup status. + */ + protected function cleanup() { + $this->cleanup_term_meta(); + $result = $this->cleanup_post_meta(); + return $result; + } + + /** + * Detects whether there is post meta data to import. + * + * @return bool Boolean indicating whether there is something to import. + */ + protected function detect() { + if ( parent::detect() ) { + return true; + } + + global $wpdb; + $count = $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->options} WHERE option_name LIKE 'wpseo_category_%'" ); + if ( $count !== '0' ) { + return true; + } + + return false; + } + + /** + * Imports the robot values from WPSEO plugin. These have to be converted to the Yoast format. + * + * @return void + */ + private function import_post_robots() { + $query_posts = new WP_Query( 'post_type=any&meta_key=_wpseo_edit_robots&order=ASC&fields=ids&nopaging=true' ); + + if ( ! empty( $query_posts->posts ) ) { + foreach ( array_values( $query_posts->posts ) as $post_id ) { + $this->import_post_robot( $post_id ); + } + } + } + + /** + * Gets the wpSEO robot value and map this to Yoast SEO values. + * + * @param int $post_id The post id of the current post. + * + * @return void + */ + private function import_post_robot( $post_id ) { + $wpseo_robots = get_post_meta( $post_id, '_wpseo_edit_robots', true ); + $robot_value = $this->get_robot_value( $wpseo_robots ); + + // Saving the new meta values for Yoast SEO. + $this->maybe_save_post_meta( 'meta-robots-noindex', $robot_value['index'], $post_id ); + $this->maybe_save_post_meta( 'meta-robots-nofollow', $robot_value['follow'], $post_id ); + } + + /** + * Imports the taxonomy metas from wpSEO. + * + * @return void + */ + private function import_taxonomy_metas() { + $terms = get_terms( + [ + 'taxonomy' => get_taxonomies(), + 'hide_empty' => false, + ] + ); + $tax_meta = get_option( 'wpseo_taxonomy_meta' ); + + foreach ( $terms as $term ) { + $this->import_taxonomy_description( $tax_meta, $term->taxonomy, $term->term_id ); + $this->import_taxonomy_robots( $tax_meta, $term->taxonomy, $term->term_id ); + } + + update_option( 'wpseo_taxonomy_meta', $tax_meta ); + } + + /** + * Imports the meta description to Yoast SEO. + * + * @param array $tax_meta The array with the current metadata. + * @param string $taxonomy String with the name of the taxonomy. + * @param string $term_id The ID of the current term. + * + * @return void + */ + private function import_taxonomy_description( &$tax_meta, $taxonomy, $term_id ) { + $description = get_option( 'wpseo_' . $taxonomy . '_' . $term_id, false ); + if ( $description !== false ) { + // Import description. + $tax_meta[ $taxonomy ][ $term_id ]['wpseo_desc'] = $description; + } + } + + /** + * Imports the robot value to Yoast SEO. + * + * @param array $tax_meta The array with the current metadata. + * @param string $taxonomy String with the name of the taxonomy. + * @param string $term_id The ID of the current term. + * + * @return void + */ + private function import_taxonomy_robots( &$tax_meta, $taxonomy, $term_id ) { + $wpseo_robots = get_option( 'wpseo_' . $taxonomy . '_' . $term_id . '_robots', false ); + if ( $wpseo_robots === false ) { + return; + } + // The value 1, 2 and 6 are the index values in wpSEO. + $new_robot_value = 'noindex'; + + if ( in_array( (int) $wpseo_robots, [ 1, 2, 6 ], true ) ) { + $new_robot_value = 'index'; + } + + $tax_meta[ $taxonomy ][ $term_id ]['wpseo_noindex'] = $new_robot_value; + } + + /** + * Deletes the wpSEO taxonomy meta data. + * + * @param string $taxonomy String with the name of the taxonomy. + * @param string $term_id The ID of the current term. + * + * @return void + */ + private function delete_taxonomy_metas( $taxonomy, $term_id ) { + delete_option( 'wpseo_' . $taxonomy . '_' . $term_id ); + delete_option( 'wpseo_' . $taxonomy . '_' . $term_id . '_robots' ); + } + + /** + * Gets the robot config by given wpSEO robots value. + * + * @param string $wpseo_robots The value in wpSEO that needs to be converted to the Yoast format. + * + * @return string The correct robot value. + */ + private function get_robot_value( $wpseo_robots ) { + if ( array_key_exists( $wpseo_robots, $this->robot_values ) ) { + return $this->robot_values[ $wpseo_robots ]; + } + + return $this->robot_values[1]; + } + + /** + * Deletes wpSEO postmeta from the database. + * + * @return bool Cleanup status. + */ + private function cleanup_post_meta() { + global $wpdb; + + // If we get to replace the data, let's do some proper cleanup. + return $wpdb->query( "DELETE FROM {$wpdb->postmeta} WHERE meta_key LIKE '_wpseo_edit_%'" ); + } + + /** + * Cleans up the wpSEO term meta. + * + * @return void + */ + private function cleanup_term_meta() { + $terms = get_terms( + [ + 'taxonomy' => get_taxonomies(), + 'hide_empty' => false, + ] + ); + + foreach ( $terms as $term ) { + $this->delete_taxonomy_metas( $term->taxonomy, $term->term_id ); + } + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/import/plugins/class-importers.php b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-importers.php new file mode 100644 index 00000000..d2336ecd --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/import/plugins/class-importers.php @@ -0,0 +1,47 @@ +get_manage_capability(); + $page_identifier = $this->get_page_identifier(); + $admin_page_callback = $this->get_admin_page_callback(); + + // Get all submenu pages. + $submenu_pages = $this->get_submenu_pages(); + + foreach ( $submenu_pages as $submenu_page ) { + if ( WPSEO_Capability_Utils::current_user_can( $submenu_page[3] ) ) { + $manage_capability = $submenu_page[3]; + $page_identifier = $submenu_page[4]; + $admin_page_callback = $submenu_page[5]; + break; + } + } + + foreach ( $submenu_pages as $index => $submenu_page ) { + $submenu_pages[ $index ][0] = $page_identifier; + } + + /* + * The current user has the capability to control anything. + * This means that all submenus and dashboard can be shown. + */ + global $admin_page_hooks; + + add_menu_page( + 'Yoast SEO: ' . __( 'Dashboard', 'wordpress-seo' ), + 'Yoast SEO ' . $this->get_notification_counter(), + $manage_capability, + $page_identifier, + $admin_page_callback, + $this->get_icon_svg(), + 99 + ); + + // Wipe notification bits from hooks. + // phpcs:ignore WordPress.WP.GlobalVariablesOverride -- This is a deliberate action. + $admin_page_hooks[ $page_identifier ] = 'seo'; + + // Add submenu items to the main menu if possible. + $this->register_submenu_pages( $submenu_pages ); + } + + /** + * Returns the list of registered submenu pages. + * + * @return array List of registered submenu pages. + */ + public function get_submenu_pages() { + global $wpseo_admin; + + $search_console_callback = null; + + // Account for when the available submenu pages are requested from outside the admin. + if ( isset( $wpseo_admin ) ) { + $google_search_console = new WPSEO_GSC(); + $search_console_callback = [ $google_search_console, 'display' ]; + } + + // Submenu pages. + $submenu_pages = [ + $this->get_submenu_page( __( 'General', 'wordpress-seo' ), $this->get_page_identifier() ), + $this->get_submenu_page( + __( 'Search Console', 'wordpress-seo' ), + 'wpseo_search_console', + $search_console_callback + ), + $this->get_submenu_page( __( 'Tools', 'wordpress-seo' ), 'wpseo_tools' ), + $this->get_submenu_page( $this->get_license_page_title(), 'wpseo_licenses' ), + ]; + + /** + * Filter: 'wpseo_submenu_pages' - Collects all submenus that need to be shown. + * + * @param array $submenu_pages List with all submenu pages. + */ + return (array) apply_filters( 'wpseo_submenu_pages', $submenu_pages ); + } + + /** + * Returns the notification count in HTML format. + * + * @return string The notification count in HTML format. + */ + protected function get_notification_counter() { + $notification_center = Yoast_Notification_Center::get(); + $notification_count = $notification_center->get_notification_count(); + + // Add main page. + /* translators: Hidden accessibility text; %s: number of notifications. */ + $notifications = sprintf( _n( '%s notification', '%s notifications', $notification_count, 'wordpress-seo' ), number_format_i18n( $notification_count ) ); + + return sprintf( '%2$s', $notification_count, $notifications ); + } + + /** + * Returns the capability that is required to manage all options. + * + * @return string Capability to check against. + */ + protected function get_manage_capability() { + return 'wpseo_manage_options'; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/menu/class-base-menu.php b/wp-content/plugins/wordpress-seo/admin/menu/class-base-menu.php new file mode 100644 index 00000000..1d91eaa8 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/menu/class-base-menu.php @@ -0,0 +1,287 @@ +menu = $menu; + } + + /** + * Returns the list of registered submenu pages. + * + * @return array List of registered submenu pages. + */ + abstract public function get_submenu_pages(); + + /** + * Creates a submenu formatted array. + * + * @param string $page_title Page title to use. + * @param string $page_slug Page slug to use. + * @param callable|null $callback Optional. Callback which handles the page request. + * @param callable[]|null $hook Optional. Hook to trigger when the page is registered. + * + * @return array Formatted submenu. + */ + protected function get_submenu_page( $page_title, $page_slug, $callback = null, $hook = null ) { + if ( $callback === null ) { + $callback = $this->get_admin_page_callback(); + } + + return [ + $this->get_page_identifier(), + '', + $page_title, + $this->get_manage_capability(), + $page_slug, + $callback, + $hook, + ]; + } + + /** + * Registers submenu pages as menu pages. + * + * This method should only be used if the user does not have the required capabilities + * to access the parent menu page. + * + * @param array $submenu_pages List of submenu pages to register. + * + * @return void + */ + protected function register_menu_pages( $submenu_pages ) { + if ( ! is_array( $submenu_pages ) || empty( $submenu_pages ) ) { + return; + } + + // Loop through submenu pages and add them. + array_walk( $submenu_pages, [ $this, 'register_menu_page' ] ); + } + + /** + * Registers submenu pages. + * + * @param array $submenu_pages List of submenu pages to register. + * + * @return void + */ + protected function register_submenu_pages( $submenu_pages ) { + if ( ! is_array( $submenu_pages ) || empty( $submenu_pages ) ) { + return; + } + + // Loop through submenu pages and add them. + array_walk( $submenu_pages, [ $this, 'register_submenu_page' ] ); + } + + /** + * Registers a submenu page as a menu page. + * + * This method should only be used if the user does not have the required capabilities + * to access the parent menu page. + * + * @param array $submenu_page { + * Submenu page definition. + * + * @type string $0 Parent menu page slug. + * @type string $1 Page title, currently unused. + * @type string $2 Title to display in the menu. + * @type string $3 Required capability to access the page. + * @type string $4 Page slug. + * @type callable $5 Callback to run when the page is rendered. + * @type array $6 Optional. List of callbacks to run when the page is loaded. + * } + * + * @return void + */ + protected function register_menu_page( $submenu_page ) { + + // If the submenu page requires the general manage capability, it must be added as an actual submenu page. + if ( $submenu_page[3] === $this->get_manage_capability() ) { + return; + } + + $page_title = 'Yoast SEO: ' . $submenu_page[2]; + + // Register submenu page as menu page. + $hook_suffix = add_menu_page( + $page_title, + $submenu_page[2], + $submenu_page[3], + $submenu_page[4], + $submenu_page[5], + $this->get_icon_svg(), + 99 + ); + + // If necessary, add hooks for the submenu page. + if ( isset( $submenu_page[6] ) && ( is_array( $submenu_page[6] ) ) ) { + $this->add_page_hooks( $hook_suffix, $submenu_page[6] ); + } + } + + /** + * Registers a submenu page. + * + * This method will override the capability of the page to automatically use the + * general manage capability. Use the `register_menu_page()` method if the submenu + * page should actually use a different capability. + * + * @param array $submenu_page { + * Submenu page definition. + * + * @type string $0 Parent menu page slug. + * @type string $1 Page title, currently unused. + * @type string $2 Title to display in the menu. + * @type string $3 Required capability to access the page. + * @type string $4 Page slug. + * @type callable $5 Callback to run when the page is rendered. + * @type array $6 Optional. List of callbacks to run when the page is loaded. + * } + * + * @return void + */ + protected function register_submenu_page( $submenu_page ) { + $page_title = $submenu_page[2]; + + // We cannot use $submenu_page[1] because add-ons define that, so hard-code this value. + if ( $submenu_page[4] === 'wpseo_licenses' ) { + $page_title = $this->get_license_page_title(); + } + + /* + * Handle the Google Search Console special case by passing a fake parent + * page slug. This way, the sub-page is stil registered and can be accessed + * directly. Its menu item won't be displayed. + */ + if ( $submenu_page[4] === 'wpseo_search_console' ) { + // Set the parent page slug to a non-existing one. + $submenu_page[0] = 'wpseo_fake_menu_parent_page_slug'; + } + + $page_title .= ' - Yoast SEO'; + + // Register submenu page. + $hook_suffix = add_submenu_page( + $submenu_page[0], + $page_title, + $submenu_page[2], + $submenu_page[3], + $submenu_page[4], + $submenu_page[5] + ); + + // If necessary, add hooks for the submenu page. + if ( isset( $submenu_page[6] ) && ( is_array( $submenu_page[6] ) ) ) { + $this->add_page_hooks( $hook_suffix, $submenu_page[6] ); + } + } + + /** + * Adds hook callbacks for a given admin page hook suffix. + * + * @param string $hook_suffix Admin page hook suffix, as returned by `add_menu_page()` + * or `add_submenu_page()`. + * @param array $callbacks Callbacks to add. + * + * @return void + */ + protected function add_page_hooks( $hook_suffix, array $callbacks ) { + foreach ( $callbacks as $callback ) { + add_action( 'load-' . $hook_suffix, $callback ); + } + } + + /** + * Gets the main admin page identifier. + * + * @return string Admin page identifier. + */ + protected function get_page_identifier() { + return $this->menu->get_page_identifier(); + } + + /** + * Checks whether the current user has capabilities to manage all options. + * + * @return bool True if capabilities are sufficient, false otherwise. + */ + protected function check_manage_capability() { + return WPSEO_Capability_Utils::current_user_can( $this->get_manage_capability() ); + } + + /** + * Returns the capability that is required to manage all options. + * + * @return string Capability to check against. + */ + abstract protected function get_manage_capability(); + + /** + * Returns the page handler callback. + * + * @return array Callback page handler. + */ + protected function get_admin_page_callback() { + return [ $this->menu, 'load_page' ]; + } + + /** + * Returns the page title to use for the licenses page. + * + * @return string The title for the license page. + */ + protected function get_license_page_title() { + static $title = null; + + if ( $title === null ) { + $title = __( 'Upgrades', 'wordpress-seo' ); + } + + if ( YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2023-promotion' ) && ! YoastSEO()->helpers->product->is_premium() ) { + $title = __( 'Upgrades', 'wordpress-seo' ) . '' . __( '30% OFF', 'wordpress-seo' ) . ''; + } + + return $title; + } + + /** + * Returns a base64 URL for the svg for use in the menu. + * + * @param bool $base64 Whether or not to return base64'd output. + * + * @return string SVG icon. + */ + public function get_icon_svg( $base64 = true ) { + $svg = ''; + + if ( $base64 ) { + //phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode -- This encoding is intended. + return 'data:image/svg+xml;base64,' . base64_encode( $svg ); + } + + return $svg; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/menu/class-menu.php b/wp-content/plugins/wordpress-seo/admin/menu/class-menu.php new file mode 100644 index 00000000..bc3ab3e0 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/menu/class-menu.php @@ -0,0 +1,96 @@ +register_hooks(); + + if ( WPSEO_Utils::is_plugin_network_active() ) { + $network_admin_menu = new WPSEO_Network_Admin_Menu( $this ); + $network_admin_menu->register_hooks(); + } + + $capability_normalizer = new WPSEO_Submenu_Capability_Normalize(); + $capability_normalizer->register_hooks(); + } + + /** + * Returns the main menu page identifier. + * + * @return string Page identifier to use. + */ + public function get_page_identifier() { + return self::PAGE_IDENTIFIER; + } + + /** + * Loads the requested admin settings page. + * + * @return void + */ + public function load_page() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + if ( isset( $_GET['page'] ) && is_string( $_GET['page'] ) ) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + $page = sanitize_text_field( wp_unslash( $_GET['page'] ) ); + $this->show_page( $page ); + } + } + + /** + * Shows an admin settings page. + * + * @param string $page Page to display. + * + * @return void + */ + protected function show_page( $page ) { + switch ( $page ) { + case 'wpseo_tools': + require_once WPSEO_PATH . 'admin/pages/tools.php'; + break; + + case 'wpseo_licenses': + require_once WPSEO_PATH . 'admin/pages/licenses.php'; + break; + + case 'wpseo_files': + require_once WPSEO_PATH . 'admin/views/tool-file-editor.php'; + break; + + default: + require_once WPSEO_PATH . 'admin/pages/dashboard.php'; + break; + } + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/menu/class-network-admin-menu.php b/wp-content/plugins/wordpress-seo/admin/menu/class-network-admin-menu.php new file mode 100644 index 00000000..b440cc10 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/menu/class-network-admin-menu.php @@ -0,0 +1,97 @@ +check_manage_capability() ) { + return; + } + + add_menu_page( + __( 'Network Settings', 'wordpress-seo' ) . ' - Yoast SEO', + 'Yoast SEO', + $this->get_manage_capability(), + $this->get_page_identifier(), + [ $this, 'network_config_page' ], + $this->get_icon_svg() + ); + + $submenu_pages = $this->get_submenu_pages(); + $this->register_submenu_pages( $submenu_pages ); + } + + /** + * Returns the list of registered submenu pages. + * + * @return array List of registered submenu pages. + */ + public function get_submenu_pages() { + + // Submenu pages. + $submenu_pages = [ + $this->get_submenu_page( + __( 'General', 'wordpress-seo' ), + $this->get_page_identifier(), + [ $this, 'network_config_page' ] + ), + ]; + + if ( WPSEO_Utils::allow_system_file_edit() === true ) { + $submenu_pages[] = $this->get_submenu_page( __( 'Edit Files', 'wordpress-seo' ), 'wpseo_files' ); + } + + $submenu_pages[] = $this->get_submenu_page( __( 'Extensions', 'wordpress-seo' ), 'wpseo_licenses' ); + + return $submenu_pages; + } + + /** + * Loads the form for the network configuration page. + * + * @return void + */ + public function network_config_page() { + require_once WPSEO_PATH . 'admin/pages/network.php'; + } + + /** + * Checks whether the current user has capabilities to manage all options. + * + * @return bool True if capabilities are sufficient, false otherwise. + */ + protected function check_manage_capability() { + return current_user_can( $this->get_manage_capability() ); + } + + /** + * Returns the capability that is required to manage all options. + * + * @return string Capability to check against. + */ + protected function get_manage_capability() { + return 'wpseo_manage_network_options'; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/menu/class-replacevar-editor.php b/wp-content/plugins/wordpress-seo/admin/menu/class-replacevar-editor.php new file mode 100644 index 00000000..7f3b8201 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/menu/class-replacevar-editor.php @@ -0,0 +1,159 @@ + true, + 'label_title' => '', + 'label_description' => '', + 'description_placeholder' => '', + 'has_new_badge' => false, + 'is_disabled' => false, + 'has_premium_badge' => false, + ] + ); + + $this->validate_arguments( $arguments ); + + $this->yform = $yform; + $this->arguments = [ + 'title' => (string) $arguments['title'], + 'description' => (string) $arguments['description'], + 'page_type_recommended' => (string) $arguments['page_type_recommended'], + 'page_type_specific' => (string) $arguments['page_type_specific'], + 'paper_style' => (bool) $arguments['paper_style'], + 'label_title' => (string) $arguments['label_title'], + 'label_description' => (string) $arguments['label_description'], + 'description_placeholder' => (string) $arguments['description_placeholder'], + 'has_new_badge' => (bool) $arguments['has_new_badge'], + 'is_disabled' => (bool) $arguments['is_disabled'], + 'has_premium_badge' => (bool) $arguments['has_premium_badge'], + ]; + } + + /** + * Renders a div for the react application to mount to, and hidden inputs where + * the app should store it's value so they will be properly saved when the form + * is submitted. + * + * @return void + */ + public function render() { + $this->yform->hidden( $this->arguments['title'], $this->arguments['title'] ); + $this->yform->hidden( $this->arguments['description'], $this->arguments['description'] ); + + printf( + '
    ', + esc_attr( $this->arguments['title'] ), + esc_attr( $this->arguments['description'] ), + esc_attr( $this->arguments['page_type_recommended'] ), + esc_attr( $this->arguments['page_type_specific'] ), + esc_attr( $this->arguments['paper_style'] ), + esc_attr( $this->arguments['label_title'] ), + esc_attr( $this->arguments['label_description'] ), + esc_attr( $this->arguments['description_placeholder'] ), + esc_attr( $this->arguments['has_new_badge'] ), + esc_attr( $this->arguments['is_disabled'] ), + esc_attr( $this->arguments['has_premium_badge'] ) + ); + } + + /** + * Validates the replacement variable editor arguments. + * + * @param array $arguments The arguments to validate. + * + * @throws InvalidArgumentException Thrown when not all required arguments are present. + * + * @return void + */ + protected function validate_arguments( array $arguments ) { + $required_arguments = [ + 'title', + 'description', + 'page_type_recommended', + 'page_type_specific', + 'paper_style', + ]; + + foreach ( $required_arguments as $field_name ) { + if ( ! array_key_exists( $field_name, $arguments ) ) { + throw new InvalidArgumentException( + sprintf( + /* translators: %1$s expands to the missing field name. */ + __( 'Not all required fields are given. Missing field %1$s', 'wordpress-seo' ), + $field_name + ) + ); + } + } + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/menu/class-replacevar-field.php b/wp-content/plugins/wordpress-seo/admin/menu/class-replacevar-field.php new file mode 100644 index 00000000..e94d2c73 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/menu/class-replacevar-field.php @@ -0,0 +1,88 @@ +yform = $yform; + $this->field_id = $field_id; + $this->label = $label; + $this->page_type_recommended = $page_type_recommended; + $this->page_type_specific = $page_type_specific; + } + + /** + * Renders a div for the react application to mount to, and hidden inputs where + * the app should store it's value so they will be properly saved when the form + * is submitted. + * + * @return void + */ + public function render() { + $this->yform->hidden( $this->field_id, $this->field_id ); + + printf( + '
    ', + esc_attr( $this->field_id ), + esc_attr( $this->label ), + esc_attr( $this->page_type_recommended ), + esc_attr( $this->page_type_specific ) + ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/menu/class-submenu-capability-normalize.php b/wp-content/plugins/wordpress-seo/admin/menu/class-submenu-capability-normalize.php new file mode 100644 index 00000000..6e35718f --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/menu/class-submenu-capability-normalize.php @@ -0,0 +1,41 @@ + $submenu_page ) { + if ( $submenu_page[3] === 'manage_options' ) { + $submenu_pages[ $index ][3] = 'wpseo_manage_options'; + } + } + + return $submenu_pages; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/metabox/class-abstract-sectioned-metabox-tab.php b/wp-content/plugins/wordpress-seo/admin/metabox/class-abstract-sectioned-metabox-tab.php new file mode 100644 index 00000000..29ec6e90 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/metabox/class-abstract-sectioned-metabox-tab.php @@ -0,0 +1,97 @@ + '', + 'link_class' => '', + 'link_aria_label' => '', + ]; + + $options = array_merge( $default_options, $options ); + + $this->name = $name; + + $this->link_content = $link_content; + $this->link_title = $options['link_title']; + $this->link_class = $options['link_class']; + $this->link_aria_label = $options['link_aria_label']; + } + + /** + * Outputs the section link if any section has been added. + * + * @return void + */ + public function display_link() { + if ( $this->has_sections() ) { + printf( + '
  • %5$s
  • ', + esc_attr( $this->name ), + esc_attr( $this->link_class ), + ( $this->link_title !== '' ) ? ' title="' . esc_attr( $this->link_title ) . '"' : '', + ( $this->link_aria_label !== '' ) ? ' aria-label="' . esc_attr( $this->link_aria_label ) . '"' : '', + $this->link_content + ); + } + } + + /** + * Checks whether the tab has any sections. + * + * @return bool Whether the tab has any sections + */ + abstract protected function has_sections(); +} diff --git a/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-inclusive-language.php b/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-inclusive-language.php new file mode 100644 index 00000000..1fe2a1fd --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-inclusive-language.php @@ -0,0 +1,58 @@ +is_globally_enabled() && $this->is_user_enabled() && $this->is_current_version_supported() + && YoastSEO()->helpers->language->has_inclusive_language_support( WPSEO_Language_Utils::get_language( get_locale() ) ); + } + + /** + * Whether or not this analysis is enabled by the user. + * + * @return bool Whether or not this analysis is enabled by the user. + */ + public function is_user_enabled() { + return ! get_the_author_meta( 'wpseo_inclusive_language_analysis_disable', get_current_user_id() ); + } + + /** + * Whether or not this analysis is enabled globally. + * + * @return bool Whether or not this analysis is enabled globally. + */ + public function is_globally_enabled() { + return WPSEO_Options::get( 'inclusive_language_analysis_active', false ); + } + + /** + * Whether the inclusive language analysis should be loaded in Free. + * + * It should always be loaded when Premium is not active. If Premium is active, it depends on the version. Some Premium + * versions also have inclusive language code (when it was still a Premium only feature) which would result in rendering + * the analysis twice. In those cases, the analysis should be only loaded from the Premium side. + * + * @return bool Whether or not the inclusive language analysis should be loaded. + */ + private function is_current_version_supported() { + $is_premium = YoastSEO()->helpers->product->is_premium(); + $premium_version = YoastSEO()->helpers->product->get_premium_version(); + + return ! $is_premium + || version_compare( $premium_version, '19.6-RC0', '>=' ) + || version_compare( $premium_version, '19.2', '==' ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-readability.php b/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-readability.php new file mode 100644 index 00000000..65345c48 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-readability.php @@ -0,0 +1,39 @@ +is_globally_enabled() && $this->is_user_enabled(); + } + + /** + * Whether or not this analysis is enabled by the user. + * + * @return bool Whether or not this analysis is enabled by the user. + */ + public function is_user_enabled() { + return ! get_the_author_meta( 'wpseo_content_analysis_disable', get_current_user_id() ); + } + + /** + * Whether or not this analysis is enabled globally. + * + * @return bool Whether or not this analysis is enabled globally. + */ + public function is_globally_enabled() { + return WPSEO_Options::get( 'content_analysis_active', true ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-seo.php b/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-seo.php new file mode 100644 index 00000000..8225defb --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-seo.php @@ -0,0 +1,39 @@ +is_globally_enabled() && $this->is_user_enabled(); + } + + /** + * Whether or not this analysis is enabled by the user. + * + * @return bool Whether or not this analysis is enabled by the user. + */ + public function is_user_enabled() { + return ! get_the_author_meta( 'wpseo_keyword_analysis_disable', get_current_user_id() ); + } + + /** + * Whether or not this analysis is enabled globally. + * + * @return bool Whether or not this analysis is enabled globally. + */ + public function is_globally_enabled() { + return WPSEO_Options::get( 'keyword_analysis_active', true ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-collapsible.php b/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-collapsible.php new file mode 100644 index 00000000..c5d378cd --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-collapsible.php @@ -0,0 +1,84 @@ +name = $name; + $this->content = $content; + $this->link_content = $link_content; + } + + /** + * Returns the html for the tab link. + * + * @return string + */ + public function link() { + return $this->link_content; + } + + /** + * Returns the html for the tab content. + * + * @return string + */ + public function content() { + $collapsible_paper = new WPSEO_Paper_Presenter( + $this->link(), + null, + [ + 'content' => $this->content, + 'collapsible' => true, + 'class' => 'metabox wpseo-form wpseo-collapsible-container', + 'paper_id' => 'collapsible-' . $this->name, + ] + ); + + return $collapsible_paper->get_output(); + } + + /** + * Returns the collapsible's unique identifier. + * + * @return string + */ + public function get_name() { + return $this->name; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-collapsibles-section.php b/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-collapsibles-section.php new file mode 100644 index 00000000..14e8638e --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-collapsibles-section.php @@ -0,0 +1,65 @@ +collapsibles = $collapsibles; + } + + /** + * Outputs the section content if any tab has been added. + * + * @return void + */ + public function display_content() { + if ( $this->has_sections() ) { + printf( '
    ', esc_attr( 'wpseo-meta-section-' . $this->name ) ); + echo '
    '; + + add_filter( 'wp_kses_allowed_html', [ 'WPSEO_Utils', 'extend_kses_post_with_forms' ] ); + add_filter( 'wp_kses_allowed_html', [ 'WPSEO_Utils', 'extend_kses_post_with_a11y' ] ); + foreach ( $this->collapsibles as $collapsible ) { + echo wp_kses_post( $collapsible->content() ); + } + remove_filter( 'wp_kses_allowed_html', [ 'WPSEO_Utils', 'extend_kses_post_with_forms' ] ); + remove_filter( 'wp_kses_allowed_html', [ 'WPSEO_Utils', 'extend_kses_post_with_a11y' ] ); + + echo '
    '; + } + } + + /** + * Checks whether the tab has any sections. + * + * @return bool Whether the tab has any sections + */ + protected function has_sections() { + return ! empty( $this->collapsibles ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-editor.php b/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-editor.php new file mode 100644 index 00000000..4d689177 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-editor.php @@ -0,0 +1,85 @@ +special_styles(); + $inside_editor = $styles['inside-editor']; + + $asset_location = new WPSEO_Admin_Asset_SEO_Location( WPSEO_FILE ); + $url = $asset_location->get_url( $inside_editor, WPSEO_Admin_Asset::TYPE_CSS ); + + if ( $css_files === '' ) { + $css_files = $url; + } + else { + $css_files .= ',' . $url; + } + + return $css_files; + } + + /** + * Enqueues the CSS to use in the TinyMCE editor. + * + * @return void + */ + public function add_editor_styles() { + $asset_manager = new WPSEO_Admin_Asset_Manager(); + $asset_manager->enqueue_style( 'inside-editor' ); + } + + /** + * Adds a custom element to the tinyMCE editor that we need for marking the content. + * + * @param array $tinymce_config The tinyMCE config as configured by WordPress. + * + * @return array The new tinyMCE config with our added custom elements. + */ + public function add_custom_element( $tinymce_config ) { + if ( ! empty( $tinymce_config['custom_elements'] ) ) { + $custom_elements = $tinymce_config['custom_elements']; + + $custom_elements .= ',~yoastmark'; + } + else { + $custom_elements = '~yoastmark'; + } + + $tinymce_config['custom_elements'] = $custom_elements; + + return $tinymce_config; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-form-tab.php b/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-form-tab.php new file mode 100644 index 00000000..df39f8b0 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-form-tab.php @@ -0,0 +1,135 @@ + '', + 'link_class' => '', + 'link_title' => '', + 'link_aria_label' => '', + 'single' => false, + ]; + + $options = array_merge( $default_options, $options ); + + $this->name = $name; + $this->content = $content; + $this->link_content = $link_content; + $this->tab_class = $options['tab_class']; + $this->link_class = $options['link_class']; + $this->link_title = $options['link_title']; + $this->link_aria_label = $options['link_aria_label']; + $this->single = $options['single']; + } + + /** + * Returns the html for the tab link. + * + * @return string + */ + public function link() { + + $html = '
  • %6$s
  • '; + + if ( $this->single ) { + $html = '
  • %6$s
  • '; + } + + return sprintf( + $html, + esc_attr( $this->name ), + ( $this->tab_class !== '' ) ? ' ' . esc_attr( $this->tab_class ) : '', + ( $this->link_class !== '' ) ? ' ' . esc_attr( $this->link_class ) : '', + ( $this->link_title !== '' ) ? ' title="' . esc_attr( $this->link_title ) . '"' : '', + ( $this->link_aria_label !== '' ) ? ' aria-label="' . esc_attr( $this->link_aria_label ) . '"' : '', + $this->link_content + ); + } + + /** + * Returns the html for the tab content. + * + * @return string + */ + public function content() { + return sprintf( + '
    %3$s
    ', + esc_attr( 'wpseo_' . $this->name ), + esc_attr( $this->name ), + $this->content + ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-null-tab.php b/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-null-tab.php new file mode 100644 index 00000000..1e31fd2b --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-null-tab.php @@ -0,0 +1,30 @@ +name = $name; + $this->content = $content; + $default_options = [ + 'link_class' => '', + 'link_aria_label' => '', + 'content_class' => 'wpseo-form', + ]; + $options = wp_parse_args( $options, $default_options ); + $this->link_content = $link_content; + $this->link_class = $options['link_class']; + $this->link_aria_label = $options['link_aria_label']; + $this->content_class = $options['content_class']; + } + + /** + * Outputs the section link. + * + * @return void + */ + public function display_link() { + printf( + '
  • %4$s
  • ', + esc_attr( $this->name ), + esc_attr( $this->link_class ), + ( $this->link_aria_label !== '' ) ? ' aria-label="' . esc_attr( $this->link_aria_label ) . '"' : '', + $this->link_content + ); + } + + /** + * Outputs the section content. + * + * @return void + */ + public function display_content() { + $html = sprintf( + '
    ', + esc_attr( $this->name ), + esc_attr( $this->content_class ) + ); + $html .= $this->content; + $html .= '
    '; + echo $html; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-section-inclusive-language.php b/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-section-inclusive-language.php new file mode 100644 index 00000000..1fddff4a --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-section-inclusive-language.php @@ -0,0 +1,46 @@ + +
    %2$s
    ', + esc_attr( $this->name ), + esc_html__( 'Inclusive language', 'wordpress-seo' ) + ); + } + + /** + * Outputs the section content. + * + * @return void + */ + public function display_content() { + printf( + '
    ', + esc_attr( $this->name ) + ); + echo '
    ', '
    '; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-section-react.php b/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-section-react.php new file mode 100644 index 00000000..70906599 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-section-react.php @@ -0,0 +1,118 @@ +name = $name; + $this->content = $content; + + $default_options = [ + 'link_class' => '', + 'link_aria_label' => '', + 'html_after' => '', + ]; + + $options = wp_parse_args( $options, $default_options ); + + $this->link_content = $link_content; + $this->link_class = $options['link_class']; + $this->link_aria_label = $options['link_aria_label']; + $this->html_after = $options['html_after']; + } + + /** + * Outputs the section link. + * + * @return void + */ + public function display_link() { + printf( + '
  • %4$s
  • ', + esc_attr( $this->name ), + esc_attr( $this->link_class ), + ( $this->link_aria_label !== '' ) ? ' aria-label="' . esc_attr( $this->link_aria_label ) . '"' : '', + wp_kses_post( $this->link_content ) + ); + } + + /** + * Outputs the section content. + * + * @return void + */ + public function display_content() { + add_filter( 'wp_kses_allowed_html', [ 'WPSEO_Utils', 'extend_kses_post_with_forms' ] ); + add_filter( 'wp_kses_allowed_html', [ 'WPSEO_Utils', 'extend_kses_post_with_a11y' ] ); + + printf( + '
    ', + esc_attr( $this->name ) + ); + echo wp_kses_post( $this->content ); + echo '
    '; + echo wp_kses_post( $this->html_after ); + echo '
    '; + + remove_filter( 'wp_kses_allowed_html', [ 'WPSEO_Utils', 'extend_kses_post_with_forms' ] ); + remove_filter( 'wp_kses_allowed_html', [ 'WPSEO_Utils', 'extend_kses_post_with_a11y' ] ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-section-readability.php b/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-section-readability.php new file mode 100644 index 00000000..cbfea907 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-section-readability.php @@ -0,0 +1,46 @@ + +
    %2$s
    ', + esc_attr( $this->name ), + esc_html__( 'Readability', 'wordpress-seo' ) + ); + } + + /** + * Outputs the section content. + * + * @return void + */ + public function display_content() { + printf( + '
    ', + esc_attr( $this->name ) + ); + echo '
    ', '
    '; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox.php b/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox.php new file mode 100644 index 00000000..6eb3deeb --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox.php @@ -0,0 +1,1215 @@ +is_internet_explorer() ) { + add_action( 'add_meta_boxes', [ $this, 'internet_explorer_metabox' ] ); + + return; + } + + add_action( 'add_meta_boxes', [ $this, 'add_meta_box' ] ); + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue' ] ); + add_action( 'wp_insert_post', [ $this, 'save_postdata' ] ); + add_action( 'edit_attachment', [ $this, 'save_postdata' ] ); + add_action( 'add_attachment', [ $this, 'save_postdata' ] ); + add_action( 'admin_init', [ $this, 'translate_meta_boxes' ] ); + + $this->editor = new WPSEO_Metabox_Editor(); + $this->editor->register_hooks(); + + $this->social_is_enabled = WPSEO_Options::get( 'opengraph', false ) || WPSEO_Options::get( 'twitter', false ); + $this->is_advanced_metadata_enabled = WPSEO_Capability_Utils::current_user_can( 'wpseo_edit_advanced_metadata' ) || WPSEO_Options::get( 'disableadvanced_meta' ) === false; + + $this->seo_analysis = new WPSEO_Metabox_Analysis_SEO(); + $this->readability_analysis = new WPSEO_Metabox_Analysis_Readability(); + $this->inclusive_language_analysis = new WPSEO_Metabox_Analysis_Inclusive_Language(); + } + + /** + * Checks whether the request comes from an IE 11 browser. + * + * @return bool Whether the request comes from an IE 11 browser. + */ + public static function is_internet_explorer() { + if ( empty( $_SERVER['HTTP_USER_AGENT'] ) ) { + return false; + } + + $user_agent = sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) ); + + if ( stripos( $user_agent, 'Trident/7.0' ) === false ) { + return false; + } + + return true; + } + + /** + * Adds an alternative metabox for internet explorer users. + * + * @return void + */ + public function internet_explorer_metabox() { + $post_types = WPSEO_Post_Type::get_accessible_post_types(); + $post_types = array_filter( $post_types, [ $this, 'display_metabox' ] ); + + if ( ! is_array( $post_types ) || $post_types === [] ) { + return; + } + + $product_title = $this->get_product_title(); + + foreach ( $post_types as $post_type ) { + add_filter( "postbox_classes_{$post_type}_wpseo_meta", [ $this, 'wpseo_metabox_class' ] ); + + add_meta_box( + 'wpseo_meta', + $product_title, + [ $this, 'render_internet_explorer_notice' ], + $post_type, + 'normal', + apply_filters( 'wpseo_metabox_prio', 'high' ), + [ '__block_editor_compatible_meta_box' => true ] + ); + } + } + + /** + * Renders the content for the internet explorer metabox. + * + * @return void + */ + public function render_internet_explorer_notice() { + $content = sprintf( + /* translators: 1: Link start tag to the Firefox website, 2: Link start tag to the Chrome website, 3: Link start tag to the Edge website, 4: Link closing tag. */ + esc_html__( 'The browser you are currently using is unfortunately rather dated. Since we strive to give you the best experience possible, we no longer support this browser. Instead, please use %1$sFirefox%4$s, %2$sChrome%4$s or %3$sMicrosoft Edge%4$s.', 'wordpress-seo' ), + '', + '', + '', + '' + ); + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped above. + echo new Alert_Presenter( $content ); + } + + /** + * Translates text strings for use in the meta box. + * + * IMPORTANT: if you want to add a new string (option) somewhere, make sure you add that array key to + * the main meta box definition array in the class WPSEO_Meta() as well!!!! + * + * @return void + */ + public static function translate_meta_boxes() { + WPSEO_Meta::$meta_fields['general']['title']['title'] = __( 'SEO title', 'wordpress-seo' ); + WPSEO_Meta::$meta_fields['general']['metadesc']['title'] = __( 'Meta description', 'wordpress-seo' ); + + /* translators: %s expands to the post type name. */ + WPSEO_Meta::$meta_fields['advanced']['meta-robots-noindex']['title'] = __( 'Allow search engines to show this %s in search results?', 'wordpress-seo' ); + if ( (string) get_option( 'blog_public' ) === '0' ) { + WPSEO_Meta::$meta_fields['advanced']['meta-robots-noindex']['description'] = '' . __( 'Warning: even though you can set the meta robots setting here, the entire site is set to noindex in the sitewide privacy settings, so these settings won\'t have an effect.', 'wordpress-seo' ) . ''; + } + /* translators: %1$s expands to Yes or No, %2$s expands to the post type name.*/ + WPSEO_Meta::$meta_fields['advanced']['meta-robots-noindex']['options']['0'] = __( 'Default for %2$s, currently: %1$s', 'wordpress-seo' ); + WPSEO_Meta::$meta_fields['advanced']['meta-robots-noindex']['options']['2'] = __( 'Yes', 'wordpress-seo' ); + WPSEO_Meta::$meta_fields['advanced']['meta-robots-noindex']['options']['1'] = __( 'No', 'wordpress-seo' ); + + /* translators: %1$s expands to the post type name.*/ + WPSEO_Meta::$meta_fields['advanced']['meta-robots-nofollow']['title'] = __( 'Should search engines follow links on this %1$s?', 'wordpress-seo' ); + WPSEO_Meta::$meta_fields['advanced']['meta-robots-nofollow']['options']['0'] = __( 'Yes', 'wordpress-seo' ); + WPSEO_Meta::$meta_fields['advanced']['meta-robots-nofollow']['options']['1'] = __( 'No', 'wordpress-seo' ); + + WPSEO_Meta::$meta_fields['advanced']['meta-robots-adv']['title'] = __( 'Meta robots advanced', 'wordpress-seo' ); + WPSEO_Meta::$meta_fields['advanced']['meta-robots-adv']['description'] = __( 'If you want to apply advanced meta robots settings for this page, please define them in the following field.', 'wordpress-seo' ); + WPSEO_Meta::$meta_fields['advanced']['meta-robots-adv']['options']['noimageindex'] = __( 'No Image Index', 'wordpress-seo' ); + WPSEO_Meta::$meta_fields['advanced']['meta-robots-adv']['options']['noarchive'] = __( 'No Archive', 'wordpress-seo' ); + WPSEO_Meta::$meta_fields['advanced']['meta-robots-adv']['options']['nosnippet'] = __( 'No Snippet', 'wordpress-seo' ); + + WPSEO_Meta::$meta_fields['advanced']['bctitle']['title'] = __( 'Breadcrumbs Title', 'wordpress-seo' ); + WPSEO_Meta::$meta_fields['advanced']['bctitle']['description'] = __( 'Title to use for this page in breadcrumb paths', 'wordpress-seo' ); + + WPSEO_Meta::$meta_fields['advanced']['canonical']['title'] = __( 'Canonical URL', 'wordpress-seo' ); + + WPSEO_Meta::$meta_fields['advanced']['canonical']['description'] = sprintf( + /* translators: 1: link open tag; 2: link close tag. */ + __( 'The canonical URL that this page should point to. Leave empty to default to permalink. %1$sCross domain canonical%2$s supported too.', 'wordpress-seo' ), + '', + WPSEO_Admin_Utils::get_new_tab_message() . '' + ); + + WPSEO_Meta::$meta_fields['advanced']['redirect']['title'] = __( '301 Redirect', 'wordpress-seo' ); + WPSEO_Meta::$meta_fields['advanced']['redirect']['description'] = __( 'The URL that this page should redirect to.', 'wordpress-seo' ); + + do_action( 'wpseo_tab_translate' ); + } + + /** + * Determines whether the metabox should be shown for the passed identifier. + * + * By default the check is done for post types, but can also be used for taxonomies. + * + * @param string|null $identifier The identifier to check. + * @param string $type The type of object to check. Defaults to post_type. + * + * @return bool Whether or not the metabox should be displayed. + */ + public function display_metabox( $identifier = null, $type = 'post_type' ) { + return WPSEO_Utils::is_metabox_active( $identifier, $type ); + } + + /** + * Adds the Yoast SEO meta box to the edit boxes in the edit post, page, + * attachment, and custom post types pages. + * + * @return void + */ + public function add_meta_box() { + $post_types = WPSEO_Post_Type::get_accessible_post_types(); + $post_types = array_filter( $post_types, [ $this, 'display_metabox' ] ); + + if ( ! is_array( $post_types ) || $post_types === [] ) { + return; + } + + $product_title = $this->get_product_title(); + + foreach ( $post_types as $post_type ) { + add_filter( "postbox_classes_{$post_type}_wpseo_meta", [ $this, 'wpseo_metabox_class' ] ); + + add_meta_box( + 'wpseo_meta', + $product_title, + [ $this, 'meta_box' ], + $post_type, + 'normal', + apply_filters( 'wpseo_metabox_prio', 'high' ), + [ '__block_editor_compatible_meta_box' => true ] + ); + } + } + + /** + * Adds CSS classes to the meta box. + * + * @param string[] $classes An array of postbox CSS classes. + * + * @return string[] List of classes that will be applied to the editbox container. + */ + public function wpseo_metabox_class( $classes ) { + $classes[] = 'yoast wpseo-metabox'; + + return $classes; + } + + /** + * Passes variables to js for use with the post-scraper. + * + * @return array|bool|int> + */ + public function get_metabox_script_data() { + $permalink = $this->get_permalink(); + + $post_formatter = new WPSEO_Metabox_Formatter( + new WPSEO_Post_Metabox_Formatter( $this->get_metabox_post(), [], $permalink ) + ); + + $values = $post_formatter->get_values(); + /** This filter is documented in admin/filters/class-cornerstone-filter.php. */ + $post_types = apply_filters( 'wpseo_cornerstone_post_types', WPSEO_Post_Type::get_accessible_post_types() ); + if ( $values['cornerstoneActive'] && ! in_array( $this->get_metabox_post()->post_type, $post_types, true ) ) { + $values['cornerstoneActive'] = false; + } + + if ( $values['semrushIntegrationActive'] && $this->post->post_type === 'attachment' ) { + $values['semrushIntegrationActive'] = 0; + } + + if ( $values['wincherIntegrationActive'] && $this->post->post_type === 'attachment' ) { + $values['wincherIntegrationActive'] = 0; + } + + return $values; + } + + /** + * Determines whether or not the current post type has registered taxonomies. + * + * @return bool Whether the current post type has taxonomies. + */ + private function current_post_type_has_taxonomies() { + $post_taxonomies = get_object_taxonomies( get_post_type() ); + + return ! empty( $post_taxonomies ); + } + + /** + * Determines the scope based on the post type. + * This can be used by the replacevar plugin to determine if a replacement needs to be executed. + * + * @return string String describing the current scope. + */ + private function determine_scope() { + if ( $this->get_metabox_post()->post_type === 'page' ) { + return 'page'; + } + + return 'post'; + } + + /** + * Outputs the meta box. + * + * @return void + */ + public function meta_box() { + $this->render_hidden_fields(); + $this->render_tabs(); + } + + /** + * Renders the metabox hidden fields. + * + * @return void + */ + protected function render_hidden_fields() { + wp_nonce_field( 'yoast_free_metabox', 'yoast_free_metabox_nonce' ); + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in class. + echo new Meta_Fields_Presenter( $this->get_metabox_post(), 'general' ); + + if ( $this->is_advanced_metadata_enabled ) { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in class. + echo new Meta_Fields_Presenter( $this->get_metabox_post(), 'advanced' ); + } + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in class. + echo new Meta_Fields_Presenter( $this->get_metabox_post(), 'schema', $this->get_metabox_post()->post_type ); + + if ( $this->social_is_enabled ) { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in class. + echo new Meta_Fields_Presenter( $this->get_metabox_post(), 'social' ); + } + + /** + * Filter: 'wpseo_content_meta_section_content' - Allow filtering the metabox content before outputting. + * + * @param string $post_content The metabox content string. + */ + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output should be escaped in the filter. + echo apply_filters( 'wpseo_content_meta_section_content', '' ); + } + + /** + * Renders the metabox tabs. + * + * @return void + */ + protected function render_tabs() { + echo '
    '; + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: $this->get_product_title() returns a hard-coded string. + printf( '
      ', $this->get_product_title() ); + + $tabs = $this->get_tabs(); + + foreach ( $tabs as $tab ) { + if ( $tab->name === 'premium' ) { + continue; + } + + $tab->display_link(); + } + + echo '
    '; + + foreach ( $tabs as $tab ) { + $tab->display_content(); + } + + echo '
    '; + } + + /** + * Returns the relevant metabox tabs for the current view. + * + * @return WPSEO_Metabox_Section[] + */ + private function get_tabs() { + $tabs = []; + + $label = __( 'SEO', 'wordpress-seo' ); + if ( $this->seo_analysis->is_enabled() ) { + $label = '' . $label; + } + $tabs[] = new WPSEO_Metabox_Section_React( 'content', $label ); + + if ( $this->readability_analysis->is_enabled() ) { + $tabs[] = new WPSEO_Metabox_Section_Readability(); + } + + if ( $this->inclusive_language_analysis->is_enabled() ) { + $tabs[] = new WPSEO_Metabox_Section_Inclusive_Language(); + } + + if ( $this->is_advanced_metadata_enabled ) { + $tabs[] = new WPSEO_Metabox_Section_React( + 'schema', + '' . __( 'Schema', 'wordpress-seo' ), + '' + ); + } + + if ( $this->social_is_enabled ) { + $tabs[] = new WPSEO_Metabox_Section_React( + 'social', + '' . __( 'Social', 'wordpress-seo' ), + '', + [ + 'html_after' => '
    ', + ] + ); + } + + $tabs = array_merge( $tabs, $this->get_additional_tabs() ); + + return $tabs; + } + + /** + * Returns the metabox tabs that have been added by other plugins. + * + * @return WPSEO_Metabox_Section_Additional[] + */ + protected function get_additional_tabs() { + $tabs = []; + + /** + * Private filter: 'yoast_free_additional_metabox_sections'. + * + * Meant for internal use only. Allows adding additional tabs to the Yoast SEO metabox. + * + * @since 11.9 + * + * @param array[] $tabs { + * An array of arrays with tab specifications. + * + * @type array $tab { + * A tab specification. + * + * @type string $name The name of the tab. Used in the HTML IDs, href and aria properties. + * @type string $link_content The content of the tab link. + * @type string $content The content of the tab. + * @type array $options { + * Optional. Extra options. + * + * @type string $link_class Optional. The class for the tab link. + * @type string $link_aria_label Optional. The aria label of the tab link. + * } + * } + * } + */ + $requested_tabs = apply_filters( 'yoast_free_additional_metabox_sections', [] ); + + foreach ( $requested_tabs as $tab ) { + if ( is_array( $tab ) && array_key_exists( 'name', $tab ) && array_key_exists( 'link_content', $tab ) && array_key_exists( 'content', $tab ) ) { + $options = array_key_exists( 'options', $tab ) ? $tab['options'] : []; + $tabs[] = new WPSEO_Metabox_Section_Additional( + $tab['name'], + $tab['link_content'], + $tab['content'], + $options + ); + } + } + + return $tabs; + } + + /** + * Adds a line in the meta box. + * + * @todo [JRF] Check if $class is added appropriately everywhere. + * + * @param string[] $meta_field_def Contains the vars based on which output is generated. + * @param string $key Internal key (without prefix). + * + * @return string + */ + public function do_meta_box( $meta_field_def, $key = '' ) { + $content = ''; + $esc_form_key = esc_attr( WPSEO_Meta::$form_prefix . $key ); + $meta_value = WPSEO_Meta::get_value( $key, $this->get_metabox_post()->ID ); + + $class = ''; + if ( isset( $meta_field_def['class'] ) && $meta_field_def['class'] !== '' ) { + $class = ' ' . $meta_field_def['class']; + } + + $placeholder = ''; + if ( isset( $meta_field_def['placeholder'] ) && $meta_field_def['placeholder'] !== '' ) { + $placeholder = $meta_field_def['placeholder']; + } + + $aria_describedby = ''; + $description = ''; + if ( isset( $meta_field_def['description'] ) ) { + $aria_describedby = ' aria-describedby="' . $esc_form_key . '-desc"'; + $description = '

    ' . $meta_field_def['description'] . '

    '; + } + + // Add a hide_on_pages option that returns nothing when the field is rendered on a page. + if ( isset( $meta_field_def['hide_on_pages'] ) && $meta_field_def['hide_on_pages'] && get_post_type() === 'page' ) { + return ''; + } + + switch ( $meta_field_def['type'] ) { + case 'text': + $ac = ''; + if ( isset( $meta_field_def['autocomplete'] ) && $meta_field_def['autocomplete'] === false ) { + $ac = 'autocomplete="off" '; + } + if ( $placeholder !== '' ) { + $placeholder = ' placeholder="' . esc_attr( $placeholder ) . '"'; + } + $content .= ''; + break; + + case 'url': + if ( $placeholder !== '' ) { + $placeholder = ' placeholder="' . esc_attr( $placeholder ) . '"'; + } + $content .= ''; + break; + + case 'textarea': + $rows = 3; + if ( isset( $meta_field_def['rows'] ) && $meta_field_def['rows'] > 0 ) { + $rows = $meta_field_def['rows']; + } + $content .= ''; + break; + + case 'hidden': + $default = ''; + if ( isset( $meta_field_def['default'] ) ) { + $default = sprintf( ' data-default="%s"', esc_attr( $meta_field_def['default'] ) ); + } + $content .= '' . "\n"; + break; + case 'select': + if ( isset( $meta_field_def['options'] ) && is_array( $meta_field_def['options'] ) && $meta_field_def['options'] !== [] ) { + $content .= ''; + } + break; + + case 'multiselect': + if ( isset( $meta_field_def['options'] ) && is_array( $meta_field_def['options'] ) && $meta_field_def['options'] !== [] ) { + + // Set $meta_value as $selected_arr. + $selected_arr = $meta_value; + + // If the multiselect field is 'meta-robots-adv' we should explode on ,. + if ( $key === 'meta-robots-adv' ) { + $selected_arr = explode( ',', $meta_value ); + } + + if ( ! is_array( $selected_arr ) ) { + $selected_arr = (array) $selected_arr; + } + + $options_count = count( $meta_field_def['options'] ); + + $content .= ''; + unset( $val, $option, $selected, $selected_arr, $options_count ); + } + break; + + case 'checkbox': + $checked = checked( $meta_value, 'on', false ); + $expl = ( isset( $meta_field_def['expl'] ) ) ? esc_html( $meta_field_def['expl'] ) : ''; + $content .= ' '; + unset( $checked, $expl ); + break; + + case 'radio': + if ( isset( $meta_field_def['options'] ) && is_array( $meta_field_def['options'] ) && $meta_field_def['options'] !== [] ) { + foreach ( $meta_field_def['options'] as $val => $option ) { + $checked = checked( $meta_value, $val, false ); + $content .= ' '; + } + unset( $val, $option, $checked ); + } + break; + + case 'upload': + $content .= ' '; + $content .= ' '; + $content .= ''; + break; + } + + $html = ''; + if ( $content === '' ) { + $content = apply_filters( 'wpseo_do_meta_box_field_' . $key, $content, $meta_value, $esc_form_key, $meta_field_def, $key ); + } + + if ( $content !== '' ) { + + $title = esc_html( $meta_field_def['title'] ); + + // By default, use the field title as a label element. + $label = ''; + + // Set the inline help and help panel, if any. + $help_button = ''; + $help_panel = ''; + if ( isset( $meta_field_def['help'] ) && $meta_field_def['help'] !== '' ) { + $help = new WPSEO_Admin_Help_Panel( $key, $meta_field_def['help-button'], $meta_field_def['help'] ); + $help_button = $help->get_button_html(); + $help_panel = $help->get_panel_html(); + } + + // If it's a set of radio buttons, output proper fieldset and legend. + if ( $meta_field_def['type'] === 'radio' ) { + return '
    ' . $title . '' . $help_button . $help_panel . $content . $description . '
    '; + } + + // If it's a single checkbox, ignore the title. + if ( $meta_field_def['type'] === 'checkbox' ) { + $label = ''; + } + + // Other meta box content or form fields. + if ( $meta_field_def['type'] === 'hidden' ) { + $html = $content; + } + else { + $html = $label . $description . $help_button . $help_panel . $content; + } + } + + return $html; + } + + /** + * Saves the WP SEO metadata for posts. + * + * {@internal $_POST parameters are validated via sanitize_post_meta().}} + * + * @param int $post_id Post ID. + * + * @return bool|void Boolean false if invalid save post request. + */ + public function save_postdata( $post_id ) { + // Bail if this is a multisite installation and the site has been switched. + if ( is_multisite() && ms_is_switched() ) { + return false; + } + + if ( $post_id === null ) { + return false; + } + + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized in wp_verify_none. + if ( ! isset( $_POST['yoast_free_metabox_nonce'] ) || ! wp_verify_nonce( wp_unslash( $_POST['yoast_free_metabox_nonce'] ), 'yoast_free_metabox' ) ) { + return false; + } + + if ( wp_is_post_revision( $post_id ) ) { + $post_id = wp_is_post_revision( $post_id ); + } + + /** + * Determine we're not accidentally updating a different post. + * We can't use filter_input here as the ID isn't available at this point, other than in the $_POST data. + */ + if ( ! isset( $_POST['ID'] ) || $post_id !== (int) $_POST['ID'] ) { + return false; + } + + clean_post_cache( $post_id ); + $post = get_post( $post_id ); + + if ( ! is_object( $post ) ) { + // Non-existent post. + return false; + } + + do_action( 'wpseo_save_compare_data', $post ); + + $social_fields = []; + if ( $this->social_is_enabled ) { + $social_fields = WPSEO_Meta::get_meta_field_defs( 'social' ); + } + + $meta_boxes = apply_filters( 'wpseo_save_metaboxes', [] ); + $meta_boxes = array_merge( + $meta_boxes, + WPSEO_Meta::get_meta_field_defs( 'general', $post->post_type ), + WPSEO_Meta::get_meta_field_defs( 'advanced' ), + $social_fields, + WPSEO_Meta::get_meta_field_defs( 'schema', $post->post_type ) + ); + + foreach ( $meta_boxes as $key => $meta_box ) { + + // If analysis is disabled remove that analysis score value from the DB. + if ( $this->is_meta_value_disabled( $key ) ) { + WPSEO_Meta::delete( $key, $post_id ); + continue; + } + + $data = null; + $field_name = WPSEO_Meta::$form_prefix . $key; + + if ( $meta_box['type'] === 'checkbox' ) { + $data = isset( $_POST[ $field_name ] ) ? 'on' : 'off'; + } + else { + if ( isset( $_POST[ $field_name ] ) ) { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- We're preparing to do just that. + $data = wp_unslash( $_POST[ $field_name ] ); + + // For multi-select. + if ( is_array( $data ) ) { + $data = array_map( [ 'WPSEO_Utils', 'sanitize_text_field' ], $data ); + } + + if ( is_string( $data ) ) { + $data = ( $key !== 'canonical' ) ? WPSEO_Utils::sanitize_text_field( $data ) : WPSEO_Utils::sanitize_url( $data ); + } + } + + // Reset options when no entry is present with multiselect - only applies to `meta-robots-adv` currently. + if ( ! isset( $_POST[ $field_name ] ) && ( $meta_box['type'] === 'multiselect' ) ) { + $data = []; + } + } + + if ( $data !== null ) { + WPSEO_Meta::set_value( $key, $data, $post_id ); + } + } + + do_action( 'wpseo_saved_postdata' ); + } + + /** + * Determines if the given meta value key is disabled. + * + * @param string $key The key of the meta value. + * + * @return bool Whether the given meta value key is disabled. + */ + public function is_meta_value_disabled( $key ) { + if ( $key === 'linkdex' && ! $this->seo_analysis->is_enabled() ) { + return true; + } + + if ( $key === 'content_score' && ! $this->readability_analysis->is_enabled() ) { + return true; + } + + if ( $key === 'inclusive_language_score' && ! $this->inclusive_language_analysis->is_enabled() ) { + return true; + } + + return false; + } + + /** + * Enqueues all the needed JS and CSS. + * + * @todo [JRF => whomever] Create css/metabox-mp6.css file and add it to the below allowed colors array when done. + * + * @return void + */ + public function enqueue() { + global $pagenow; + + $asset_manager = new WPSEO_Admin_Asset_Manager(); + + $is_editor = self::is_post_overview( $pagenow ) || self::is_post_edit( $pagenow ); + + if ( self::is_post_overview( $pagenow ) ) { + $asset_manager->enqueue_style( 'edit-page' ); + $asset_manager->enqueue_script( 'edit-page' ); + + return; + } + + /* Filter 'wpseo_always_register_metaboxes_on_admin' documented in wpseo-main.php */ + if ( ( $is_editor === false && apply_filters( 'wpseo_always_register_metaboxes_on_admin', false ) === false ) || $this->display_metabox() === false ) { + return; + } + + $post_id = get_queried_object_id(); + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + if ( empty( $post_id ) && isset( $_GET['post'] ) && is_string( $_GET['post'] ) ) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + $post_id = sanitize_text_field( wp_unslash( $_GET['post'] ) ); + } + + if ( $post_id !== 0 ) { + // Enqueue files needed for upload functionality. + wp_enqueue_media( [ 'post' => $post_id ] ); + } + + $asset_manager->enqueue_style( 'metabox-css' ); + $asset_manager->enqueue_style( 'scoring' ); + $asset_manager->enqueue_style( 'monorepo' ); + $asset_manager->enqueue_style( 'ai-generator' ); + $asset_manager->enqueue_style( 'ai-fix-assessments' ); + + $is_block_editor = WP_Screen::get()->is_block_editor(); + $post_edit_handle = 'post-edit'; + if ( ! $is_block_editor ) { + $post_edit_handle = 'post-edit-classic'; + } + $asset_manager->enqueue_script( $post_edit_handle ); + $asset_manager->enqueue_style( 'admin-css' ); + + /** + * Removes the emoji script as it is incompatible with both React and any + * contenteditable fields. + */ + remove_action( 'admin_print_scripts', 'print_emoji_detection_script' ); + + $asset_manager->localize_script( $post_edit_handle, 'wpseoAdminL10n', WPSEO_Utils::get_admin_l10n() ); + + $plugins_script_data = [ + 'replaceVars' => [ + 'no_parent_text' => __( '(no parent)', 'wordpress-seo' ), + 'replace_vars' => $this->get_replace_vars(), + 'hidden_replace_vars' => $this->get_hidden_replace_vars(), + 'recommended_replace_vars' => $this->get_recommended_replace_vars(), + 'scope' => $this->determine_scope(), + 'has_taxonomies' => $this->current_post_type_has_taxonomies(), + ], + 'shortcodes' => [ + 'wpseo_shortcode_tags' => $this->get_valid_shortcode_tags(), + 'wpseo_filter_shortcodes_nonce' => wp_create_nonce( 'wpseo-filter-shortcodes' ), + ], + ]; + + $worker_script_data = [ + 'url' => YoastSEO()->helpers->asset->get_asset_url( 'yoast-seo-analysis-worker' ), + 'dependencies' => YoastSEO()->helpers->asset->get_dependency_urls_by_handle( 'yoast-seo-analysis-worker' ), + 'keywords_assessment_url' => YoastSEO()->helpers->asset->get_asset_url( 'yoast-seo-used-keywords-assessment' ), + 'log_level' => WPSEO_Utils::get_analysis_worker_log_level(), + ]; + + $woocommerce_conditional = new WooCommerce_Conditional(); + $woocommerce_active = $woocommerce_conditional->is_met(); + $wpseo_plugin_availability_checker = new WPSEO_Plugin_Availability(); + $woocommerce_seo_file = 'wpseo-woocommerce/wpseo-woocommerce.php'; + $woocommerce_seo_active = $wpseo_plugin_availability_checker->is_active( $woocommerce_seo_file ); + + $script_data = [ + // @todo replace this translation with JavaScript translations. + 'media' => [ 'choose_image' => __( 'Use Image', 'wordpress-seo' ) ], + 'metabox' => $this->get_metabox_script_data(), + 'userLanguageCode' => WPSEO_Language_Utils::get_language( get_user_locale() ), + 'isPost' => true, + 'isBlockEditor' => $is_block_editor, + 'postId' => $post_id, + 'postStatus' => get_post_status( $post_id ), + 'postType' => get_post_type( $post_id ), + 'usedKeywordsNonce' => wp_create_nonce( 'wpseo-keyword-usage-and-post-types' ), + 'analysis' => [ + 'plugins' => $plugins_script_data, + 'worker' => $worker_script_data, + ], + 'isJetpackBoostActive' => ( $is_block_editor ) ? YoastSEO()->classes->get( Jetpack_Boost_Active_Conditional::class )->is_met() : false, + 'isJetpackBoostNotPremium' => ( $is_block_editor ) ? YoastSEO()->classes->get( Jetpack_Boost_Not_Premium_Conditional::class )->is_met() : false, + 'isWooCommerceSeoActive' => $woocommerce_seo_active, + 'isWooCommerceActive' => $woocommerce_active, + 'woocommerceUpsell' => get_post_type( $post_id ) === 'product' && ! $woocommerce_seo_active && $woocommerce_active, + ]; + + /** + * The website information repository. + * + * @var $repo Website_Information_Repository + */ + $repo = YoastSEO()->classes->get( Website_Information_Repository::class ); + $site_information = $repo->get_post_site_information(); + $site_information->set_permalink( $this->get_permalink() ); + $script_data = array_merge_recursive( $site_information->get_legacy_site_information(), $script_data ); + + if ( post_type_supports( get_post_type(), 'thumbnail' ) ) { + $asset_manager->enqueue_style( 'featured-image' ); + + // @todo replace this translation with JavaScript translations. + $script_data['featuredImage'] = [ + 'featured_image_notice' => __( 'SEO issue: The featured image should be at least 200 by 200 pixels to be picked up by Facebook and other social media sites.', 'wordpress-seo' ), + ]; + } + + $asset_manager->localize_script( $post_edit_handle, 'wpseoScriptData', $script_data ); + $asset_manager->enqueue_user_language_script(); + } + + /** + * Returns post in metabox context. + * + * @return WP_Post|array + */ + protected function get_metabox_post() { + if ( $this->post !== null ) { + return $this->post; + } + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + if ( isset( $_GET['post'] ) && is_string( $_GET['post'] ) ) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information, Sanitization happens in the validate_int function. + $post_id = (int) WPSEO_Utils::validate_int( wp_unslash( $_GET['post'] ) ); + + $this->post = get_post( $post_id ); + + return $this->post; + } + + if ( isset( $GLOBALS['post'] ) ) { + $this->post = $GLOBALS['post']; + + return $this->post; + } + + return []; + } + + /** + * Returns an array with shortcode tags for all registered shortcodes. + * + * @return string[] + */ + private function get_valid_shortcode_tags() { + $shortcode_tags = []; + + foreach ( $GLOBALS['shortcode_tags'] as $tag => $description ) { + $shortcode_tags[] = $tag; + } + + return $shortcode_tags; + } + + /** + * Prepares the replace vars for localization. + * + * @return string[] Replace vars. + */ + private function get_replace_vars() { + $cached_replacement_vars = []; + + $vars_to_cache = [ + 'date', + 'id', + 'sitename', + 'sitedesc', + 'sep', + 'page', + 'currentdate', + 'currentyear', + 'currentmonth', + 'currentday', + 'post_year', + 'post_month', + 'post_day', + 'name', + 'author_first_name', + 'author_last_name', + 'permalink', + 'post_content', + 'category_title', + 'tag', + 'category', + ]; + + foreach ( $vars_to_cache as $var ) { + $cached_replacement_vars[ $var ] = wpseo_replace_vars( '%%' . $var . '%%', $this->get_metabox_post() ); + } + + // Merge custom replace variables with the WordPress ones. + return array_merge( $cached_replacement_vars, $this->get_custom_replace_vars( $this->get_metabox_post() ) ); + } + + /** + * Returns the list of replace vars that should be hidden inside the editor. + * + * @return string[] The hidden replace vars. + */ + protected function get_hidden_replace_vars() { + return ( new WPSEO_Replace_Vars() )->get_hidden_replace_vars(); + } + + /** + * Prepares the recommended replace vars for localization. + * + * @return array Recommended replacement variables. + */ + private function get_recommended_replace_vars() { + $recommended_replace_vars = new WPSEO_Admin_Recommended_Replace_Vars(); + + // What is recommended depends on the current context. + $post_type = $recommended_replace_vars->determine_for_post( $this->get_metabox_post() ); + + return $recommended_replace_vars->get_recommended_replacevars_for( $post_type ); + } + + /** + * Gets the custom replace variables for custom taxonomies and fields. + * + * @param WP_Post $post The post to check for custom taxonomies and fields. + * + * @return array Array containing all the replacement variables. + */ + private function get_custom_replace_vars( $post ) { + return [ + 'custom_fields' => $this->get_custom_fields_replace_vars( $post ), + 'custom_taxonomies' => $this->get_custom_taxonomies_replace_vars( $post ), + ]; + } + + /** + * Gets the custom replace variables for custom taxonomies. + * + * @param WP_Post $post The post to check for custom taxonomies. + * + * @return array Array containing all the replacement variables. + */ + private function get_custom_taxonomies_replace_vars( $post ) { + $taxonomies = get_object_taxonomies( $post, 'objects' ); + $custom_replace_vars = []; + + foreach ( $taxonomies as $taxonomy_name => $taxonomy ) { + + if ( is_string( $taxonomy ) ) { // If attachment, see https://core.trac.wordpress.org/ticket/37368 . + $taxonomy_name = $taxonomy; + $taxonomy = get_taxonomy( $taxonomy_name ); + } + + if ( $taxonomy->_builtin && $taxonomy->public ) { + continue; + } + + $custom_replace_vars[ $taxonomy_name ] = [ + 'name' => $taxonomy->name, + 'description' => $taxonomy->description, + ]; + } + + return $custom_replace_vars; + } + + /** + * Gets the custom replace variables for custom fields. + * + * @param WP_Post $post The post to check for custom fields. + * + * @return array Array containing all the replacement variables. + */ + private function get_custom_fields_replace_vars( $post ) { + $custom_replace_vars = []; + + // If no post object is passed, return the empty custom_replace_vars array. + if ( ! is_object( $post ) ) { + return $custom_replace_vars; + } + + $custom_fields = get_post_custom( $post->ID ); + + // If $custom_fields is an empty string or generally not an array, return early. + if ( ! is_array( $custom_fields ) ) { + return $custom_replace_vars; + } + + $meta = YoastSEO()->meta->for_post( $post->ID ); + + if ( ! $meta ) { + return $custom_replace_vars; + } + + // Simply concatenate all fields containing replace vars so we can handle them all with a single regex find. + $replace_vars_fields = implode( + ' ', + [ + $meta->presentation->title, + $meta->presentation->meta_description, + ] + ); + + preg_match_all( '/%%cf_([A-Za-z0-9_]+)%%/', $replace_vars_fields, $matches ); + $fields_to_include = $matches[1]; + foreach ( $custom_fields as $custom_field_name => $custom_field ) { + // Skip private custom fields. + if ( substr( $custom_field_name, 0, 1 ) === '_' ) { + continue; + } + + // Skip custom fields that are not used, new ones will be fetched dynamically. + if ( ! in_array( $custom_field_name, $fields_to_include, true ) ) { + continue; + } + + // Skip custom field values that are serialized. + if ( is_serialized( $custom_field[0] ) ) { + continue; + } + + $custom_replace_vars[ $custom_field_name ] = $custom_field[0]; + } + + return $custom_replace_vars; + } + + /** + * Checks if the page is the post overview page. + * + * @param string $page The page to check for the post overview page. + * + * @return bool Whether or not the given page is the post overview page. + */ + public static function is_post_overview( $page ) { + return $page === 'edit.php'; + } + + /** + * Checks if the page is the post edit page. + * + * @param string $page The page to check for the post edit page. + * + * @return bool Whether or not the given page is the post edit page. + */ + public static function is_post_edit( $page ) { + return $page === 'post.php' + || $page === 'post-new.php'; + } + + /** + * Retrieves the product title. + * + * @return string The product title. + */ + protected function get_product_title() { + return YoastSEO()->helpers->product->get_product_name(); + } + + /** + * Gets the permalink. + * + * @return string + */ + protected function get_permalink() { + $permalink = ''; + + if ( is_object( $this->get_metabox_post() ) ) { + $permalink = get_sample_permalink( $this->get_metabox_post()->ID ); + $permalink = $permalink[0]; + } + + return $permalink; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/metabox/interface-metabox-analysis.php b/wp-content/plugins/wordpress-seo/admin/metabox/interface-metabox-analysis.php new file mode 100644 index 00000000..756ca97d --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/metabox/interface-metabox-analysis.php @@ -0,0 +1,33 @@ +get_listener_value() !== $this->notification_identifier ) { + return; + } + + $this->dismiss(); + } + + /** + * Adds the notification if applicable, otherwise removes it. + * + * @param Yoast_Notification_Center $notification_center The notification center object. + * + * @return void + */ + public function handle( Yoast_Notification_Center $notification_center ) { + if ( $this->is_applicable() ) { + $notification = $this->get_notification(); + $notification_center->add_notification( $notification ); + + return; + } + + $notification_center->remove_notification_by_id( 'wpseo-' . $this->notification_identifier ); + } + + /** + * Listens to an argument in the request URL and triggers an action. + * + * @return void + */ + protected function dismiss() { + $this->set_dismissal_state(); + $this->redirect_to_dashboard(); + } + + /** + * Checks if a notice is applicable. + * + * @return bool Whether a notice should be shown or not. + */ + protected function is_applicable() { + return $this->is_notice_dismissed() === false; + } + + /** + * Checks whether the notification has been dismissed. + * + * @codeCoverageIgnore + * + * @return bool True when notification is dismissed. + */ + protected function is_notice_dismissed() { + return get_user_meta( get_current_user_id(), 'wpseo-remove-' . $this->notification_identifier, true ) === '1'; + } + + /** + * Retrieves the value where listener is listening for. + * + * @codeCoverageIgnore + * + * @return string|null The listener value or null if not set. + */ + protected function get_listener_value() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: Normally we would need to check for a nonce here but this class is not used anymore. + if ( isset( $_GET['yoast_dismiss'] ) && is_string( $_GET['yoast_dismiss'] ) ) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: Normally we would need to check for a nonce here but this class is not used anymore. + return sanitize_text_field( wp_unslash( $_GET['yoast_dismiss'] ) ); + } + return null; + } + + /** + * Dismisses the notification. + * + * @codeCoverageIgnore + * + * @return void + */ + protected function set_dismissal_state() { + update_user_meta( get_current_user_id(), 'wpseo-remove-' . $this->notification_identifier, true ); + } + + /** + * Redirects the user back to the dashboard. + * + * @codeCoverageIgnore + * + * @return void + */ + protected function redirect_to_dashboard() { + wp_safe_redirect( admin_url( 'admin.php?page=wpseo_dashboard' ) ); + exit; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/notifiers/interface-notification-handler.php b/wp-content/plugins/wordpress-seo/admin/notifiers/interface-notification-handler.php new file mode 100644 index 00000000..f798a586 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/notifiers/interface-notification-handler.php @@ -0,0 +1,21 @@ +admin_header( true, 'wpseo' ); + +do_action( 'wpseo_all_admin_notices' ); + +$dashboard_tabs = new WPSEO_Option_Tabs( 'dashboard' ); +$dashboard_tabs->add_tab( + new WPSEO_Option_Tab( + 'dashboard', + __( 'Dashboard', 'wordpress-seo' ), + [ + 'save_button' => false, + ] + ) +); + +/** + * Allows the addition of tabs to the dashboard by calling $dashboard_tabs->add_tab(). + */ +do_action( 'wpseo_settings_tabs_dashboard', $dashboard_tabs ); + +$dashboard_tabs->display( $yform ); + +do_action( 'wpseo_dashboard' ); + +$yform->admin_footer(); diff --git a/wp-content/plugins/wordpress-seo/admin/pages/licenses.php b/wp-content/plugins/wordpress-seo/admin/pages/licenses.php new file mode 100644 index 00000000..fb713cdc --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/pages/licenses.php @@ -0,0 +1,15 @@ +admin_header( true, 'wpseo_ms' ); + +$network_tabs = new WPSEO_Option_Tabs( 'network' ); +$network_tabs->add_tab( new WPSEO_Option_Tab( 'general', __( 'General', 'wordpress-seo' ) ) ); +$network_tabs->add_tab( new WPSEO_Option_Tab( 'features', __( 'Features', 'wordpress-seo' ) ) ); +$network_tabs->add_tab( new WPSEO_Option_Tab( 'integrations', __( 'Integrations', 'wordpress-seo' ) ) ); + +$network_tabs->add_tab( + new WPSEO_Option_Tab( + 'crawl-settings', + __( 'Crawl settings', 'wordpress-seo' ), + [ + 'save_button' => true, + ] + ) +); +$network_tabs->add_tab( new WPSEO_Option_Tab( 'restore-site', __( 'Restore Site', 'wordpress-seo' ), [ 'save_button' => false ] ) ); +$network_tabs->display( $yform ); + +$yform->admin_footer(); diff --git a/wp-content/plugins/wordpress-seo/admin/pages/redirects.php b/wp-content/plugins/wordpress-seo/admin/pages/redirects.php new file mode 100644 index 00000000..52acbc33 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/pages/redirects.php @@ -0,0 +1,15 @@ +admin_header( false ); + +if ( $tool_page === '' ) { + + $tools = []; + + $tools['import-export'] = [ + 'title' => __( 'Import and Export', 'wordpress-seo' ), + 'desc' => __( 'Import settings from other SEO plugins and export your settings for re-use on (another) site.', 'wordpress-seo' ), + ]; + + if ( WPSEO_Utils::allow_system_file_edit() === true && ! is_multisite() ) { + $tools['file-editor'] = [ + 'title' => __( 'File editor', 'wordpress-seo' ), + 'desc' => __( 'This tool allows you to quickly change important files for your SEO, like your robots.txt and, if you have one, your .htaccess file.', 'wordpress-seo' ), + ]; + } + + $tools['bulk-editor'] = [ + 'title' => __( 'Bulk editor', 'wordpress-seo' ), + 'desc' => __( 'This tool allows you to quickly change titles and descriptions of your posts and pages without having to go into the editor for each page.', 'wordpress-seo' ), + ]; + + echo '

    '; + printf( + /* translators: %1$s expands to Yoast SEO */ + esc_html__( '%1$s comes with some very powerful built-in tools:', 'wordpress-seo' ), + 'Yoast SEO' + ); + echo '

    '; + + echo '
      '; + + $admin_url = admin_url( 'admin.php?page=wpseo_tools' ); + + foreach ( $tools as $slug => $tool ) { + $href = ( ! empty( $tool['href'] ) ) ? $admin_url . $tool['href'] : add_query_arg( [ 'tool' => $slug ], $admin_url ); + $attr = ( ! empty( $tool['attr'] ) ) ? $tool['attr'] : ''; + + echo '
    • '; + echo '', esc_html( $tool['title'] ), '
      '; + echo esc_html( $tool['desc'] ); + echo '
    • '; + } + + /** + * WARNING: This hook is intended for internal use only. + * Don't use it in your code as it will be removed shortly. + */ + do_action( 'wpseo_tools_overview_list_items_internal' ); + + echo '
    '; +} +else { + echo '', esc_html__( '« Back to Tools page', 'wordpress-seo' ), ''; + + $tool_pages = [ 'bulk-editor', 'import-export' ]; + + if ( WPSEO_Utils::allow_system_file_edit() === true && ! is_multisite() ) { + $tool_pages[] = 'file-editor'; + } + + if ( in_array( $tool_page, $tool_pages, true ) ) { + require_once WPSEO_PATH . 'admin/views/tool-' . $tool_page . '.php'; + } +} + +$yform->admin_footer( false ); diff --git a/wp-content/plugins/wordpress-seo/admin/roles/class-abstract-role-manager.php b/wp-content/plugins/wordpress-seo/admin/roles/class-abstract-role-manager.php new file mode 100644 index 00000000..39edad49 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/roles/class-abstract-role-manager.php @@ -0,0 +1,149 @@ +roles[ $role ] = (object) [ + 'display_name' => $display_name, + 'template' => $template, + ]; + } + + /** + * Returns the list of registered roles. + * + * @return string[] List or registered roles. + */ + public function get_roles() { + return array_keys( $this->roles ); + } + + /** + * Adds the registered roles. + * + * @return void + */ + public function add() { + foreach ( $this->roles as $role => $data ) { + $capabilities = $this->get_capabilities( $data->template ); + $capabilities = $this->filter_existing_capabilties( $role, $capabilities ); + + $this->add_role( $role, $data->display_name, $capabilities ); + } + } + + /** + * Removes the registered roles. + * + * @return void + */ + public function remove() { + $roles = array_keys( $this->roles ); + array_map( [ $this, 'remove_role' ], $roles ); + } + + /** + * Returns the capabilities for the specified role. + * + * @param string $role Role to fetch capabilities from. + * + * @return array List of capabilities. + */ + protected function get_capabilities( $role ) { + if ( ! is_string( $role ) || empty( $role ) ) { + return []; + } + + $wp_role = get_role( $role ); + if ( ! $wp_role ) { + return []; + } + + return $wp_role->capabilities; + } + + /** + * Returns true if the capability exists on the role. + * + * @param WP_Role $role Role to check capability against. + * @param string $capability Capability to check. + * + * @return bool True if the capability is defined for the role. + */ + protected function capability_exists( WP_Role $role, $capability ) { + return ! array_key_exists( $capability, $role->capabilities ); + } + + /** + * Filters out capabilities that are already set for the role. + * + * This makes sure we don't override configurations that have been previously set. + * + * @param string $role The role to check against. + * @param array $capabilities The capabilities that should be set. + * + * @return array Capabilties that can be safely set. + */ + protected function filter_existing_capabilties( $role, array $capabilities ) { + if ( $capabilities === [] ) { + return $capabilities; + } + + $wp_role = get_role( $role ); + if ( ! $wp_role ) { + return $capabilities; + } + + foreach ( $capabilities as $capability => $grant ) { + if ( $this->capability_exists( $wp_role, $capability ) ) { + unset( $capabilities[ $capability ] ); + } + } + + return $capabilities; + } + + /** + * Adds a role to the system. + * + * @param string $role Role to add. + * @param string $display_name Name to display for the role. + * @param array $capabilities Capabilities to add to the role. + * + * @return void + */ + abstract protected function add_role( $role, $display_name, array $capabilities = [] ); + + /** + * Removes a role from the system. + * + * @param string $role Role to remove. + * + * @return void + */ + abstract protected function remove_role( $role ); +} diff --git a/wp-content/plugins/wordpress-seo/admin/roles/class-register-roles.php b/wp-content/plugins/wordpress-seo/admin/roles/class-register-roles.php new file mode 100644 index 00000000..9636237e --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/roles/class-register-roles.php @@ -0,0 +1,33 @@ +register( 'wpseo_manager', 'SEO Manager', 'editor' ); + $role_manager->register( 'wpseo_editor', 'SEO Editor', 'editor' ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/roles/class-role-manager-factory.php b/wp-content/plugins/wordpress-seo/admin/roles/class-role-manager-factory.php new file mode 100644 index 00000000..d22753a2 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/roles/class-role-manager-factory.php @@ -0,0 +1,27 @@ + $grant ) { + $wp_role->add_cap( $capability, $grant ); + } + + return; + } + + add_role( $role, $display_name, $capabilities ); + } + + /** + * Removes a role from the system. + * + * @param string $role Role to remove. + * + * @return void + */ + protected function remove_role( $role ) { + remove_role( $role ); + } + + /** + * Formats the capabilities to the required format. + * + * @param array $capabilities Capabilities to format. + * @param bool $enabled Whether these capabilities should be enabled or not. + * + * @return array Formatted capabilities. + */ + protected function format_capabilities( array $capabilities, $enabled = true ) { + // Flip keys and values. + $capabilities = array_flip( $capabilities ); + + // Set all values to $enabled. + return array_fill_keys( array_keys( $capabilities ), $enabled ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/roles/class-role-manager.php b/wp-content/plugins/wordpress-seo/admin/roles/class-role-manager.php new file mode 100644 index 00000000..7f9d82bb --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/roles/class-role-manager.php @@ -0,0 +1,44 @@ +get_file_url( $request ); + + return new WP_REST_Response( + [ + 'type' => 'success', + 'size_in_bytes' => $this->get_file_size( $file_url ), + ], + 200 + ); + } + catch ( WPSEO_File_Size_Exception $exception ) { + return new WP_REST_Response( + [ + 'type' => 'failure', + 'response' => $exception->getMessage(), + ], + 404 + ); + } + } + + /** + * Retrieves the file url. + * + * @param WP_REST_Request $request The request to retrieve file url from. + * + * @return string The file url. + * @throws WPSEO_File_Size_Exception The file is hosted externally. + */ + protected function get_file_url( WP_REST_Request $request ) { + $file_url = rawurldecode( $request->get_param( 'url' ) ); + + if ( ! $this->is_externally_hosted( $file_url ) ) { + return $file_url; + } + + throw WPSEO_File_Size_Exception::externally_hosted( $file_url ); + } + + /** + * Checks if the file is hosted externally. + * + * @param string $file_url The file url. + * + * @return bool True if it is hosted externally. + */ + protected function is_externally_hosted( $file_url ) { + return wp_parse_url( home_url(), PHP_URL_HOST ) !== wp_parse_url( $file_url, PHP_URL_HOST ); + } + + /** + * Returns the file size. + * + * @param string $file_url The file url to get the size for. + * + * @return int The file size. + * @throws WPSEO_File_Size_Exception Retrieval of file size went wrong for unknown reasons. + */ + protected function get_file_size( $file_url ) { + $file_config = wp_upload_dir(); + $file_url = str_replace( $file_config['baseurl'], '', $file_url ); + $file_size = $this->calculate_file_size( $file_url ); + + if ( ! $file_size ) { + throw WPSEO_File_Size_Exception::unknown_error( $file_url ); + } + + return $file_size; + } + + /** + * Calculates the file size using the Utils class. + * + * @param string $file_url The file to retrieve the size for. + * + * @return int|bool The file size or False if it could not be retrieved. + */ + protected function calculate_file_size( $file_url ) { + return WPSEO_Image_Utils::get_file_size( + [ + 'path' => $file_url, + ] + ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/statistics/class-statistics-integration.php b/wp-content/plugins/wordpress-seo/admin/statistics/class-statistics-integration.php new file mode 100644 index 00000000..756f314c --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/statistics/class-statistics-integration.php @@ -0,0 +1,36 @@ +statistics = $statistics; + } + + /** + * Fetches statistics by REST request. + * + * @return WP_REST_Response The response object. + */ + public function get_statistics() { + // Switch to the user locale with fallback to the site locale. + switch_to_locale( get_user_locale() ); + + $this->labels = $this->labels(); + $statistics = $this->statistic_items(); + + $data = [ + 'header' => $this->get_header_from_statistics( $statistics ), + 'seo_scores' => $statistics['scores'], + ]; + + return new WP_REST_Response( $data ); + } + + /** + * Gets a header summarizing the given statistics results. + * + * @param array $statistics The statistics results. + * + * @return string The header summing up the statistics results. + */ + private function get_header_from_statistics( array $statistics ) { + // Personal interpretation to allow release, should be looked at later. + if ( $statistics['division'] === false ) { + return __( 'You don\'t have any published posts, your SEO scores will appear here once you make your first post!', 'wordpress-seo' ); + } + + if ( $statistics['division']['good'] > 0.66 ) { + return __( 'Hey, your SEO is doing pretty well! Check out the stats:', 'wordpress-seo' ); + } + + return __( 'Below are your published posts\' SEO scores. Now is as good a time as any to start improving some of your posts!', 'wordpress-seo' ); + } + + /** + * An array representing items to be added to the At a Glance dashboard widget. + * + * @return array The statistics for the current user. + */ + private function statistic_items() { + $transient = $this->get_transient(); + $user_id = get_current_user_id(); + + if ( isset( $transient[ $user_id ] ) ) { + return $transient[ $user_id ]; + } + + return $this->set_statistic_items_for_user( $transient, $user_id ); + } + + /** + * Gets the statistics transient value. Returns array if transient wasn't set. + * + * @return array|mixed Returns the transient or an empty array if the transient doesn't exist. + */ + private function get_transient() { + $transient = get_transient( self::CACHE_TRANSIENT_KEY ); + + if ( $transient === false ) { + return []; + } + + return $transient; + } + + /** + * Set the statistics transient cache for a specific user. + * + * @param array $transient The current stored transient with the cached data. + * @param int $user The user's ID to assign the retrieved values to. + * + * @return array The statistics transient for the user. + */ + private function set_statistic_items_for_user( $transient, $user ) { + $scores = $this->get_seo_scores_with_post_count(); + $division = $this->get_seo_score_division( $scores ); + + $transient[ $user ] = [ + // Use array_values because array_filter may return non-zero indexed arrays. + 'scores' => array_values( array_filter( $scores, [ $this, 'filter_items' ] ) ), + 'division' => $division, + ]; + + set_transient( self::CACHE_TRANSIENT_KEY, $transient, DAY_IN_SECONDS ); + + return $transient[ $user ]; + } + + /** + * Gets the division of SEO scores. + * + * @param array $scores The SEO scores. + * + * @return array|bool The division of SEO scores, false if there are no posts. + */ + private function get_seo_score_division( array $scores ) { + $total = 0; + $division = []; + + foreach ( $scores as $score ) { + $total += $score['count']; + } + + if ( $total === 0 ) { + return false; + } + + foreach ( $scores as $score ) { + $division[ $score['seo_rank'] ] = ( $score['count'] / $total ); + } + + return $division; + } + + /** + * Get all SEO ranks and data associated with them. + * + * @return array An array of SEO scores and associated data. + */ + private function get_seo_scores_with_post_count() { + $ranks = WPSEO_Rank::get_all_ranks(); + + return array_map( [ $this, 'map_rank_to_widget' ], $ranks ); + } + + /** + * Converts a rank to data usable in the dashboard widget. + * + * @param WPSEO_Rank $rank The rank to map. + * + * @return array The mapped rank. + */ + private function map_rank_to_widget( WPSEO_Rank $rank ) { + return [ + 'seo_rank' => $rank->get_rank(), + 'label' => $this->get_label_for_rank( $rank ), + 'count' => $this->statistics->get_post_count( $rank ), + 'link' => $this->get_link_for_rank( $rank ), + ]; + } + + /** + * Returns a dashboard widget label to use for a certain rank. + * + * @param WPSEO_Rank $rank The rank to return a label for. + * + * @return string The label for the rank. + */ + private function get_label_for_rank( WPSEO_Rank $rank ) { + return $this->labels[ $rank->get_rank() ]; + } + + /** + * Determines the labels for the various scoring ranks that are known within Yoast SEO. + * + * @return array Array containing the translatable labels. + */ + private function labels() { + return [ + WPSEO_Rank::NO_FOCUS => sprintf( + /* translators: %1$s expands to an opening strong tag, %2$s expands to a closing strong tag */ + __( 'Posts %1$swithout%2$s a focus keyphrase', 'wordpress-seo' ), + '', + '' + ), + WPSEO_Rank::BAD => sprintf( + /* translators: %s expands to the score */ + __( 'Posts with the SEO score: %s', 'wordpress-seo' ), + '' . __( 'Needs improvement', 'wordpress-seo' ) . '' + ), + WPSEO_Rank::OK => sprintf( + /* translators: %s expands to the score */ + __( 'Posts with the SEO score: %s', 'wordpress-seo' ), + '' . __( 'OK', 'wordpress-seo' ) . '' + ), + WPSEO_Rank::GOOD => sprintf( + /* translators: %s expands to the score */ + __( 'Posts with the SEO score: %s', 'wordpress-seo' ), + '' . __( 'Good', 'wordpress-seo' ) . '' + ), + WPSEO_Rank::NO_INDEX => __( 'Posts that should not show up in search results', 'wordpress-seo' ), + ]; + } + + /** + * Filter items if they have a count of zero. + * + * @param array $item The item to potentially filter out. + * + * @return bool Whether or not the count is zero. + */ + private function filter_items( $item ) { + return $item['count'] !== 0; + } + + /** + * Returns a link for the overview of posts of a certain rank. + * + * @param WPSEO_Rank $rank The rank to return a link for. + * + * @return string The link that shows an overview of posts with that rank. + */ + private function get_link_for_rank( WPSEO_Rank $rank ) { + if ( current_user_can( 'edit_others_posts' ) === false ) { + return esc_url( admin_url( 'edit.php?post_status=publish&post_type=post&seo_filter=' . $rank->get_rank() . '&author=' . get_current_user_id() ) ); + } + + return esc_url( admin_url( 'edit.php?post_status=publish&post_type=post&seo_filter=' . $rank->get_rank() ) ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-columns.php b/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-columns.php new file mode 100644 index 00000000..fda2f19c --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-columns.php @@ -0,0 +1,231 @@ +taxonomy = $this->get_taxonomy(); + + if ( ! empty( $this->taxonomy ) ) { + add_filter( 'manage_edit-' . $this->taxonomy . '_columns', [ $this, 'add_columns' ] ); + add_filter( 'manage_' . $this->taxonomy . '_custom_column', [ $this, 'parse_column' ], 10, 3 ); + } + + $this->analysis_seo = new WPSEO_Metabox_Analysis_SEO(); + $this->analysis_readability = new WPSEO_Metabox_Analysis_Readability(); + $this->indexable_repository = YoastSEO()->classes->get( Indexable_Repository::class ); + $this->score_icon_helper = YoastSEO()->helpers->score_icon; + } + + /** + * Adds an SEO score column to the terms table, right after the description column. + * + * @param array $columns Current set columns. + * + * @return array + */ + public function add_columns( array $columns ) { + if ( $this->display_metabox( $this->taxonomy ) === false ) { + return $columns; + } + + $new_columns = []; + + foreach ( $columns as $column_name => $column_value ) { + $new_columns[ $column_name ] = $column_value; + + if ( $column_name === 'description' && $this->analysis_seo->is_enabled() ) { + $new_columns['wpseo-score'] = '' + . __( 'SEO score', 'wordpress-seo' ) . ''; + } + + if ( $column_name === 'description' && $this->analysis_readability->is_enabled() ) { + $new_columns['wpseo-score-readability'] = '' + . __( 'Readability score', 'wordpress-seo' ) . ''; + } + } + + return $new_columns; + } + + /** + * Parses the column. + * + * @param string $content The current content of the column. + * @param string $column_name The name of the column. + * @param int $term_id ID of requested taxonomy. + * + * @return string + */ + public function parse_column( $content, $column_name, $term_id ) { + + switch ( $column_name ) { + case 'wpseo-score': + return $this->get_score_value( $term_id ); + + case 'wpseo-score-readability': + return $this->get_score_readability_value( $term_id ); + } + + return $content; + } + + /** + * Retrieves the taxonomy from the $_GET or $_POST variable. + * + * @return string|null The current taxonomy or null when it is not set. + */ + public function get_current_taxonomy() { + // phpcs:disable WordPress.Security.NonceVerification.Missing,WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + if ( ! empty( $_SERVER['REQUEST_METHOD'] ) && $_SERVER['REQUEST_METHOD'] === 'POST' ) { + if ( isset( $_POST['taxonomy'] ) && is_string( $_POST['taxonomy'] ) ) { + return sanitize_text_field( wp_unslash( $_POST['taxonomy'] ) ); + } + } + elseif ( isset( $_GET['taxonomy'] ) && is_string( $_GET['taxonomy'] ) ) { + return sanitize_text_field( wp_unslash( $_GET['taxonomy'] ) ); + } + // phpcs:enable WordPress.Security.NonceVerification.Missing,WordPress.Security.NonceVerification.Recommended + return null; + } + + /** + * Returns the posted/get taxonomy value if it is set. + * + * @return string|null + */ + private function get_taxonomy() { + // phpcs:disable WordPress.Security.NonceVerification.Missing,WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + if ( wp_doing_ajax() ) { + if ( isset( $_POST['taxonomy'] ) && is_string( $_POST['taxonomy'] ) ) { + return sanitize_text_field( wp_unslash( $_POST['taxonomy'] ) ); + } + } + elseif ( isset( $_GET['taxonomy'] ) && is_string( $_GET['taxonomy'] ) ) { + return sanitize_text_field( wp_unslash( $_GET['taxonomy'] ) ); + } + // phpcs:enable WordPress.Security.NonceVerification.Missing,WordPress.Security.NonceVerification.Recommended + return null; + } + + /** + * Parses the value for the score column. + * + * @param int $term_id ID of requested term. + * + * @return string + */ + private function get_score_value( $term_id ) { + $indexable = $this->indexable_repository->find_by_id_and_type( (int) $term_id, 'term' ); + + return $this->score_icon_helper->for_seo( $indexable, '', __( 'Term is set to noindex.', 'wordpress-seo' ) ); + } + + /** + * Parses the value for the readability score column. + * + * @param int $term_id ID of the requested term. + * + * @return string The HTML for the readability score indicator. + */ + private function get_score_readability_value( $term_id ) { + $score = (int) WPSEO_Taxonomy_Meta::get_term_meta( $term_id, $this->taxonomy, 'content_score' ); + + return $this->score_icon_helper->for_readability( $score ); + } + + /** + * Check if the taxonomy is indexable. + * + * @param mixed $term The current term. + * + * @return bool Whether the term is indexable. + */ + private function is_indexable( $term ) { + // When the no_index value is not empty and not default, check if its value is index. + $no_index = WPSEO_Taxonomy_Meta::get_term_meta( $term->term_id, $this->taxonomy, 'noindex' ); + + // Check if the default for taxonomy is empty (this will be index). + if ( ! empty( $no_index ) && $no_index !== 'default' ) { + return ( $no_index === 'index' ); + } + + if ( is_object( $term ) ) { + $no_index_key = 'noindex-tax-' . $term->taxonomy; + + // If the option is false, this means we want to index it. + return WPSEO_Options::get( $no_index_key, false ) === false; + } + + return true; + } + + /** + * Wraps the WPSEO_Metabox check to determine whether the metabox should be displayed either by + * choice of the admin or because the taxonomy is not public. + * + * @since 7.0 + * + * @param string|null $taxonomy Optional. The taxonomy to test, defaults to the current taxonomy. + * + * @return bool Whether the meta box (and associated columns etc) should be hidden. + */ + private function display_metabox( $taxonomy = null ) { + $current_taxonomy = $this->get_current_taxonomy(); + + if ( ! isset( $taxonomy ) && ! empty( $current_taxonomy ) ) { + $taxonomy = $current_taxonomy; + } + + return WPSEO_Utils::is_metabox_active( $taxonomy, 'taxonomy' ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-fields-presenter.php b/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-fields-presenter.php new file mode 100644 index 00000000..9ab28b0c --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-fields-presenter.php @@ -0,0 +1,221 @@ +tax_meta = WPSEO_Taxonomy_Meta::get_term_meta( (int) $term->term_id, $term->taxonomy ); + } + + /** + * Displaying the form fields. + * + * @param array $fields Array with the fields that will be displayed. + * + * @return string + */ + public function html( array $fields ) { + $content = ''; + foreach ( $fields as $field_name => $field_configuration ) { + $content .= $this->form_row( 'wpseo_' . $field_name, $field_configuration ); + } + return $content; + } + + /** + * Create a row in the form table. + * + * @param string $field_name Variable the row controls. + * @param array $field_configuration Array with the field configuration. + * + * @return string + */ + private function form_row( $field_name, array $field_configuration ) { + $esc_field_name = esc_attr( $field_name ); + + $options = (array) $field_configuration['options']; + + if ( ! empty( $field_configuration['description'] ) ) { + $options['description'] = $field_configuration['description']; + } + + $label = $this->get_label( $field_configuration['label'], $esc_field_name ); + $field = $this->get_field( $field_configuration['type'], $esc_field_name, $this->get_field_value( $field_name ), $options ); + $help_content = ( $field_configuration['options']['help'] ?? '' ); + $help_button_text = ( $field_configuration['options']['help-button'] ?? '' ); + $help = new WPSEO_Admin_Help_Panel( $field_name, $help_button_text, $help_content ); + + return $this->parse_row( $label, $help, $field ); + } + + /** + * Generates the html for the given field config. + * + * @param string $field_type The fieldtype, e.g: text, checkbox, etc. + * @param string $field_name The name of the field. + * @param string $field_value The value of the field. + * @param array $options Array with additional options. + * + * @return string + */ + private function get_field( $field_type, $field_name, $field_value, array $options ) { + + $class = $this->get_class( $options ); + $field = ''; + $description = ''; + $aria_describedby = ''; + + if ( ! empty( $options['description'] ) ) { + $aria_describedby = ' aria-describedby="' . $field_name . '-desc"'; + $description = '

    ' . $options['description'] . '

    '; + } + + switch ( $field_type ) { + case 'div': + $field .= '
    '; + break; + case 'url': + $field .= ''; + break; + case 'text': + $field .= ''; + break; + case 'checkbox': + $field .= ''; + break; + case 'textarea': + $rows = 3; + if ( ! empty( $options['rows'] ) ) { + $rows = $options['rows']; + } + $field .= ''; + break; + case 'upload': + $field .= ' '; + $field .= ' '; + $field .= ''; + break; + case 'select': + if ( is_array( $options ) && $options !== [] ) { + $field .= ''; + } + break; + case 'hidden': + $field .= ''; + break; + } + + return $field . $description; + } + + /** + * Getting the value for given field_name. + * + * @param string $field_name The fieldname to get the value for. + * + * @return string + */ + private function get_field_value( $field_name ) { + if ( isset( $this->tax_meta[ $field_name ] ) && $this->tax_meta[ $field_name ] !== '' ) { + return $this->tax_meta[ $field_name ]; + } + + return ''; + } + + /** + * Getting the class attributes if $options contains a class key. + * + * @param array $options The array with field options. + * + * @return string + */ + private function get_class( array $options ) { + if ( ! empty( $options['class'] ) ) { + return ' class="' . esc_attr( $options['class'] ) . '"'; + } + + return ''; + } + + /** + * Getting the label HTML. + * + * @param string $label The label value. + * @param string $field_name The target field. + * + * @return string + */ + private function get_label( $label, $field_name ) { + if ( $label !== '' ) { + return ''; + } + + return ''; + } + + /** + * Returns the HTML for the row which contains label, help and the field. + * + * @param string $label The html for the label if there was a label set. + * @param WPSEO_Admin_Help_Panel $help The help panel to render in this row. + * @param string $field The html for the field. + * + * @return string + */ + private function parse_row( $label, WPSEO_Admin_Help_Panel $help, $field ) { + if ( $label !== '' || $help !== '' ) { + return $label . $help->get_button_html() . $help->get_panel_html() . $field; + } + + return $field; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-fields.php b/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-fields.php new file mode 100644 index 00000000..9da698ef --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-fields.php @@ -0,0 +1,235 @@ +get_content_fields(); + break; + case 'settings': + $fields = $this->get_settings_fields(); + break; + case 'social': + $fields = $this->get_social_fields(); + break; + } + + return $this->filter_hidden_fields( $fields ); + } + + /** + * Returns array with the fields for the general tab. + * + * @return array + */ + protected function get_content_fields() { + $fields = [ + 'title' => [ + 'label' => '', + 'description' => '', + 'type' => 'hidden', + 'options' => '', + 'hide' => false, + ], + 'desc' => [ + 'label' => '', + 'description' => '', + 'type' => 'hidden', + 'options' => '', + 'hide' => false, + ], + 'linkdex' => [ + 'label' => '', + 'description' => '', + 'type' => 'hidden', + 'options' => '', + 'hide' => false, + ], + 'content_score' => [ + 'label' => '', + 'description' => '', + 'type' => 'hidden', + 'options' => '', + 'hide' => false, + ], + 'inclusive_language_score' => [ + 'label' => '', + 'description' => '', + 'type' => 'hidden', + 'options' => '', + 'hide' => false, + ], + 'focuskw' => [ + 'label' => '', + 'description' => '', + 'type' => 'hidden', + 'options' => '', + 'hide' => false, + ], + 'is_cornerstone' => [ + 'label' => '', + 'description' => '', + 'type' => 'hidden', + 'options' => '', + 'hide' => false, + ], + ]; + + /** + * Filter: 'wpseo_taxonomy_content_fields' - Adds the possibility to register additional content fields. + * + * @param array $additional_fields The additional fields. + */ + $additional_fields = apply_filters( 'wpseo_taxonomy_content_fields', [] ); + + return array_merge( $fields, $additional_fields ); + } + + /** + * Returns array with the fields for the settings tab. + * + * @return array + */ + protected function get_settings_fields() { + return [ + 'noindex' => [ + 'label' => '', + 'description' => '', + 'type' => 'hidden', + 'options' => '', + 'hide' => false, + ], + 'bctitle' => [ + 'label' => '', + 'description' => '', + 'type' => 'hidden', + 'options' => '', + 'hide' => ( WPSEO_Options::get( 'breadcrumbs-enable' ) !== true ), + ], + 'canonical' => [ + 'label' => '', + 'description' => '', + 'type' => 'hidden', + 'options' => '', + 'hide' => false, + ], + ]; + } + + /** + * Returning the fields for the social media tab. + * + * @return array + */ + protected function get_social_fields() { + $fields = []; + + if ( WPSEO_Options::get( 'opengraph', false ) === true ) { + $fields = [ + 'opengraph-title' => [ + 'label' => '', + 'description' => '', + 'type' => 'hidden', + 'options' => '', + 'hide' => false, + ], + 'opengraph-description' => [ + 'label' => '', + 'description' => '', + 'type' => 'hidden', + 'options' => '', + 'hide' => false, + ], + 'opengraph-image' => [ + 'label' => '', + 'description' => '', + 'type' => 'hidden', + 'options' => '', + 'hide' => false, + ], + 'opengraph-image-id' => [ + 'label' => '', + 'description' => '', + 'type' => 'hidden', + 'options' => '', + 'hide' => false, + ], + ]; + } + + if ( WPSEO_Options::get( 'twitter', false ) === true ) { + $fields = array_merge( + $fields, + [ + 'twitter-title' => [ + 'label' => '', + 'description' => '', + 'type' => 'hidden', + 'options' => '', + 'hide' => false, + ], + 'twitter-description' => [ + 'label' => '', + 'description' => '', + 'type' => 'hidden', + 'options' => '', + 'hide' => false, + ], + 'twitter-image' => [ + 'label' => '', + 'description' => '', + 'type' => 'hidden', + 'options' => '', + 'hide' => false, + ], + 'twitter-image-id' => [ + 'label' => '', + 'description' => '', + 'type' => 'hidden', + 'options' => '', + 'hide' => false, + ], + ] + ); + } + + return $fields; + } + + /** + * Filter the hidden fields. + * + * @param array $fields Array with the form fields that has will be filtered. + * + * @return array + */ + protected function filter_hidden_fields( array $fields ) { + foreach ( $fields as $field_name => $field_options ) { + if ( ! empty( $field_options['hide'] ) ) { + unset( $fields[ $field_name ] ); + } + } + + return $fields; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-metabox.php b/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-metabox.php new file mode 100644 index 00000000..d7b1fff6 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-metabox.php @@ -0,0 +1,229 @@ +term = $term; + $this->taxonomy = $taxonomy; + $this->is_social_enabled = WPSEO_Options::get( 'opengraph', false ) || WPSEO_Options::get( 'twitter', false ); + + $this->seo_analysis = new WPSEO_Metabox_Analysis_SEO(); + $this->readability_analysis = new WPSEO_Metabox_Analysis_Readability(); + $this->inclusive_language_analysis = new WPSEO_Metabox_Analysis_Inclusive_Language(); + } + + /** + * Shows the Yoast SEO metabox for the term. + * + * @return void + */ + public function display() { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: $this->get_product_title() returns a hard-coded string. + printf( '

    %1$s

    ', $this->get_product_title() ); + + echo '
    '; + echo '
    '; + + $this->render_hidden_fields(); + $this->render_tabs(); + + echo '
    '; + echo '
    '; + } + + /** + * Renders the metabox hidden fields. + * + * @return void + */ + protected function render_hidden_fields() { + $fields_presenter = new WPSEO_Taxonomy_Fields_Presenter( $this->term ); + $field_definitions = new WPSEO_Taxonomy_Fields(); + + echo $fields_presenter->html( $field_definitions->get( 'content' ) ); + if ( WPSEO_Capability_Utils::current_user_can( 'wpseo_edit_advanced_metadata' ) || WPSEO_Options::get( 'disableadvanced_meta' ) === false ) { + echo $fields_presenter->html( $field_definitions->get( 'settings' ) ); + } + + if ( $this->is_social_enabled ) { + echo $fields_presenter->html( $field_definitions->get( 'social' ) ); + } + } + + /** + * Renders the metabox tabs. + * + * @return void + */ + protected function render_tabs() { + echo '
    '; + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: $this->get_product_title() returns a hard-coded string. + printf( '
      ', $this->get_product_title() ); + + $tabs = $this->get_tabs(); + + foreach ( $tabs as $tab ) { + $tab->display_link(); + } + + echo '
    '; + + foreach ( $tabs as $tab ) { + $tab->display_content(); + } + + echo '
    '; + } + + /** + * Returns the relevant metabox sections for the current view. + * + * @return WPSEO_Metabox_Section[] + */ + private function get_tabs() { + $tabs = []; + + $label = __( 'SEO', 'wordpress-seo' ); + if ( $this->seo_analysis->is_enabled() ) { + $label = '' . $label; + } + + $tabs[] = new WPSEO_Metabox_Section_React( 'content', $label ); + + if ( $this->readability_analysis->is_enabled() ) { + $tabs[] = new WPSEO_Metabox_Section_Readability(); + } + + if ( $this->inclusive_language_analysis->is_enabled() ) { + $tabs[] = new WPSEO_Metabox_Section_Inclusive_Language(); + } + + if ( $this->is_social_enabled ) { + $tabs[] = new WPSEO_Metabox_Section_React( + 'social', + '' . __( 'Social', 'wordpress-seo' ), + '', + [ + 'html_after' => '
    ', + ] + ); + } + + $tabs = array_merge( $tabs, $this->get_additional_tabs() ); + + return $tabs; + } + + /** + * Returns the metabox tabs that have been added by other plugins. + * + * @return WPSEO_Metabox_Section_Additional[] + */ + protected function get_additional_tabs() { + $tabs = []; + + /** + * Private filter: 'yoast_free_additional_taxonomy_metabox_sections'. + * + * Meant for internal use only. Allows adding additional tabs to the Yoast SEO metabox for taxonomies. + * + * @param array[] $tabs { + * An array of arrays with tab specifications. + * + * @type array $tab { + * A tab specification. + * + * @type string $name The name of the tab. Used in the HTML IDs, href and aria properties. + * @type string $link_content The content of the tab link. + * @type string $content The content of the tab. + * @type array $options { + * Optional. Extra options. + * + * @type string $link_class Optional. The class for the tab link. + * @type string $link_aria_label Optional. The aria label of the tab link. + * } + * } + * } + */ + $requested_tabs = apply_filters( 'yoast_free_additional_taxonomy_metabox_sections', [] ); + + foreach ( $requested_tabs as $tab ) { + if ( is_array( $tab ) && array_key_exists( 'name', $tab ) && array_key_exists( 'link_content', $tab ) && array_key_exists( 'content', $tab ) ) { + $options = array_key_exists( 'options', $tab ) ? $tab['options'] : []; + $tabs[] = new WPSEO_Metabox_Section_Additional( + $tab['name'], + $tab['link_content'], + $tab['content'], + $options + ); + } + } + + return $tabs; + } + + /** + * Retrieves the product title. + * + * @return string The product title. + */ + protected function get_product_title() { + return YoastSEO()->helpers->product->get_product_name(); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy.php b/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy.php new file mode 100644 index 00000000..41edb10c --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy.php @@ -0,0 +1,492 @@ +taxonomy = $this::get_taxonomy(); + + add_action( 'edit_term', [ $this, 'update_term' ], 99, 3 ); + add_action( 'init', [ $this, 'custom_category_descriptions_allow_html' ] ); + add_action( 'admin_init', [ $this, 'admin_init' ] ); + + if ( self::is_term_overview( $GLOBALS['pagenow'] ) ) { + new WPSEO_Taxonomy_Columns(); + } + $this->analysis_seo = new WPSEO_Metabox_Analysis_SEO(); + $this->analysis_readability = new WPSEO_Metabox_Analysis_Readability(); + $this->analysis_inclusive_language = new WPSEO_Metabox_Analysis_Inclusive_Language(); + } + + /** + * Add hooks late enough for taxonomy object to be available for checks. + * + * @return void + */ + public function admin_init() { + + $taxonomy = get_taxonomy( $this->taxonomy ); + + if ( empty( $taxonomy ) || empty( $taxonomy->public ) || ! $this->show_metabox() ) { + return; + } + + // Adds custom category description editor. Needs a hook that runs before the description field. + add_action( "{$this->taxonomy}_term_edit_form_top", [ $this, 'custom_category_description_editor' ] ); + + add_action( sanitize_text_field( $this->taxonomy ) . '_edit_form', [ $this, 'term_metabox' ], 90, 1 ); + add_action( 'admin_enqueue_scripts', [ $this, 'admin_enqueue_scripts' ] ); + } + + /** + * Show the SEO inputs for term. + * + * @param stdClass|WP_Term $term Term to show the edit boxes for. + * + * @return void + */ + public function term_metabox( $term ) { + if ( WPSEO_Metabox::is_internet_explorer() ) { + $this->show_internet_explorer_notice(); + return; + } + + $metabox = new WPSEO_Taxonomy_Metabox( $this->taxonomy, $term ); + $metabox->display(); + } + + /** + * Renders the content for the internet explorer metabox. + * + * @return void + */ + private function show_internet_explorer_notice() { + $product_title = YoastSEO()->helpers->product->get_product_name(); + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: $product_title is hardcoded. + printf( '

    %1$s

    ', $product_title ); + echo '
    '; + + $content = sprintf( + /* translators: 1: Link start tag to the Firefox website, 2: Link start tag to the Chrome website, 3: Link start tag to the Edge website, 4: Link closing tag. */ + esc_html__( 'The browser you are currently using is unfortunately rather dated. Since we strive to give you the best experience possible, we no longer support this browser. Instead, please use %1$sFirefox%4$s, %2$sChrome%4$s or %3$sMicrosoft Edge%4$s.', 'wordpress-seo' ), + '', + '', + '', + '' + ); + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped above. + echo new Alert_Presenter( $content ); + + echo '
    '; + } + + /** + * Queue assets for taxonomy screens. + * + * @since 1.5.0 + * + * @return void + */ + public function admin_enqueue_scripts() { + + $pagenow = $GLOBALS['pagenow']; + + if ( ! ( self::is_term_edit( $pagenow ) || self::is_term_overview( $pagenow ) ) ) { + return; + } + + $asset_manager = new WPSEO_Admin_Asset_Manager(); + $asset_manager->enqueue_style( 'scoring' ); + $asset_manager->enqueue_style( 'monorepo' ); + + $tag_id = $this::get_tag_id(); + + if ( + self::is_term_edit( $pagenow ) + && ! is_null( $tag_id ) + ) { + wp_enqueue_media(); // Enqueue files needed for upload functionality. + + $asset_manager->enqueue_style( 'metabox-css' ); + $asset_manager->enqueue_style( 'ai-generator' ); + $asset_manager->enqueue_script( 'term-edit' ); + + /** + * Remove the emoji script as it is incompatible with both React and any + * contenteditable fields. + */ + remove_action( 'admin_print_scripts', 'print_emoji_detection_script' ); + + $asset_manager->localize_script( 'term-edit', 'wpseoAdminL10n', WPSEO_Utils::get_admin_l10n() ); + + $script_data = [ + 'analysis' => [ + 'plugins' => [ + 'replaceVars' => [ + 'no_parent_text' => __( '(no parent)', 'wordpress-seo' ), + 'replace_vars' => $this->get_replace_vars(), + 'recommended_replace_vars' => $this->get_recommended_replace_vars(), + 'scope' => $this->determine_scope(), + ], + 'shortcodes' => [ + 'wpseo_shortcode_tags' => $this->get_valid_shortcode_tags(), + 'wpseo_filter_shortcodes_nonce' => wp_create_nonce( 'wpseo-filter-shortcodes' ), + ], + ], + 'worker' => [ + 'url' => YoastSEO()->helpers->asset->get_asset_url( 'yoast-seo-analysis-worker' ), + 'dependencies' => YoastSEO()->helpers->asset->get_dependency_urls_by_handle( 'yoast-seo-analysis-worker' ), + 'keywords_assessment_url' => YoastSEO()->helpers->asset->get_asset_url( 'yoast-seo-used-keywords-assessment' ), + 'log_level' => WPSEO_Utils::get_analysis_worker_log_level(), + ], + ], + 'media' => [ + // @todo replace this translation with JavaScript translations. + 'choose_image' => __( 'Use Image', 'wordpress-seo' ), + ], + 'metabox' => $this->localize_term_scraper_script( $tag_id ), + 'userLanguageCode' => WPSEO_Language_Utils::get_language( get_user_locale() ), + 'isTerm' => true, + 'postId' => $tag_id, + 'termType' => $this->get_taxonomy(), + 'usedKeywordsNonce' => wp_create_nonce( 'wpseo-keyword-usage' ), + ]; + + /** + * The website information repository. + * + * @var $repo Website_Information_Repository + */ + $repo = YoastSEO()->classes->get( Website_Information_Repository::class ); + $term_information = $repo->get_term_site_information(); + $term_information->set_term( get_term_by( 'id', $tag_id, $this::get_taxonomy() ) ); + $script_data = array_merge_recursive( $term_information->get_legacy_site_information(), $script_data ); + + $asset_manager->localize_script( 'term-edit', 'wpseoScriptData', $script_data ); + $asset_manager->enqueue_user_language_script(); + } + + if ( self::is_term_overview( $pagenow ) ) { + $asset_manager->enqueue_script( 'edit-page' ); + } + } + + /** + * Update the taxonomy meta data on save. + * + * @param int $term_id ID of the term to save data for. + * @param int $tt_id The taxonomy_term_id for the term. + * @param string $taxonomy The taxonomy the term belongs to. + * + * @return void + */ + public function update_term( $term_id, $tt_id, $taxonomy ) { + // Bail if this is a multisite installation and the site has been switched. + if ( is_multisite() && ms_is_switched() ) { + return; + } + + /* Create post array with only our values. */ + $new_meta_data = []; + foreach ( WPSEO_Taxonomy_Meta::$defaults_per_term as $key => $default ) { + // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: Nonce is already checked by WordPress before executing this action. + if ( isset( $_POST[ $key ] ) && is_string( $_POST[ $key ] ) ) { + // phpcs:ignore WordPress.Security.NonceVerification.Missing,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: $data is getting sanitized later. + $data = wp_unslash( $_POST[ $key ] ); + $new_meta_data[ $key ] = ( $key !== 'wpseo_canonical' ) ? WPSEO_Utils::sanitize_text_field( $data ) : WPSEO_Utils::sanitize_url( $data ); + } + + // If analysis is disabled remove that analysis score value from the DB. + if ( $this->is_meta_value_disabled( $key ) ) { + $new_meta_data[ $key ] = ''; + } + } + + // Saving the values. + WPSEO_Taxonomy_Meta::set_values( $term_id, $taxonomy, $new_meta_data ); + } + + /** + * Determines if the given meta value key is disabled. + * + * @param string $key The key of the meta value. + * @return bool Whether the given meta value key is disabled. + */ + public function is_meta_value_disabled( $key ) { + if ( $key === 'wpseo_linkdex' && ! $this->analysis_seo->is_enabled() ) { + return true; + } + + if ( $key === 'wpseo_content_score' && ! $this->analysis_readability->is_enabled() ) { + return true; + } + + if ( $key === 'wpseo_inclusive_language_score' && ! $this->analysis_inclusive_language->is_enabled() ) { + return true; + } + + return false; + } + + /** + * Allows post-kses-filtered HTML in term descriptions. + * + * @return void + */ + public function custom_category_descriptions_allow_html() { + remove_filter( 'term_description', 'wp_kses_data' ); + remove_filter( 'pre_term_description', 'wp_filter_kses' ); + add_filter( 'term_description', 'wp_kses_post' ); + add_filter( 'pre_term_description', 'wp_filter_post_kses' ); + } + + /** + * Output the WordPress editor. + * + * @return void + */ + public function custom_category_description_editor() { + wp_editor( '', 'description' ); + } + + /** + * Pass variables to js for use with the term-scraper. + * + * @param int $term_id The ID of the term to localize the script for. + * + * @return array + */ + public function localize_term_scraper_script( $term_id ) { + $term = get_term_by( 'id', $term_id, $this::get_taxonomy() ); + $taxonomy = get_taxonomy( $term->taxonomy ); + + $term_formatter = new WPSEO_Metabox_Formatter( + new WPSEO_Term_Metabox_Formatter( $taxonomy, $term ) + ); + + return $term_formatter->get_values(); + } + + /** + * Pass some variables to js for replacing variables. + * + * @return array + */ + public function localize_replace_vars_script() { + return [ + 'no_parent_text' => __( '(no parent)', 'wordpress-seo' ), + 'replace_vars' => $this->get_replace_vars(), + 'recommended_replace_vars' => $this->get_recommended_replace_vars(), + 'scope' => $this->determine_scope(), + ]; + } + + /** + * Determines the scope based on the current taxonomy. + * This can be used by the replacevar plugin to determine if a replacement needs to be executed. + * + * @return string String decribing the current scope. + */ + private function determine_scope() { + $taxonomy = $this::get_taxonomy(); + + if ( $taxonomy === 'category' ) { + return 'category'; + } + + if ( $taxonomy === 'post_tag' ) { + return 'tag'; + } + + return 'term'; + } + + /** + * Determines if a given page is the term overview page. + * + * @param string $page The string to check for the term overview page. + * + * @return bool + */ + public static function is_term_overview( $page ) { + return $page === 'edit-tags.php'; + } + + /** + * Determines if a given page is the term edit page. + * + * @param string $page The string to check for the term edit page. + * + * @return bool + */ + public static function is_term_edit( $page ) { + return $page === 'term.php'; + } + + /** + * Function to get the labels for the current taxonomy. + * + * @return object|null Labels for the current taxonomy or null if the taxonomy is not set. + */ + public static function get_labels() { + $term = self::get_taxonomy(); + if ( $term !== '' ) { + $taxonomy = get_taxonomy( $term ); + return $taxonomy->labels; + } + return null; + } + + /** + * Retrieves a template. + * Check if metabox for current taxonomy should be displayed. + * + * @return bool + */ + private function show_metabox() { + $option_key = 'display-metabox-tax-' . $this->taxonomy; + + return WPSEO_Options::get( $option_key ); + } + + /** + * Getting the taxonomy from the URL. + * + * @return string + */ + private static function get_taxonomy() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + if ( isset( $_GET['taxonomy'] ) && is_string( $_GET['taxonomy'] ) ) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + return sanitize_text_field( wp_unslash( $_GET['taxonomy'] ) ); + } + return ''; + } + + /** + * Get the current tag ID from the GET parameters. + * + * @return int|null the tag ID if it exists, null otherwise. + */ + private static function get_tag_id() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + if ( isset( $_GET['tag_ID'] ) && is_string( $_GET['tag_ID'] ) ) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information, We are casting to an integer. + $tag_id = (int) wp_unslash( $_GET['tag_ID'] ); + if ( $tag_id > 0 ) { + return $tag_id; + } + } + return null; + } + + /** + * Prepares the replace vars for localization. + * + * @return array The replacement variables. + */ + private function get_replace_vars() { + $term_id = $this::get_tag_id(); + $term = get_term_by( 'id', $term_id, $this::get_taxonomy() ); + + $cached_replacement_vars = []; + + $vars_to_cache = [ + 'date', + 'id', + 'sitename', + 'sitedesc', + 'sep', + 'page', + 'term_title', + 'term_description', + 'term_hierarchy', + 'category_description', + 'tag_description', + 'searchphrase', + 'currentyear', + ]; + + foreach ( $vars_to_cache as $var ) { + $cached_replacement_vars[ $var ] = wpseo_replace_vars( '%%' . $var . '%%', $term ); + } + + return $cached_replacement_vars; + } + + /** + * Prepares the recommended replace vars for localization. + * + * @return array The recommended replacement variables. + */ + private function get_recommended_replace_vars() { + $recommended_replace_vars = new WPSEO_Admin_Recommended_Replace_Vars(); + $taxonomy = $this::get_taxonomy(); + + if ( $taxonomy === '' ) { + return []; + } + + // What is recommended depends on the current context. + $page_type = $recommended_replace_vars->determine_for_term( $taxonomy ); + + return $recommended_replace_vars->get_recommended_replacevars_for( $page_type ); + } + + /** + * Returns an array with shortcode tags for all registered shortcodes. + * + * @return array Array with shortcode tags. + */ + private function get_valid_shortcode_tags() { + $shortcode_tags = []; + + foreach ( $GLOBALS['shortcode_tags'] as $tag => $description ) { + $shortcode_tags[] = $tag; + } + + return $shortcode_tags; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-addon-data.php b/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-addon-data.php new file mode 100644 index 00000000..0cbc27c7 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-addon-data.php @@ -0,0 +1,126 @@ +is_installed( WPSEO_Addon_Manager::LOCAL_SLUG ) ) { + $addon_settings = $this->get_local_addon_settings( $addon_settings, 'wpseo_local', WPSEO_Addon_Manager::LOCAL_SLUG, $this->local_include_list ); + } + + if ( $addon_manager->is_installed( WPSEO_Addon_Manager::WOOCOMMERCE_SLUG ) ) { + $addon_settings = $this->get_addon_settings( $addon_settings, 'wpseo_woo', WPSEO_Addon_Manager::WOOCOMMERCE_SLUG, $this->woo_include_list ); + } + + if ( $addon_manager->is_installed( WPSEO_Addon_Manager::NEWS_SLUG ) ) { + $addon_settings = $this->get_addon_settings( $addon_settings, 'wpseo_news', WPSEO_Addon_Manager::NEWS_SLUG, $this->news_include_list ); + } + + if ( $addon_manager->is_installed( WPSEO_Addon_Manager::VIDEO_SLUG ) ) { + $addon_settings = $this->get_addon_settings( $addon_settings, 'wpseo_video', WPSEO_Addon_Manager::VIDEO_SLUG, $this->video_include_list ); + } + + return $addon_settings; + } + + /** + * Gets the tracked options from the addon + * + * @param array $addon_settings The current list of addon settings. + * @param string $source_name The option key of the addon. + * @param string $slug The addon slug. + * @param array $option_include_list All the options to be included in tracking. + * + * @return array + */ + public function get_addon_settings( array $addon_settings, $source_name, $slug, $option_include_list ) { + $source_options = get_option( $source_name, [] ); + if ( ! is_array( $source_options ) || empty( $source_options ) ) { + return $addon_settings; + } + $addon_settings[ $slug ] = array_intersect_key( $source_options, array_flip( $option_include_list ) ); + + return $addon_settings; + } + + /** + * Filter business_type in local addon settings. + * + * Remove the business_type setting when 'multiple_locations_shared_business_info' setting is turned off. + * + * @param array $addon_settings The current list of addon settings. + * @param string $source_name The option key of the addon. + * @param string $slug The addon slug. + * @param array $option_include_list All the options to be included in tracking. + * + * @return array + */ + public function get_local_addon_settings( array $addon_settings, $source_name, $slug, $option_include_list ) { + $source_options = get_option( $source_name, [] ); + if ( ! is_array( $source_options ) || empty( $source_options ) ) { + return $addon_settings; + } + $addon_settings[ $slug ] = array_intersect_key( $source_options, array_flip( $option_include_list ) ); + + if ( array_key_exists( 'use_multiple_locations', $source_options ) && array_key_exists( 'business_type', $addon_settings[ $slug ] ) && $source_options['use_multiple_locations'] === 'on' && $source_options['multiple_locations_shared_business_info'] === 'off' ) { + $addon_settings[ $slug ]['business_type'] = 'multiple_locations'; + } + + if ( ! ( new WooCommerce_Conditional() )->is_met() ) { + unset( $addon_settings[ $slug ]['woocommerce_local_pickup_setting'] ); + } + + return $addon_settings; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-default-data.php b/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-default-data.php new file mode 100644 index 00000000..498e7d08 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-default-data.php @@ -0,0 +1,60 @@ + get_option( 'blogname' ), + '@timestamp' => (int) gmdate( 'Uv' ), + 'wpVersion' => $this->get_wordpress_version(), + 'homeURL' => home_url(), + 'adminURL' => admin_url(), + 'isMultisite' => is_multisite(), + 'siteLanguage' => get_bloginfo( 'language' ), + 'gmt_offset' => get_option( 'gmt_offset' ), + 'timezoneString' => get_option( 'timezone_string' ), + 'migrationStatus' => get_option( 'yoast_migrations_free' ), + 'countPosts' => $this->get_post_count( 'post' ), + 'countPages' => $this->get_post_count( 'page' ), + ]; + } + + /** + * Returns the number of posts of a certain type. + * + * @param string $post_type The post type return the count for. + * + * @return int The count for this post type. + */ + protected function get_post_count( $post_type ) { + $count = wp_count_posts( $post_type ); + if ( isset( $count->publish ) ) { + return $count->publish; + } + return 0; + } + + /** + * Returns the WordPress version. + * + * @return string The version. + */ + protected function get_wordpress_version() { + global $wp_version; + + return $wp_version; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-plugin-data.php b/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-plugin-data.php new file mode 100644 index 00000000..2c585e1d --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-plugin-data.php @@ -0,0 +1,90 @@ + $this->get_plugin_data(), + ]; + } + + /** + * Returns all plugins. + * + * @return array The formatted plugins. + */ + protected function get_plugin_data() { + + if ( ! function_exists( 'get_plugin_data' ) ) { + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + } + $plugins = wp_get_active_and_valid_plugins(); + + $plugins = array_map( 'get_plugin_data', $plugins ); + $this->set_auto_update_plugin_list(); + $plugins = array_map( [ $this, 'format_plugin' ], $plugins ); + + $plugin_data = []; + foreach ( $plugins as $plugin ) { + $plugin_key = sanitize_title( $plugin['name'] ); + $plugin_data[ $plugin_key ] = $plugin; + } + + return $plugin_data; + } + + /** + * Sets all auto updating plugin data so it can be used in the tracking list. + * + * @return void + */ + public function set_auto_update_plugin_list() { + + $auto_update_plugins = []; + $auto_update_plugin_files = get_option( 'auto_update_plugins' ); + if ( $auto_update_plugin_files ) { + foreach ( $auto_update_plugin_files as $auto_update_plugin ) { + $data = get_plugin_data( WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $auto_update_plugin ); + $auto_update_plugins[ $data['Name'] ] = $data; + } + } + + $this->auto_update_plugin_list = $auto_update_plugins; + } + + /** + * Formats the plugin array. + * + * @param array $plugin The plugin details. + * + * @return array The formatted array. + */ + protected function format_plugin( array $plugin ) { + + return [ + 'name' => $plugin['Name'], + 'version' => $plugin['Version'], + 'auto_updating' => array_key_exists( $plugin['Name'], $this->auto_update_plugin_list ), + ]; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-server-data.php b/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-server-data.php new file mode 100644 index 00000000..220753f1 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-server-data.php @@ -0,0 +1,85 @@ + $this->get_server_data(), + ]; + } + + /** + * Returns the values with server details. + * + * @return array Array with the value. + */ + protected function get_server_data() { + $server_data = []; + + // Validate if the server address is a valid IP-address. + $ipaddress = isset( $_SERVER['SERVER_ADDR'] ) ? filter_var( wp_unslash( $_SERVER['SERVER_ADDR'] ), FILTER_VALIDATE_IP ) : ''; + if ( $ipaddress ) { + $server_data['ip'] = $ipaddress; + $server_data['Hostname'] = gethostbyaddr( $ipaddress ); + } + + $server_data['os'] = function_exists( 'php_uname' ) ? php_uname() : PHP_OS; + $server_data['PhpVersion'] = PHP_VERSION; + $server_data['CurlVersion'] = $this->get_curl_info(); + $server_data['PhpExtensions'] = $this->get_php_extensions(); + + return $server_data; + } + + /** + * Returns details about the curl version. + * + * @return array|null The curl info. Or null when curl isn't available.. + */ + protected function get_curl_info() { + if ( ! function_exists( 'curl_version' ) ) { + return null; + } + + $curl = curl_version(); + + $ssl_support = true; + if ( ! $curl['features'] && CURL_VERSION_SSL ) { + $ssl_support = false; + } + + return [ + 'version' => $curl['version'], + 'sslSupport' => $ssl_support, + ]; + } + + /** + * Returns a list with php extensions. + * + * @return array Returns the state of the php extensions. + */ + protected function get_php_extensions() { + return [ + 'imagick' => extension_loaded( 'imagick' ), + 'filter' => extension_loaded( 'filter' ), + 'bcmath' => extension_loaded( 'bcmath' ), + 'pcre' => extension_loaded( 'pcre' ), + 'xml' => extension_loaded( 'xml' ), + 'pdo_mysql' => extension_loaded( 'pdo_mysql' ), + ]; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-settings-data.php b/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-settings-data.php new file mode 100644 index 00000000..45e25d35 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-settings-data.php @@ -0,0 +1,277 @@ +include_list = apply_filters( 'wpseo_tracking_settings_include_list', $this->include_list ); + + $options = WPSEO_Options::get_all(); + // Returns the settings of which the keys intersect with the values of the include list. + $options = array_intersect_key( $options, array_flip( $this->include_list ) ); + + return [ + 'settings' => $this->anonymize_settings( $options ), + ]; + } + + /** + * Anonimizes the WPSEO_Options array by replacing all $anonymous_settings values to 'used'. + * + * @param array $settings The settings. + * + * @return array The anonymized settings. + */ + private function anonymize_settings( $settings ) { + foreach ( $this->anonymous_settings as $setting ) { + if ( ! empty( $settings[ $setting ] ) ) { + $settings[ $setting ] = 'used'; + } + } + + return $settings; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-theme-data.php b/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-theme-data.php new file mode 100644 index 00000000..e2225950 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking-theme-data.php @@ -0,0 +1,51 @@ + [ + 'name' => $theme->get( 'Name' ), + 'url' => $theme->get( 'ThemeURI' ), + 'version' => $theme->get( 'Version' ), + 'author' => [ + 'name' => $theme->get( 'Author' ), + 'url' => $theme->get( 'AuthorURI' ), + ], + 'parentTheme' => $this->get_parent_theme( $theme ), + 'blockTemplateSupport' => current_theme_supports( 'block-templates' ), + 'isBlockTheme' => function_exists( 'wp_is_block_theme' ) && wp_is_block_theme(), + ], + ]; + } + + /** + * Returns the name of the parent theme. + * + * @param WP_Theme $theme The theme object. + * + * @return string|null The name of the parent theme or null. + */ + private function get_parent_theme( WP_Theme $theme ) { + if ( is_child_theme() ) { + return $theme->get( 'Template' ); + } + + return null; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking.php b/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking.php new file mode 100644 index 00000000..58bfdff3 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/tracking/class-tracking.php @@ -0,0 +1,240 @@ +tracking_enabled() ) { + return; + } + + $this->endpoint = $endpoint; + $this->threshold = $threshold; + $this->current_time = time(); + } + + /** + * Registers all hooks to WordPress. + * + * @return void + */ + public function register_hooks() { + if ( ! $this->tracking_enabled() ) { + return; + } + + // Send tracking data on `admin_init`. + add_action( 'admin_init', [ $this, 'send' ], 1 ); + + // Add an action hook that will be triggered at the specified time by `wp_schedule_single_event()`. + add_action( 'wpseo_send_tracking_data_after_core_update', [ $this, 'send' ] ); + // Call `wp_schedule_single_event()` after a WordPress core update. + add_action( 'upgrader_process_complete', [ $this, 'schedule_tracking_data_sending' ], 10, 2 ); + } + + /** + * Schedules a new sending of the tracking data after a WordPress core update. + * + * @param bool|WP_Upgrader $upgrader Optional. WP_Upgrader instance or false. + * Depending on context, it might be a Theme_Upgrader, + * Plugin_Upgrader, Core_Upgrade, or Language_Pack_Upgrader. + * instance. Default false. + * @param array $data Array of update data. + * + * @return void + */ + public function schedule_tracking_data_sending( $upgrader = false, $data = [] ) { + // Return if it's not a WordPress core update. + if ( ! $upgrader || ! isset( $data['type'] ) || $data['type'] !== 'core' ) { + return; + } + + /* + * To uniquely identify the scheduled cron event, `wp_next_scheduled()` + * needs to receive the same arguments as those used when originally + * scheduling the event otherwise it will always return false. + */ + if ( ! wp_next_scheduled( 'wpseo_send_tracking_data_after_core_update', [ true ] ) ) { + /* + * Schedule sending of data tracking 6 hours after a WordPress core + * update. Pass a `true` parameter for the callback `$force` argument. + */ + wp_schedule_single_event( ( time() + ( HOUR_IN_SECONDS * 6 ) ), 'wpseo_send_tracking_data_after_core_update', [ true ] ); + } + } + + /** + * Sends the tracking data. + * + * @param bool $force Whether to send the tracking data ignoring the two + * weeks time threshold. Default false. + * + * @return void + */ + public function send( $force = false ) { + if ( ! $this->should_send_tracking( $force ) ) { + return; + } + + // Set a 'content-type' header of 'application/json'. + $tracking_request_args = [ + 'headers' => [ + 'content-type:' => 'application/json', + ], + ]; + + $collector = $this->get_collector(); + + $request = new WPSEO_Remote_Request( $this->endpoint, $tracking_request_args ); + $request->set_body( $collector->get_as_json() ); + $request->send(); + + update_option( $this->option_name, $this->current_time, 'yes' ); + } + + /** + * Determines whether to send the tracking data. + * + * Returns false if tracking is disabled or the current page is one of the + * admin plugins pages. Returns true when there's no tracking data stored or + * the data was sent more than two weeks ago. The two weeks interval is set + * when instantiating the class. + * + * @param bool $ignore_time_treshhold Whether to send the tracking data ignoring + * the two weeks time treshhold. Default false. + * + * @return bool True when tracking data should be sent. + */ + protected function should_send_tracking( $ignore_time_treshhold = false ) { + global $pagenow; + + // Only send tracking on the main site of a multi-site instance. This returns true on non-multisite installs. + if ( is_network_admin() || ! is_main_site() ) { + return false; + } + + // Because we don't want to possibly block plugin actions with our routines. + if ( in_array( $pagenow, [ 'plugins.php', 'plugin-install.php', 'plugin-editor.php' ], true ) ) { + return false; + } + + $last_time = get_option( $this->option_name ); + + // When tracking data haven't been sent yet or when sending data is forced. + if ( ! $last_time || $ignore_time_treshhold ) { + return true; + } + + return $this->exceeds_treshhold( $this->current_time - $last_time ); + } + + /** + * Checks if the given amount of seconds exceeds the set threshold. + * + * @param int $seconds The amount of seconds to check. + * + * @return bool True when seconds is bigger than threshold. + */ + protected function exceeds_treshhold( $seconds ) { + return ( $seconds > $this->threshold ); + } + + /** + * Returns the collector for collecting the data. + * + * @return WPSEO_Collector The instance of the collector. + */ + public function get_collector() { + $collector = new WPSEO_Collector(); + $collector->add_collection( new WPSEO_Tracking_Default_Data() ); + $collector->add_collection( new WPSEO_Tracking_Server_Data() ); + $collector->add_collection( new WPSEO_Tracking_Theme_Data() ); + $collector->add_collection( new WPSEO_Tracking_Plugin_Data() ); + $collector->add_collection( new WPSEO_Tracking_Settings_Data() ); + $collector->add_collection( new WPSEO_Tracking_Addon_Data() ); + $collector->add_collection( YoastSEO()->classes->get( Missing_Indexables_Collector::class ) ); + $collector->add_collection( YoastSEO()->classes->get( To_Be_Cleaned_Indexables_Collector::class ) ); + + return $collector; + } + + /** + * See if we should run tracking at all. + * + * @return bool True when we can track, false when we can't. + */ + private function tracking_enabled() { + // Check if we're allowing tracking. + $tracking = WPSEO_Options::get( 'tracking' ); + + if ( $tracking === false ) { + return false; + } + + // Save this state. + if ( $tracking === null ) { + /** + * Filter: 'wpseo_enable_tracking' - Enables the data tracking of Yoast SEO Premium and add-ons. + * + * @param string $is_enabled The enabled state. Default is false. + */ + $tracking = apply_filters( 'wpseo_enable_tracking', false ); + + WPSEO_Options::set( 'tracking', $tracking ); + } + + if ( $tracking === false ) { + return false; + } + + if ( ! YoastSEO()->helpers->environment->is_production_mode() ) { + return false; + } + + return true; + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/views/class-yoast-feature-toggle.php b/wp-content/plugins/wordpress-seo/admin/views/class-yoast-feature-toggle.php new file mode 100644 index 00000000..ea61a73b --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/views/class-yoast-feature-toggle.php @@ -0,0 +1,206 @@ + $value ) { + if ( property_exists( $this, $key ) ) { + $this->$key = $value; + } + } + } + + /** + * Magic isset-er. + * + * @param string $key Key to check whether a value for it is set. + * + * @return bool True if set, false otherwise. + */ + public function __isset( $key ) { + return isset( $this->$key ); + } + + /** + * Magic getter. + * + * @param string $key Key to get the value for. + * + * @return mixed Value for the key, or null if not set. + */ + public function __get( $key ) { + if ( isset( $this->$key ) ) { + return $this->$key; + } + + return null; + } + + /** + * Checks whether the feature for this toggle is enabled. + * + * @return bool True if the feature is enabled, false otherwise. + */ + public function is_enabled() { + return (bool) WPSEO_Options::get( $this->setting ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/views/class-yoast-feature-toggles.php b/wp-content/plugins/wordpress-seo/admin/views/class-yoast-feature-toggles.php new file mode 100644 index 00000000..a4efc0d5 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/views/class-yoast-feature-toggles.php @@ -0,0 +1,284 @@ +toggles === null ) { + $this->toggles = $this->load_toggles(); + } + + return $this->toggles; + } + + /** + * Loads the available feature toggles. + * + * Also ensures that the toggles are all Yoast_Feature_Toggle instances and sorted by their order value. + * + * @return array List of sorted Yoast_Feature_Toggle instances. + */ + protected function load_toggles() { + $xml_sitemap_extra = false; + if ( WPSEO_Options::get( 'enable_xml_sitemap' ) ) { + $xml_sitemap_extra = '' . esc_html__( 'See the XML sitemap.', 'wordpress-seo' ) . ''; + } + + $feature_toggles = [ + (object) [ + 'name' => __( 'SEO analysis', 'wordpress-seo' ), + 'setting' => 'keyword_analysis_active', + 'label' => __( 'The SEO analysis offers suggestions to improve the SEO of your text.', 'wordpress-seo' ), + 'read_more_label' => __( 'Learn how the SEO analysis can help you rank.', 'wordpress-seo' ), + 'read_more_url' => 'https://yoa.st/2ak', + 'order' => 10, + ], + (object) [ + 'name' => __( 'Readability analysis', 'wordpress-seo' ), + 'setting' => 'content_analysis_active', + 'label' => __( 'The readability analysis offers suggestions to improve the structure and style of your text.', 'wordpress-seo' ), + 'read_more_label' => __( 'Discover why readability is important for SEO.', 'wordpress-seo' ), + 'read_more_url' => 'https://yoa.st/2ao', + 'order' => 20, + ], + (object) [ + 'name' => __( 'Inclusive language analysis', 'wordpress-seo' ), + 'supported_languages' => Language_Helper::$languages_with_inclusive_language_support, + 'setting' => 'inclusive_language_analysis_active', + 'label' => __( 'The inclusive language analysis offers suggestions to write more inclusive copy.', 'wordpress-seo' ), + 'read_more_label' => __( 'Discover why inclusive language is important for SEO.', 'wordpress-seo' ), + 'read_more_url' => 'https://yoa.st/inclusive-language-features-free', + 'order' => 25, + ], + (object) [ + 'name' => __( 'Cornerstone content', 'wordpress-seo' ), + 'setting' => 'enable_cornerstone_content', + 'label' => __( 'The cornerstone content feature lets you to mark and filter cornerstone content on your website.', 'wordpress-seo' ), + 'read_more_label' => __( 'Find out how cornerstone content can help you improve your site structure.', 'wordpress-seo' ), + 'read_more_url' => 'https://yoa.st/dashboard-help-cornerstone', + 'order' => 30, + ], + (object) [ + 'name' => __( 'Text link counter', 'wordpress-seo' ), + 'setting' => 'enable_text_link_counter', + 'label' => __( 'The text link counter helps you improve your site structure.', 'wordpress-seo' ), + 'read_more_label' => __( 'Find out how the text link counter can enhance your SEO.', 'wordpress-seo' ), + 'read_more_url' => 'https://yoa.st/2aj', + 'order' => 40, + ], + (object) [ + 'name' => __( 'Insights', 'wordpress-seo' ), + 'setting' => 'enable_metabox_insights', + 'label' => __( 'Find relevant data about your content right in the Insights section in the Yoast SEO metabox. You’ll see what words you use most often and if they’re a match with your keywords! ', 'wordpress-seo' ), + 'read_more_label' => __( 'Find out how Insights can help you improve your content.', 'wordpress-seo' ), + 'read_more_url' => 'https://yoa.st/4ew', + 'premium_url' => 'https://yoa.st/2ai', + 'order' => 41, + ], + (object) [ + 'name' => __( 'Link suggestions', 'wordpress-seo' ), + 'premium' => true, + 'setting' => 'enable_link_suggestions', + 'label' => __( 'Get relevant internal linking suggestions — while you’re writing! The link suggestions metabox shows a list of posts on your blog with similar content that might be interesting to link to. ', 'wordpress-seo' ), + 'read_more_label' => __( 'Read more about how internal linking can improve your site structure.', 'wordpress-seo' ), + 'read_more_url' => 'https://yoa.st/4ev', + 'premium_url' => 'https://yoa.st/17g', + 'premium_upsell_url' => 'https://yoa.st/get-link-suggestions', + 'order' => 42, + ], + (object) [ + 'name' => __( 'XML sitemaps', 'wordpress-seo' ), + 'setting' => 'enable_xml_sitemap', + /* translators: %s: Yoast SEO */ + 'label' => sprintf( __( 'Enable the XML sitemaps that %s generates.', 'wordpress-seo' ), 'Yoast SEO' ), + 'read_more_label' => __( 'Read why XML Sitemaps are important for your site.', 'wordpress-seo' ), + 'read_more_url' => 'https://yoa.st/2a-', + 'extra' => $xml_sitemap_extra, + 'after' => $this->sitemaps_toggle_after(), + 'order' => 60, + ], + (object) [ + 'name' => __( 'Admin bar menu', 'wordpress-seo' ), + 'setting' => 'enable_admin_bar_menu', + /* translators: 1: Yoast SEO */ + 'label' => sprintf( __( 'The %1$s admin bar menu contains useful links to third-party tools for analyzing pages and makes it easy to see if you have new notifications.', 'wordpress-seo' ), 'Yoast SEO' ), + 'order' => 80, + ], + (object) [ + 'name' => __( 'Security: no advanced or schema settings for authors', 'wordpress-seo' ), + 'setting' => 'disableadvanced_meta', + 'label' => sprintf( + /* translators: 1: Yoast SEO, 2: translated version of "Off" */ + __( 'The advanced section of the %1$s meta box allows a user to remove posts from the search results or change the canonical. The settings in the schema tab allows a user to change schema meta data for a post. These are things you might not want any author to do. That\'s why, by default, only editors and administrators can do this. Setting to "%2$s" allows all users to change these settings.', 'wordpress-seo' ), + 'Yoast SEO', + __( 'Off', 'wordpress-seo' ) + ), + 'order' => 90, + ], + (object) [ + 'name' => __( 'Usage tracking', 'wordpress-seo' ), + 'label' => __( 'Usage tracking', 'wordpress-seo' ), + 'setting' => 'tracking', + 'read_more_label' => sprintf( + /* translators: 1: Yoast SEO */ + __( 'Allow us to track some data about your site to improve our plugin.', 'wordpress-seo' ), + 'Yoast SEO' + ), + 'read_more_url' => 'https://yoa.st/usage-tracking-2', + 'order' => 95, + ], + (object) [ + 'name' => __( 'REST API: Head endpoint', 'wordpress-seo' ), + 'setting' => 'enable_headless_rest_endpoints', + 'label' => sprintf( + /* translators: 1: Yoast SEO */ + __( 'This %1$s REST API endpoint gives you all the metadata you need for a specific URL. This will make it very easy for headless WordPress sites to use %1$s for all their SEO meta output.', 'wordpress-seo' ), + 'Yoast SEO' + ), + 'order' => 100, + ], + (object) [ + 'name' => __( 'Enhanced Slack sharing', 'wordpress-seo' ), + 'setting' => 'enable_enhanced_slack_sharing', + 'label' => __( 'This adds an author byline and reading time estimate to the article’s snippet when shared on Slack.', 'wordpress-seo' ), + 'read_more_label' => __( 'Find out how a rich snippet can improve visibility and click-through-rate.', 'wordpress-seo' ), + 'read_more_url' => 'https://yoa.st/help-slack-share', + 'order' => 105, + ], + (object) [ + 'name' => __( 'IndexNow', 'wordpress-seo' ), + 'premium' => true, + 'setting' => 'enable_index_now', + 'label' => __( 'Automatically ping search engines like Bing and Yandex whenever you publish, update or delete a post.', 'wordpress-seo' ), + 'read_more_label' => __( 'Find out how IndexNow can help your site.', 'wordpress-seo' ), + 'read_more_url' => 'https://yoa.st/index-now-read-more', + 'premium_url' => 'https://yoa.st/index-now-feature', + 'premium_upsell_url' => 'https://yoa.st/get-indexnow', + 'order' => 110, + ], + (object) [ + 'name' => __( 'AI title & description generator', 'wordpress-seo' ), + 'premium' => true, + 'setting' => 'enable_ai_generator', + 'label' => __( 'Use the power of Yoast AI to automatically generate compelling titles and descriptions for your posts and pages.', 'wordpress-seo' ), + 'read_more_label' => __( 'Learn more', 'wordpress-seo' ), + 'read_more_url' => 'https://yoa.st/ai-generator-read-more', + 'premium_url' => 'https://yoa.st/ai-generator-feature', + 'premium_upsell_url' => 'https://yoa.st/get-ai-generator', + 'order' => 115, + ], + ]; + + /** + * Filter to add feature toggles from add-ons. + * + * @param array $feature_toggles Array with feature toggle objects where each object + * should have a `name`, `setting` and `label` property. + */ + $feature_toggles = apply_filters( 'wpseo_feature_toggles', $feature_toggles ); + + $feature_toggles = array_map( [ $this, 'ensure_toggle' ], $feature_toggles ); + usort( $feature_toggles, [ $this, 'sort_toggles_callback' ] ); + + return $feature_toggles; + } + + /** + * Returns html for a warning that core sitemaps are enabled when yoast seo sitemaps are disabled. + * + * @return string HTML string for the warning. + */ + protected function sitemaps_toggle_after() { + $out = ''; + + return $out; + } + + /** + * Ensures that the passed value is a Yoast_Feature_Toggle. + * + * @param Yoast_Feature_Toggle|object|array $toggle_data Feature toggle instance, or raw object or array + * containing feature toggle data. + * @return Yoast_Feature_Toggle Feature toggle instance based on $toggle_data. + */ + protected function ensure_toggle( $toggle_data ) { + if ( $toggle_data instanceof Yoast_Feature_Toggle ) { + return $toggle_data; + } + + if ( is_object( $toggle_data ) ) { + $toggle_data = get_object_vars( $toggle_data ); + } + + return new Yoast_Feature_Toggle( $toggle_data ); + } + + /** + * Callback for sorting feature toggles by their order. + * + * {@internal Once the minimum PHP version goes up to PHP 7.0, the logic in the function + * can be replaced with the spaceship operator `<=>`.} + * + * @param Yoast_Feature_Toggle $feature_a Feature A. + * @param Yoast_Feature_Toggle $feature_b Feature B. + * + * @return int An integer less than, equal to, or greater than zero indicating respectively + * that feature A is considered to be less than, equal to, or greater than feature B. + */ + protected function sort_toggles_callback( Yoast_Feature_Toggle $feature_a, Yoast_Feature_Toggle $feature_b ) { + return ( $feature_a->order - $feature_b->order ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/views/class-yoast-input-select.php b/wp-content/plugins/wordpress-seo/admin/views/class-yoast-input-select.php new file mode 100644 index 00000000..1f2a1735 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/views/class-yoast-input-select.php @@ -0,0 +1,146 @@ +select_id = $select_id; + $this->select_name = $select_name; + $this->select_options = $select_options; + $this->selected_option = $selected_option; + } + + /** + * Print the rendered view. + * + * @return void + */ + public function output_html() { + // Extract it, because we want each value accessible via a variable instead of accessing it as an array. + extract( $this->get_select_values() ); + + require WPSEO_PATH . 'admin/views/form/select.php'; + } + + /** + * Return the rendered view. + * + * @return string + */ + public function get_html() { + ob_start(); + + $this->output_html(); + + $rendered_output = ob_get_contents(); + ob_end_clean(); + + return $rendered_output; + } + + /** + * Add an attribute to the attributes property. + * + * @param string $attribute The name of the attribute to add. + * @param string $value The value of the attribute. + * + * @return void + */ + public function add_attribute( $attribute, $value ) { + $this->select_attributes[ $attribute ] = $value; + } + + /** + * Return the set fields for the select. + * + * @return array + */ + private function get_select_values() { + return [ + 'id' => $this->select_id, + 'name' => $this->select_name, + 'attributes' => $this->get_attributes(), + 'options' => $this->select_options, + 'selected' => $this->selected_option, + ]; + } + + /** + * Return the attribute string, when there are attributes set. + * + * @return string + */ + private function get_attributes() { + $attributes = $this->select_attributes; + + if ( ! empty( $attributes ) ) { + array_walk( $attributes, [ $this, 'parse_attribute' ] ); + + return implode( ' ', $attributes ) . ' '; + } + + return ''; + } + + /** + * Get an attribute from the attributes. + * + * @param string $value The value of the attribute. + * @param string $attribute The attribute to look for. + * + * @return void + */ + private function parse_attribute( &$value, $attribute ) { + $value = sprintf( '%s="%s"', sanitize_key( $attribute ), esc_attr( $value ) ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/views/class-yoast-integration-toggles.php b/wp-content/plugins/wordpress-seo/admin/views/class-yoast-integration-toggles.php new file mode 100644 index 00000000..ac66ee0f --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/views/class-yoast-integration-toggles.php @@ -0,0 +1,139 @@ +toggles === null ) { + $this->toggles = $this->load_toggles(); + } + + return $this->toggles; + } + + /** + * Loads the available integration toggles. + * + * Also ensures that the toggles are all Yoast_Feature_Toggle instances and sorted by their order value. + * + * @return array List of sorted Yoast_Feature_Toggle instances. + */ + protected function load_toggles() { + $integration_toggles = [ + (object) [ + /* translators: %s: 'Semrush' */ + 'name' => sprintf( __( '%s integration', 'wordpress-seo' ), 'Semrush' ), + 'setting' => 'semrush_integration_active', + 'label' => sprintf( + /* translators: %s: 'Semrush' */ + __( 'The %s integration offers suggestions and insights for keywords related to the entered focus keyphrase.', 'wordpress-seo' ), + 'Semrush' + ), + 'order' => 10, + ], + (object) [ + /* translators: %s: Algolia. */ + 'name' => sprintf( esc_html__( '%s integration', 'wordpress-seo' ), 'Algolia' ), + 'premium' => true, + 'setting' => 'algolia_integration_active', + 'label' => __( 'Improve the quality of your site search! Automatically helps your users find your cornerstone and most important content in your internal search results. It also removes noindexed posts & pages from your site’s search results.', 'wordpress-seo' ), + /* translators: %s: Algolia. */ + 'read_more_label' => sprintf( __( 'Find out more about our %s integration.', 'wordpress-seo' ), 'Algolia' ), + 'read_more_url' => 'https://yoa.st/4eu', + 'premium_url' => 'https://yoa.st/4ex', + 'premium_upsell_url' => 'https://yoa.st/get-algolia-integration', + 'order' => 25, + ], + ]; + + /** + * Filter to add integration toggles from add-ons. + * + * @param array $integration_toggles Array with integration toggle objects where each object + * should have a `name`, `setting` and `label` property. + */ + $integration_toggles = apply_filters( 'wpseo_integration_toggles', $integration_toggles ); + + $integration_toggles = array_map( [ $this, 'ensure_toggle' ], $integration_toggles ); + usort( $integration_toggles, [ $this, 'sort_toggles_callback' ] ); + + return $integration_toggles; + } + + /** + * Ensures that the passed value is a Yoast_Feature_Toggle. + * + * @param Yoast_Feature_Toggle|object|array $toggle_data Feature toggle instance, or raw object or array + * containing integration toggle data. + * @return Yoast_Feature_Toggle Feature toggle instance based on $toggle_data. + */ + protected function ensure_toggle( $toggle_data ) { + if ( $toggle_data instanceof Yoast_Feature_Toggle ) { + return $toggle_data; + } + + if ( is_object( $toggle_data ) ) { + $toggle_data = get_object_vars( $toggle_data ); + } + + return new Yoast_Feature_Toggle( $toggle_data ); + } + + /** + * Callback for sorting integration toggles by their order. + * + * {@internal Once the minimum PHP version goes up to PHP 7.0, the logic in the function + * can be replaced with the spaceship operator `<=>`.} + * + * @param Yoast_Feature_Toggle $feature_a Feature A. + * @param Yoast_Feature_Toggle $feature_b Feature B. + * + * @return int An integer less than, equal to, or greater than zero indicating respectively + * that feature A is considered to be less than, equal to, or greater than feature B. + */ + protected function sort_toggles_callback( Yoast_Feature_Toggle $feature_a, Yoast_Feature_Toggle $feature_b ) { + return ( $feature_a->order - $feature_b->order ); + } +} diff --git a/wp-content/plugins/wordpress-seo/admin/views/form/select.php b/wp-content/plugins/wordpress-seo/admin/views/form/select.php new file mode 100644 index 00000000..8f3a846c --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/views/form/select.php @@ -0,0 +1,26 @@ + + + diff --git a/wp-content/plugins/wordpress-seo/admin/views/interface-yoast-form-element.php b/wp-content/plugins/wordpress-seo/admin/views/interface-yoast-form-element.php new file mode 100644 index 00000000..24a8ccb3 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/views/interface-yoast-form-element.php @@ -0,0 +1,19 @@ + + + + + diff --git a/wp-content/plugins/wordpress-seo/admin/views/licenses.php b/wp-content/plugins/wordpress-seo/admin/views/licenses.php new file mode 100644 index 00000000..69618cbe --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/views/licenses.php @@ -0,0 +1,395 @@ + WPSEO_Shortlinker::get( 'https://yoa.st/zz' ), + 'infoUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zy' ), + 'title' => 'Yoast SEO Premium', + /* translators: %1$s expands to Yoast SEO */ + 'desc' => sprintf( __( 'The premium version of %1$s with more features & support.', 'wordpress-seo' ), 'Yoast SEO' ), + 'image' => plugin_dir_url( WPSEO_FILE ) . 'packages/js/images/Yoast_SEO_Icon.svg', + 'benefits' => [], +]; + +$extensions = [ + WPSEO_Addon_Manager::LOCAL_SLUG => [ + 'buyUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zt' ), + 'infoUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zs' ), + 'title' => 'Local SEO', + 'display_title' => __( 'Stand out for local searches', 'wordpress-seo' ), + 'desc' => __( 'Rank better locally and in Google Maps, without breaking a sweat!', 'wordpress-seo' ), + 'image' => plugins_url( 'images/local_plugin_assistant.svg?v=' . WPSEO_VERSION, WPSEO_FILE ), + 'benefits' => [ + __( 'Attract more customers to your site and physical store', 'wordpress-seo' ), + __( 'Automatically get technical SEO best practices for local businesses', 'wordpress-seo' ), + __( 'Easily add maps, address finders, and opening hours to your content', 'wordpress-seo' ), + __( 'Optimize your business for multiple locations', 'wordpress-seo' ), + ], + ], + WPSEO_Addon_Manager::VIDEO_SLUG => [ + 'buyUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zx/' ), + 'infoUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zw/' ), + 'title' => 'Video SEO', + 'display_title' => __( 'Drive more views to your videos', 'wordpress-seo' ), + 'desc' => __( 'Optimize your videos to show them off in search results and get more clicks!', 'wordpress-seo' ), + 'image' => plugins_url( 'images/video_plugin_assistant.svg?v=' . WPSEO_VERSION, WPSEO_FILE ), + 'benefits' => [ + __( 'Automatically get technical SEO best practices for video content', 'wordpress-seo' ), + __( 'Make sure your videos load quickly for users', 'wordpress-seo' ), + __( 'Make your videos responsive for all screen sizes', 'wordpress-seo' ), + __( 'Optimize your video previews & thumbnails', 'wordpress-seo' ), + ], + ], + WPSEO_Addon_Manager::NEWS_SLUG => [ + 'buyUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zv/' ), + 'infoUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zu/' ), + 'title' => 'News SEO', + 'display_title' => __( 'Rank higher in Google\'s news carousel', 'wordpress-seo' ), + 'desc' => __( 'Are you in Google News? Increase your traffic from Google News by optimizing for it!', 'wordpress-seo' ), + 'image' => plugins_url( 'images/news_plugin_assistant.svg?v=' . WPSEO_VERSION, WPSEO_FILE ), + 'benefits' => [ + __( 'Optimize your site for Google News', 'wordpress-seo' ), + __( 'Ping Google on the publication of a new post', 'wordpress-seo' ), + __( 'Add all necessary schema.org markup', 'wordpress-seo' ), + __( 'Get XML sitemaps', 'wordpress-seo' ), + ], + ], +]; + +// Add Yoast WooCommerce SEO when WooCommerce is active. +if ( YoastSEO()->helpers->woocommerce->is_active() ) { + $extensions[ WPSEO_Addon_Manager::WOOCOMMERCE_SLUG ] = [ + 'buyUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zr' ), + 'infoUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zq' ), + 'title' => 'Yoast WooCommerce SEO', + 'display_title' => __( 'Drive more traffic to your online store', 'wordpress-seo' ), + /* translators: %1$s expands to Yoast SEO */ + 'desc' => sprintf( __( 'Seamlessly integrate WooCommerce with %1$s and get extra features!', 'wordpress-seo' ), 'Yoast SEO' ), + 'image' => plugins_url( 'images/woo_plugin_assistant.svg?v=' . WPSEO_VERSION, WPSEO_FILE ), + 'benefits' => [ + __( 'Write product pages that rank using the SEO analysis', 'wordpress-seo' ), + __( 'Increase Google clicks with rich results', 'wordpress-seo' ), + __( 'Add global identifiers for variable products', 'wordpress-seo' ), + /* translators: %1$s expands to Yoast SEO, %2$s expands to WooCommerce */ + sprintf( __( 'Seamless integration between %1$s and %2$s', 'wordpress-seo' ), 'Yoast SEO', 'WooCommerce' ), + __( 'Turn more visitors into customers!', 'wordpress-seo' ), + ], + 'buy_button' => 'WooCommerce SEO', + ]; +} + +// The total number of plugins to consider is the length of the array + 1 for Premium. +// @phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedVariableFound +$number_plugins_total = ( count( $extensions ) + 1 ); +// @phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedVariableFound +$number_plugins_active = 0; + +$extensions['yoast-seo-plugin-subscription'] = [ + 'buyUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/premium-page-bundle-buy' ), + 'infoUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/premium-page-bundle-info' ), + /* translators: used in phrases such as "More information about all the Yoast plugins" */ + 'title' => __( 'all the Yoast plugins', 'wordpress-seo' ), + 'display_title' => __( 'Cover all your SEO bases', 'wordpress-seo' ), + 'desc' => '', + 'image' => plugins_url( 'images/plugin_subscription.svg?v=' . WPSEO_VERSION, WPSEO_FILE ), + 'benefits' => [ + __( 'Get all 5 Yoast plugins for WordPress at a big discount', 'wordpress-seo' ), + __( 'Reach new customers who live near your business', 'wordpress-seo' ), + __( 'Drive more views to your videos', 'wordpress-seo' ), + __( 'Rank higher in Google\'s news carousel', 'wordpress-seo' ), + __( 'Drive more traffic to your online store', 'wordpress-seo' ), + + ], + /* translators: used in phrases such as "Buy all the Yoast plugins" */ + 'buy_button' => __( 'all the Yoast plugins', 'wordpress-seo' ), +]; + +$addon_manager = new WPSEO_Addon_Manager(); +$has_valid_premium_subscription = YoastSEO()->helpers->product->is_premium() && $addon_manager->has_valid_subscription( WPSEO_Addon_Manager::PREMIUM_SLUG ); + +/* translators: %1$s expands to Yoast SEO. */ +$wpseo_extensions_header = sprintf( __( '%1$s Extensions', 'wordpress-seo' ), 'Yoast SEO' ); +$new_tab_message = sprintf( + '%1$s', + /* translators: Hidden accessibility text. */ + esc_html__( '(Opens in a new browser tab)', 'wordpress-seo' ) +); + +$sale_badge = ''; +$premium_sale_badge = ''; + +if ( YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2023-promotion' ) ) { + /* translators: %1$s expands to opening span, %2$s expands to closing span */ + $sale_badge_span = sprintf( esc_html__( '%1$sSALE 30%% OFF!%2$s', 'wordpress-seo' ), '', '' ); + + $sale_badge = '
    ' . $sale_badge_span . '
    '; + + $premium_sale_badge = ( $has_valid_premium_subscription ) ? '' : $sale_badge; +} + +?> + +
    + +

    + +
    +
    + +

    + + +

    + +
      +
    • + ', + '' + ); + ?> +
    • +
    • + ', + '' + ); + ?> +
    • +
    • + ', + '' + ); + ?> +
    • +
    • + ', + '' + ); + ?> +
    • +
    • + ', + '' + ); + ?> +
    • +
    • + ', + '' + ); + ?> +
    • +
    + + is_installed( WPSEO_Addon_Manager::PREMIUM_SLUG ) ) : ?> +
    + + +
    + + + + +
    + + + + + + + + + '; + ?> + + + + + + + +

    + +

    + +
    + + + +
    +

    + ', + '', + 'Yoast SEO' + ); + ?> +

    + + $extension ) : + + // Skip the "All the plugins" card if the user has already all the plugins active. + if ( $slug === 'yoast-seo-plugin-subscription' && $number_plugins_active === $number_plugins_total ) { + continue; + } + ?> +
    + has_valid_subscription( $slug ) || ! $addon_manager->is_installed( $slug ) ) : ?> + + +

    + + +

    +
      + +
    • + +
    + +
    + is_installed( $slug ) ) : ?> +
    + + has_valid_subscription( $slug ) ) : + ++$number_plugins_active; + ?> +
    + + + + +
    + + + + + + + '; + ?> + + +

    + +

    + + + + + +
    +
    + +
    +
    + +
    diff --git a/wp-content/plugins/wordpress-seo/admin/views/paper-collapsible.php b/wp-content/plugins/wordpress-seo/admin/views/paper-collapsible.php new file mode 100644 index 00000000..e8e3fea4 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/views/paper-collapsible.php @@ -0,0 +1,79 @@ + +
    > + + %4$s%5$s ', + esc_attr( 'collapsible-header ' . $collapsible_header_class ), + // phpcs:ignore WordPress.Security.EscapeOutput -- $button_id_attr is escaped above. + $button_id_attr, + esc_attr( $collapsible_config['expanded'] ), + // phpcs:ignore WordPress.Security.EscapeOutput -- $help_text is an instance of WPSEO_Admin_Help_Panel, which escapes it's own output. + $help_text->get_button_html(), + esc_html( $title ) . wp_kses_post( $title_after ), + wp_kses_post( $collapsible_config['toggle_icon'] ) + ); + } + else { + echo '

    ', + esc_html( $title ), + wp_kses_post( $title_after ), + // phpcs:ignore WordPress.Security.EscapeOutput -- $help_text is an instance of WPSEO_Admin_Help_Panel, which escapes it's own output. + $help_text->get_button_html(), + '

    '; + } + } + ?> + get_panel_html(); + + $container_id_attr = ''; + if ( ! empty( $paper_id ) ) { + $container_id_attr = sprintf( ' id="%s"', esc_attr( $paper_id_prefix . $paper_id . '-container' ) ); + } + + printf( + '%3$s
    ', + // phpcs:ignore WordPress.Security.EscapeOutput -- $container_id_attr is escaped above. + $container_id_attr, + esc_attr( 'paper-container ' . $collapsible_config['class'] ), + $content + ); + ?> + + diff --git a/wp-content/plugins/wordpress-seo/admin/views/partial-notifications-errors.php b/wp-content/plugins/wordpress-seo/admin/views/partial-notifications-errors.php new file mode 100644 index 00000000..3db05a04 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/views/partial-notifications-errors.php @@ -0,0 +1,29 @@ +%1$s', + /* translators: Hidden accessibility text. */ + esc_html__( 'Hide this item.', 'wordpress-seo' ) + ); + break; + + case 'dismissed': + $button = sprintf( + '', + /* translators: Hidden accessibility text. */ + esc_html__( 'Show this item.', 'wordpress-seo' ) + ); + break; + } + + $notifications .= sprintf( + '
    %4$s%5$s
    ', + esc_attr( $notification->get_id() ), + esc_attr( $notification->get_nonce() ), + esc_attr( $notification->get_json() ), + // This needs to be fixed in https://github.com/Yoast/wordpress-seo-premium/issues/2548. + $notification, + // Note: $button is properly escaped above. + $button + ); + } + + return $notifications; + } +} + +$wpseo_i18n_summary = $yoast_seo_i18n_issues; +if ( ! $yoast_seo_active ) { + $yoast_seo_dashicon = 'yes'; + $wpseo_i18n_summary = $yoast_seo_i18n_no_issues; +} + +?> +

    + + () +

    + +
    + + +

    + +
    + +
    + + esc_attr( $yoast_seo_type . '-dismissed' ), + 'paper_id_prefix' => 'yoast-', + 'class' => 'yoast-notifications-dismissed', + 'content' => _yoast_display_notifications( $yoast_seo_dismissed, 'dismissed' ), + 'collapsible' => true, + 'collapsible_header_class' => 'yoast-notification', + ] + ); + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: get_output() output is properly escaped. + echo $dismissed_paper->get_output(); + } + ?> + + + +

    + + +
    diff --git a/wp-content/plugins/wordpress-seo/admin/views/partial-notifications-warnings.php b/wp-content/plugins/wordpress-seo/admin/views/partial-notifications-warnings.php new file mode 100644 index 00000000..e960d6ae --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/views/partial-notifications-warnings.php @@ -0,0 +1,29 @@ + +
    +

    +
    +
    + + + +
    +
    + + +
    +

    + +

    +
    +
    +
    + + + + + + + + +
    + +

    + ', + '' + ); + ?> +

    + + +
    +
    + +
    + + +
    +
    + + +
    +
    +

     

    +
    + + +
    + +
    + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    +
    diff --git a/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/dashboard.php b/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/dashboard.php new file mode 100644 index 00000000..262a37d3 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/dashboard.php @@ -0,0 +1,44 @@ + + +
    +
    + +
    + +
    + +
    + +
    + +
    +
    + +
    +

    +

    + +

    +
    diff --git a/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/first-time-configuration.php b/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/first-time-configuration.php new file mode 100644 index 00000000..f15c4bb5 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/first-time-configuration.php @@ -0,0 +1,14 @@ +'; diff --git a/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/site-analysis.php b/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/site-analysis.php new file mode 100644 index 00000000..b45c40ec --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/site-analysis.php @@ -0,0 +1,20 @@ +get_all(); + +?> +

    +
    + '; + printf( + /* translators: %1$s opens the link to the Yoast.com article about Crawl settings, %2$s closes the link, */ + esc_html__( '%1$sLearn more about crawl settings.%2$s', 'wordpress-seo' ), + '', + '' + ); + echo '

    '; + + /** + * Fires when displaying the crawl cleanup network tab. + * + * @param Yoast_Form $yform The yoast form object. + */ + do_action( 'wpseo_settings_tab_crawl_cleanup_network', $yform ); + ?> +
    +hidden( 'show_onboarding_notice', 'wpseo_show_onboarding_notice' ); diff --git a/wp-content/plugins/wordpress-seo/admin/views/tabs/network/features.php b/wp-content/plugins/wordpress-seo/admin/views/tabs/network/features.php new file mode 100644 index 00000000..05ac5bbf --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/views/tabs/network/features.php @@ -0,0 +1,115 @@ +get_all(); + +?> +

    +
    + helpers->product->is_premium(); + $premium_version = YoastSEO()->helpers->product->get_premium_version(); + + if ( $feature->premium && $feature->premium_version ) { + $not_supported_in_current_premium_version = $is_premium && version_compare( $premium_version, $feature->premium_version, '<' ); + + if ( $not_supported_in_current_premium_version ) { + continue; + } + } + + $help_text = esc_html( $feature->label ); + if ( ! empty( $feature->extra ) ) { + $help_text .= ' ' . $feature->extra; + } + if ( ! empty( $feature->read_more_label ) ) { + $url = $feature->read_more_url; + if ( ! empty( $feature->premium ) && $feature->premium === true ) { + $url = $feature->premium_url; + } + $help_text .= sprintf( + '%2$s', + esc_url( WPSEO_Shortlinker::get( $url ) ), + esc_html( $feature->read_more_label ) + ); + } + + $feature_help = new WPSEO_Admin_Help_Panel( + WPSEO_Option::ALLOW_KEY_PREFIX . $feature->setting, + /* translators: Hidden accessibility text; %s expands to a feature's name. */ + sprintf( esc_html__( 'Help on: %s', 'wordpress-seo' ), esc_html( $feature->name ) ), + $help_text + ); + + $name = $feature->name; + if ( ! empty( $feature->premium ) && $feature->premium === true ) { + $name .= ' ' . new Premium_Badge_Presenter( $feature->name ); + } + + if ( ! empty( $feature->in_beta ) && $feature->in_beta === true ) { + $name .= ' ' . new Beta_Badge_Presenter( $feature->name ); + } + + $disabled = false; + $show_premium_upsell = false; + $premium_upsell_url = ''; + $note_when_disabled = ''; + + if ( $feature->premium === true && YoastSEO()->helpers->product->is_premium() === false ) { + $disabled = true; + $show_premium_upsell = true; + $premium_upsell_url = WPSEO_Shortlinker::get( $feature->premium_upsell_url ); + } + + $preserve_disabled_value = false; + if ( $disabled ) { + $preserve_disabled_value = true; + } + + $yform->toggle_switch( + WPSEO_Option::ALLOW_KEY_PREFIX . $feature->setting, + [ + 'on' => __( 'Allow Control', 'wordpress-seo' ), + 'off' => __( 'Disable', 'wordpress-seo' ), + ], + $name, + $feature_help->get_button_html() . $feature_help->get_panel_html(), + [ + 'disabled' => $disabled, + 'preserve_disabled_value' => $preserve_disabled_value, + 'show_premium_upsell' => $show_premium_upsell, + 'premium_upsell_url' => $premium_upsell_url, + 'note_when_disabled' => $note_when_disabled, + ] + ); + } + ?> +
    +hidden( 'show_onboarding_notice', 'wpseo_show_onboarding_notice' ); diff --git a/wp-content/plugins/wordpress-seo/admin/views/tabs/network/general.php b/wp-content/plugins/wordpress-seo/admin/views/tabs/network/general.php new file mode 100644 index 00000000..a73c722b --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/views/tabs/network/general.php @@ -0,0 +1,56 @@ +'; + +/* + * {@internal Important: Make sure the options added to the array here are in line with the + * options set in the WPSEO_Option_MS::$allowed_access_options property.}} + */ +$yform->select( + 'access', + /* translators: %1$s expands to Yoast SEO */ + sprintf( __( 'Who should have access to the %1$s settings', 'wordpress-seo' ), 'Yoast SEO' ), + [ + 'admin' => __( 'Site Admins (default)', 'wordpress-seo' ), + 'superadmin' => __( 'Super Admins only', 'wordpress-seo' ), + ] +); + +if ( get_blog_count() <= 100 ) { + $network_admin = new Yoast_Network_Admin(); + + $yform->select( + 'defaultblog', + __( 'New sites in the network inherit their SEO settings from this site', 'wordpress-seo' ), + $network_admin->get_site_choices( true, true ) + ); + echo '

    ' . esc_html__( 'Choose the site whose settings you want to use as default for all sites that are added to your network. If you choose \'None\', the normal plugin defaults will be used.', 'wordpress-seo' ) . '

    '; +} +else { + $yform->textinput( 'defaultblog', __( 'New sites in the network inherit their SEO settings from this site', 'wordpress-seo' ) ); + echo '

    '; + printf( + /* translators: 1: link open tag; 2: link close tag. */ + esc_html__( 'Enter the %1$sSite ID%2$s for the site whose settings you want to use as default for all sites that are added to your network. Leave empty for none (i.e. the normal plugin defaults will be used).', 'wordpress-seo' ), + '', + '' + ); + echo '

    '; +} + +echo '

    ' . esc_html__( 'Take note:', 'wordpress-seo' ) . ' ' . esc_html__( 'Privacy sensitive (FB admins and such), theme specific (title rewrite) and a few very site specific settings will not be imported to new sites.', 'wordpress-seo' ) . '

    '; + +echo ''; diff --git a/wp-content/plugins/wordpress-seo/admin/views/tabs/network/integrations.php b/wp-content/plugins/wordpress-seo/admin/views/tabs/network/integrations.php new file mode 100644 index 00000000..be635eec --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/views/tabs/network/integrations.php @@ -0,0 +1,103 @@ +get_all(); + +?> +

    +
    + label ); + + if ( ! empty( $integration->extra ) ) { + $help_text .= ' ' . $integration->extra; + } + + if ( ! empty( $integration->read_more_label ) ) { + $help_text .= ' '; + $help_text .= sprintf( + '%2$s', + esc_url( WPSEO_Shortlinker::get( $integration->read_more_url ) ), + esc_html( $integration->read_more_label ) + ); + } + + $feature_help = new WPSEO_Admin_Help_Panel( + WPSEO_Option::ALLOW_KEY_PREFIX . $integration->setting, + /* translators: Hidden accessibility text; %s expands to an integration's name. */ + sprintf( esc_html__( 'Help on: %s', 'wordpress-seo' ), esc_html( $integration->name ) ), + $help_text + ); + + $name = $integration->name; + if ( ! empty( $integration->premium ) && $integration->premium === true ) { + $name .= ' ' . new Premium_Badge_Presenter( $integration->name ); + } + + if ( ! empty( $integration->new ) && $integration->new === true ) { + $name .= ' ' . new Badge_Presenter( $integration->name ); + } + + $disabled = $integration->disabled; + $show_premium_upsell = false; + $premium_upsell_url = ''; + + if ( $integration->premium === true && YoastSEO()->helpers->product->is_premium() === false ) { + $disabled = true; + $show_premium_upsell = true; + $premium_upsell_url = WPSEO_Shortlinker::get( $integration->premium_upsell_url ); + } + + $preserve_disabled_value = false; + if ( $disabled ) { + $preserve_disabled_value = true; + } + + $yform->toggle_switch( + WPSEO_Option::ALLOW_KEY_PREFIX . $integration->setting, + [ + 'on' => __( 'Allow Control', 'wordpress-seo' ), + 'off' => __( 'Disable', 'wordpress-seo' ), + ], + $name, + $feature_help->get_button_html() . $feature_help->get_panel_html(), + [ + 'disabled' => $disabled, + 'preserve_disabled_value' => $preserve_disabled_value, + 'show_premium_upsell' => $show_premium_upsell, + 'premium_upsell_url' => $premium_upsell_url, + ] + ); + + do_action( 'Yoast\WP\SEO\admin_network_integration_after', $integration ); + } + ?> +
    +hidden( 'show_onboarding_notice', 'wpseo_show_onboarding_notice' ); diff --git a/wp-content/plugins/wordpress-seo/admin/views/tabs/network/restore-site.php b/wp-content/plugins/wordpress-seo/admin/views/tabs/network/restore-site.php new file mode 100644 index 00000000..ce6701a9 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/views/tabs/network/restore-site.php @@ -0,0 +1,32 @@ +' . esc_html__( 'Using this form you can reset a site to the default SEO settings.', 'wordpress-seo' ) . '

    '; + +if ( get_blog_count() <= 100 ) { + $network_admin = new Yoast_Network_Admin(); + + $yform->select( + 'site_id', + __( 'Site ID', 'wordpress-seo' ), + $network_admin->get_site_choices( false, true ) + ); +} +else { + $yform->textinput( 'site_id', __( 'Site ID', 'wordpress-seo' ) ); +} + +wp_nonce_field( 'wpseo-network-restore', 'restore_site_nonce', false ); +echo ''; diff --git a/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/import-seo.php b/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/import-seo.php new file mode 100644 index 00000000..9cac6366 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/import-seo.php @@ -0,0 +1,127 @@ +detect(); +if ( count( $import_check->needs_import ) === 0 ) { + echo '

    ', esc_html__( 'Import from other SEO plugins', 'wordpress-seo' ), '

    '; + echo '

    '; + printf( + /* translators: %s expands to Yoast SEO */ + esc_html__( '%s did not detect any plugin data from plugins it can import from.', 'wordpress-seo' ), + 'Yoast SEO' + ); + echo '

    '; + + return; +} + +/** + * Creates a select box given a name and plugins array. + * + * @param string $name Name field for the select field. + * @param array $plugins An array of plugins and classes. + * + * @return void + */ +function wpseo_import_external_select( $name, $plugins ) { + esc_html_e( 'Plugin: ', 'wordpress-seo' ); + echo ''; +} + +?> +

    +

    + +

    + +
    +

    +

    + +

    +
    + +
    +

    +

    + +

    +
    + needs_import ); + ?> + + +
    +
    + +
    +

    +

    + +

    +
    + +
    +

    +

    + ', + '' + ); + ?> +

    +
    + +
    +

    +

    + +

    +
    + needs_import ); + ?> + +
    +
    diff --git a/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/wpseo-export.php b/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/wpseo-export.php new file mode 100644 index 00000000..d0a41961 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/wpseo-export.php @@ -0,0 +1,39 @@ +export(); + return; +} + +$wpseo_export_phrase = sprintf( + /* translators: %1$s expands to Yoast SEO */ + __( 'Export your %1$s settings here, to copy them on another site.', 'wordpress-seo' ), + 'Yoast SEO' +); +?> + +

    +
    + + + +
    diff --git a/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/wpseo-import.php b/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/wpseo-import.php new file mode 100644 index 00000000..18a5bfe9 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/wpseo-import.php @@ -0,0 +1,46 @@ + +

    + +

    + +
    + +
    +
    + +
    diff --git a/wp-content/plugins/wordpress-seo/admin/views/tool-bulk-editor.php b/wp-content/plugins/wordpress-seo/admin/views/tool-bulk-editor.php new file mode 100644 index 00000000..354ba376 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/views/tool-bulk-editor.php @@ -0,0 +1,120 @@ + $yoast_free_input_fields, + 'nonce' => wp_create_nonce( 'bulk-editor-table' ), +]; + +$wpseo_bulk_titles_table = new WPSEO_Bulk_Title_Editor_List_Table( $yoast_bulk_editor_arguments ); +$wpseo_bulk_description_table = new WPSEO_Bulk_Description_List_Table( $yoast_bulk_editor_arguments ); + +$yoast_free_screen_reader_content = [ + 'heading_views' => __( 'Filter posts list', 'wordpress-seo' ), + 'heading_pagination' => __( 'Posts list navigation', 'wordpress-seo' ), + 'heading_list' => __( 'Posts list', 'wordpress-seo' ), +]; +get_current_screen()->set_screen_reader_content( $yoast_free_screen_reader_content ); + +if ( ! empty( $_REQUEST['_wp_http_referer'] ) && isset( $_SERVER['REQUEST_URI'] ) ) { + $request_uri = sanitize_file_name( wp_unslash( $_SERVER['REQUEST_URI'] ) ); + + wp_redirect( + remove_query_arg( + [ '_wp_http_referer', '_wpnonce' ], + $request_uri + ) + ); + exit; +} + +/** + * Renders a bulk editor tab. + * + * @param WPSEO_Bulk_List_Table $table The table to render. + * @param string $id The id for the tab. + * + * @return void + */ +function wpseo_get_rendered_tab( $table, $id ) { + ?> +
    + show_page(); + ?> +
    + + + +

    + +
    + + + +
    + + +
    +
    diff --git a/wp-content/plugins/wordpress-seo/admin/views/tool-file-editor.php b/wp-content/plugins/wordpress-seo/admin/views/tool-file-editor.php new file mode 100644 index 00000000..d28b5bf7 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/views/tool-file-editor.php @@ -0,0 +1,244 @@ +admin_header( false, 'wpseo_ms' ); +} +else { + $action_url = admin_url( 'admin.php?page=wpseo_tools&tool=file-editor' ); +} + +if ( isset( $msg ) && ! empty( $msg ) ) { + echo '

    ', esc_html( $msg ), '

    '; +} + +// N.B.: "robots.txt" is a fixed file name and should not be translatable. +echo '

    robots.txt

    '; + +if ( ! file_exists( $robots_file ) ) { + if ( is_writable( $home_path ) ) { + echo '
    '; + wp_nonce_field( 'wpseo_create_robots', '_wpnonce', true, true ); + echo '

    '; + printf( + /* translators: %s expands to robots.txt. */ + esc_html__( 'You don\'t have a %s file, create one here:', 'wordpress-seo' ), + 'robots.txt' + ); + echo '

    '; + + printf( + '', + sprintf( + /* translators: %s expands to robots.txt. */ + esc_attr__( 'Create %s file', 'wordpress-seo' ), + 'robots.txt' + ) + ); + echo '
    '; + } + else { + echo '

    '; + printf( + /* translators: %s expands to robots.txt. */ + esc_html__( 'If you had a %s file and it was editable, you could edit it from here.', 'wordpress-seo' ), + 'robots.txt' + ); + echo '

    '; + } +} +else { + $f = fopen( $robots_file, 'r' ); + + $content = ''; + if ( filesize( $robots_file ) > 0 ) { + $content = fread( $f, filesize( $robots_file ) ); + } + + if ( ! is_writable( $robots_file ) ) { + echo '

    '; + printf( + /* translators: %s expands to robots.txt. */ + esc_html__( 'If your %s were writable, you could edit it from here.', 'wordpress-seo' ), + 'robots.txt' + ); + echo '

    '; + echo '
    '; + } + else { + echo '
    '; + wp_nonce_field( 'wpseo-robotstxt', '_wpnonce', true, true ); + echo ''; + echo '
    '; + printf( + '
    ', + sprintf( + /* translators: %s expands to robots.txt. */ + esc_attr__( 'Save changes to %s', 'wordpress-seo' ), + 'robots.txt' + ) + ); + echo '
    '; + } +} +if ( ! WPSEO_Utils::is_nginx() ) { + + echo '

    '; + printf( + /* translators: %s expands to ".htaccess". */ + esc_html__( '%s file', 'wordpress-seo' ), + '.htaccess' + ); + echo '

    '; + + if ( file_exists( $ht_access_file ) ) { + $f = fopen( $ht_access_file, 'r' ); + + $contentht = ''; + if ( filesize( $ht_access_file ) > 0 ) { + $contentht = fread( $f, filesize( $ht_access_file ) ); + } + + if ( ! is_writable( $ht_access_file ) ) { + echo '

    '; + printf( + /* translators: %s expands to ".htaccess". */ + esc_html__( 'If your %s were writable, you could edit it from here.', 'wordpress-seo' ), + '.htaccess' + ); + echo '

    '; + echo '
    '; + } + else { + echo '
    '; + wp_nonce_field( 'wpseo-htaccess', '_wpnonce', true, true ); + echo ''; + echo '
    '; + printf( + '
    ', + sprintf( + /* translators: %s expands to ".htaccess". */ + esc_attr__( 'Save changes to %s', 'wordpress-seo' ), + '.htaccess' + ) + ); + echo '
    '; + } + } + else { + echo '

    '; + printf( + /* translators: %s expands to ".htaccess". */ + esc_html__( 'If you had a %s file and it was editable, you could edit it from here.', 'wordpress-seo' ), + '.htaccess' + ); + echo '

    '; + } +} + +if ( is_multisite() ) { + $yform->admin_footer( false ); +} diff --git a/wp-content/plugins/wordpress-seo/admin/views/tool-import-export.php b/wp-content/plugins/wordpress-seo/admin/views/tool-import-export.php new file mode 100644 index 00000000..d2e0fd84 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/views/tool-import-export.php @@ -0,0 +1,123 @@ +import(); +} + +/** + * Allow custom import actions. + * + * @param WPSEO_Import_Status $yoast_seo_import Contains info about the handled import. + */ +$yoast_seo_import = apply_filters( 'wpseo_handle_import', $yoast_seo_import ); + +if ( $yoast_seo_import ) { + + $yoast_seo_message = ''; + if ( $yoast_seo_import->status instanceof WPSEO_Import_Status ) { + $yoast_seo_message = $yoast_seo_import->status->get_msg(); + } + + /** + * Allow customization of import/export message. + * + * @param string $yoast_seo_msg The message. + */ + $yoast_seo_msg = apply_filters( 'wpseo_import_message', $yoast_seo_message ); + + if ( ! empty( $yoast_seo_msg ) ) { + $yoast_seo_status = 'error'; + if ( $yoast_seo_import->status->status ) { + $yoast_seo_status = 'updated'; + } + + $yoast_seo_class = 'message ' . $yoast_seo_status; + + echo '

    ', esc_html( $yoast_seo_msg ), '

    '; + } +} + +$yoast_seo_tabs = [ + 'wpseo-import' => [ + 'label' => __( 'Import settings', 'wordpress-seo' ), + ], + 'wpseo-export' => [ + 'label' => __( 'Export settings', 'wordpress-seo' ), + ], + 'import-seo' => [ + 'label' => __( 'Import from other SEO plugins', 'wordpress-seo' ), + ], +]; + +?> +

    + + + + $tab ) { + printf( '
    ', esc_attr( $identifier ) ); + require_once WPSEO_PATH . 'admin/views/tabs/tool/' . $identifier . '.php'; + echo '
    '; +} + +/** + * Allow adding a custom import tab. + */ +do_action( 'wpseo_import_tab_content' ); diff --git a/wp-content/plugins/wordpress-seo/admin/views/user-profile.php b/wp-content/plugins/wordpress-seo/admin/views/user-profile.php new file mode 100644 index 00000000..a7b3e188 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/views/user-profile.php @@ -0,0 +1,77 @@ + + +
    + +

    + + + +
    + + +
    + + ID ) === 'on' ) ? 'checked' : ''; ?> /> +
    + + + + ID ) === 'on' ) ? 'checked' : ''; ?> /> + +
    +

    + +

    + + + + ID ) === 'on' ) ? 'checked' : ''; ?> /> + +
    +

    + +

    + + + + ID ) === 'on' ) ? 'checked' : ''; ?> /> + +
    +

    + +

    + + + +
    diff --git a/wp-content/plugins/wordpress-seo/admin/watchers/class-slug-change-watcher.php b/wp-content/plugins/wordpress-seo/admin/watchers/class-slug-change-watcher.php new file mode 100644 index 00000000..68d18616 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/admin/watchers/class-slug-change-watcher.php @@ -0,0 +1,256 @@ +helpers->product->is_premium() ) { + return; + } + + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); + + // Detect a post trash. + add_action( 'wp_trash_post', [ $this, 'detect_post_trash' ] ); + + // Detect a post delete. + add_action( 'before_delete_post', [ $this, 'detect_post_delete' ] ); + + // Detects deletion of a term. + add_action( 'delete_term_taxonomy', [ $this, 'detect_term_delete' ] ); + } + + /** + * Enqueues the quick edit handler. + * + * @return void + */ + public function enqueue_assets() { + global $pagenow; + + if ( ! in_array( $pagenow, [ 'edit.php', 'edit-tags.php' ], true ) ) { + return; + } + + $asset_manager = new WPSEO_Admin_Asset_Manager(); + $asset_manager->enqueue_script( 'quick-edit-handler' ); + } + + /** + * Shows a message when a post is about to get trashed. + * + * @param int $post_id The current post ID. + * + * @return void + */ + public function detect_post_trash( $post_id ) { + if ( ! $this->is_post_viewable( $post_id ) ) { + return; + } + + $post_label = $this->get_post_type_label( get_post_type( $post_id ) ); + + /* translators: %1$s expands to the translated name of the post type. */ + $first_sentence = sprintf( __( 'You just trashed a %1$s.', 'wordpress-seo' ), $post_label ); + $second_sentence = __( 'Search engines and other websites can still send traffic to your trashed content.', 'wordpress-seo' ); + $message = $this->get_message( $first_sentence, $second_sentence ); + + $this->add_notification( $message ); + } + + /** + * Shows a message when a post is about to get trashed. + * + * @param int $post_id The current post ID. + * + * @return void + */ + public function detect_post_delete( $post_id ) { + if ( ! $this->is_post_viewable( $post_id ) ) { + return; + } + + $post_label = $this->get_post_type_label( get_post_type( $post_id ) ); + + /* translators: %1$s expands to the translated name of the post type. */ + $first_sentence = sprintf( __( 'You just deleted a %1$s.', 'wordpress-seo' ), $post_label ); + $second_sentence = __( 'Search engines and other websites can still send traffic to your deleted content.', 'wordpress-seo' ); + $message = $this->get_message( $first_sentence, $second_sentence ); + + $this->add_notification( $message ); + } + + /** + * Shows a message when a term is about to get deleted. + * + * @param int $term_taxonomy_id The term taxonomy ID that will be deleted. + * + * @return void + */ + public function detect_term_delete( $term_taxonomy_id ) { + if ( ! $this->is_term_viewable( $term_taxonomy_id ) ) { + return; + } + + $term = get_term_by( 'term_taxonomy_id', (int) $term_taxonomy_id ); + $term_label = $this->get_taxonomy_label_for_term( $term->term_id ); + + /* translators: %1$s expands to the translated name of the term. */ + $first_sentence = sprintf( __( 'You just deleted a %1$s.', 'wordpress-seo' ), $term_label ); + $second_sentence = __( 'Search engines and other websites can still send traffic to your deleted content.', 'wordpress-seo' ); + $message = $this->get_message( $first_sentence, $second_sentence ); + + $this->add_notification( $message ); + } + + /** + * Checks if the post is viewable. + * + * @param string $post_id The post id to check. + * + * @return bool Whether the post is viewable or not. + */ + protected function is_post_viewable( $post_id ) { + $post_type = get_post_type( $post_id ); + if ( ! WPSEO_Post_Type::is_post_type_accessible( $post_type ) ) { + return false; + } + + $post_status = get_post_status( $post_id ); + if ( ! $this->check_visible_post_status( $post_status ) ) { + return false; + } + + return true; + } + + /** + * Checks if the term is viewable. + * + * @param int $term_taxonomy_id The term taxonomy ID to check. + * + * @return bool Whether the term is viewable or not. + */ + protected function is_term_viewable( $term_taxonomy_id ) { + $term = get_term_by( 'term_taxonomy_id', (int) $term_taxonomy_id ); + + if ( ! $term || is_wp_error( $term ) ) { + return false; + } + + $taxonomy = get_taxonomy( $term->taxonomy ); + if ( ! $taxonomy ) { + return false; + } + + return $taxonomy->publicly_queryable || $taxonomy->public; + } + + /** + * Gets the taxonomy label to use for a term. + * + * @param int $term_id The term ID. + * + * @return string The taxonomy's singular label. + */ + protected function get_taxonomy_label_for_term( $term_id ) { + $term = get_term( $term_id ); + $taxonomy = get_taxonomy( $term->taxonomy ); + + return $taxonomy->labels->singular_name; + } + + /** + * Retrieves the singular post type label. + * + * @param string $post_type Post type to retrieve label from. + * + * @return string The singular post type name. + */ + protected function get_post_type_label( $post_type ) { + $post_type_object = get_post_type_object( $post_type ); + + // If the post type of this post wasn't registered default back to post. + if ( $post_type_object === null ) { + $post_type_object = get_post_type_object( 'post' ); + } + + return $post_type_object->labels->singular_name; + } + + /** + * Checks whether the given post status is visible or not. + * + * @param string $post_status The post status to check. + * + * @return bool Whether or not the post is visible. + */ + protected function check_visible_post_status( $post_status ) { + $visible_post_statuses = [ + 'publish', + 'static', + 'private', + ]; + + return in_array( $post_status, $visible_post_statuses, true ); + } + + /** + * Returns the message around changed URLs. + * + * @param string $first_sentence The first sentence of the notification. + * @param string $second_sentence The second sentence of the notification. + * + * @return string The full notification. + */ + protected function get_message( $first_sentence, $second_sentence ) { + return '

    ' . __( 'Make sure you don\'t miss out on traffic!', 'wordpress-seo' ) . '

    ' + . '

    ' + . $first_sentence + . ' ' . $second_sentence + . ' ' . __( 'You should create a redirect to ensure your visitors do not get a 404 error when they click on the no longer working URL.', 'wordpress-seo' ) + /* translators: %s expands to Yoast SEO Premium */ + . ' ' . sprintf( __( 'With %s, you can easily create such redirects.', 'wordpress-seo' ), 'Yoast SEO Premium' ) + . '

    ' + . '

    ' + /* translators: %s expands to Yoast SEO Premium */ + . sprintf( __( 'Get %s', 'wordpress-seo' ), 'Yoast SEO Premium' ) + /* translators: Hidden accessibility text. */ + . '' . __( '(Opens in a new browser tab)', 'wordpress-seo' ) . '' + . '' + . '

    '; + } + + /** + * Adds a notification to be shown on the next page request since posts are updated in an ajax request. + * + * @param string $message The message to add to the notification. + * + * @return void + */ + protected function add_notification( $message ) { + $notification = new Yoast_Notification( + $message, + [ + 'type' => 'notice-warning is-dismissible', + 'yoast_branding' => true, + ] + ); + + $notification_center = Yoast_Notification_Center::get(); + $notification_center->add_notification( $notification ); + } +} diff --git a/wp-content/plugins/wordpress-seo/blocks/dynamic-blocks/breadcrumbs/block.json b/wp-content/plugins/wordpress-seo/blocks/dynamic-blocks/breadcrumbs/block.json new file mode 100644 index 00000000..33ecb48c --- /dev/null +++ b/wp-content/plugins/wordpress-seo/blocks/dynamic-blocks/breadcrumbs/block.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "version": "22.8", + "name": "yoast-seo/breadcrumbs", + "title": "Yoast Breadcrumbs", + "description": "Adds the Yoast SEO breadcrumbs to your template or content.", + "category": "yoast-internal-linking-blocks", + "icon": "admin-links", + "keywords": [ + "SEO", + "breadcrumbs", + "internal linking", + "site structure" + ], + "textdomain": "wordpress-seo", + "attributes": { + "className": { + "type": "string" + } + }, + "example": { + "attributes": {} + } +} diff --git a/wp-content/plugins/wordpress-seo/blocks/structured-data-blocks/faq/block.json b/wp-content/plugins/wordpress-seo/blocks/structured-data-blocks/faq/block.json new file mode 100644 index 00000000..649f1226 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/blocks/structured-data-blocks/faq/block.json @@ -0,0 +1,44 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "version": "22.7", + "name": "yoast/faq-block", + "title": "Yoast FAQ", + "description": "List your Frequently Asked Questions in an SEO-friendly way.", + "category": "yoast-structured-data-blocks", + "icon": "editor-ul", + "keywords": [ + "FAQ", + "Frequently Asked Questions", + "Schema", + "SEO", + "Structured Data" + ], + "textdomain": "wordpress-seo", + "attributes": { + "questions": { + "type": "array" + }, + "additionalListCssClasses": { + "type": "string" + } + }, + "example": { + "attributes": { + "steps": [ + { + "id": "faq-question-1", + "question": [ ], + "answer": [ ] + }, + { + "id": "faq-question-2", + "question": [ ], + "answer": [ ] + } + ] + } + }, + "editorScript": "yoast-seo-faq-block", + "editorStyle": "yoast-seo-structured-data-blocks" +} diff --git a/wp-content/plugins/wordpress-seo/blocks/structured-data-blocks/how-to/block.json b/wp-content/plugins/wordpress-seo/blocks/structured-data-blocks/how-to/block.json new file mode 100644 index 00000000..7a1cfe5e --- /dev/null +++ b/wp-content/plugins/wordpress-seo/blocks/structured-data-blocks/how-to/block.json @@ -0,0 +1,76 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "version": "22.7", + "name": "yoast/how-to-block", + "title": "Yoast How-to", + "description": "Create a How-to guide in an SEO-friendly way. You can only use one How-to block per post.", + "category": "yoast-structured-data-blocks", + "icon": "editor-ol", + "keywords": [ + "How-to", + "How to", + "Schema", + "SEO", + "Structured Data" + ], + "supports": { + "multiple": false + }, + "textdomain": "wordpress-seo", + "attributes": { + "hasDuration": { + "type": "boolean" + }, + "days": { + "type": "string" + }, + "hours": { + "type": "string" + }, + "minutes": { + "type": "string" + }, + "description": { + "type": "string", + "source": "html", + "selector": ".schema-how-to-description" + }, + "jsonDescription": { + "type": "string" + }, + "steps": { + "type": "array" + }, + "additionalListCssClasses": { + "type": "string" + }, + "unorderedList": { + "type": "boolean" + }, + "durationText": { + "type": "string" + }, + "defaultDurationText": { + "type": "string" + } + }, + "example": { + "attributes": { + "steps": [ + { + "id": "how-to-step-example-1", + "name": [ ], + "text": [ ] + }, + { + "id": "how-to-step-example-2", + "name": [ ], + "text": [ ] + } + ] + } + }, + "editorScript": "yoast-seo-how-to-block", + "editorStyle": "yoast-seo-structured-data-blocks" +} diff --git a/wp-content/plugins/wordpress-seo/css/dist/academy-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/academy-2330-rtl.css new file mode 100644 index 00000000..752312db --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/academy-2330-rtl.css @@ -0,0 +1 @@ +.seo_page_wpseo_page_academy{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity));z-index:-1}.seo_page_wpseo_page_academy #wpcontent{padding-right:0!important}.seo_page_wpseo_page_academy #wpfooter{padding-left:1rem}@media (min-width:768px){.seo_page_wpseo_page_academy #wpfooter{padding-right:17rem;padding-left:2rem}}@media screen and (max-width:782px){.seo_page_wpseo_page_academy .wp-responsive-open #wpbody{left:-190px}} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/academy-2330.css b/wp-content/plugins/wordpress-seo/css/dist/academy-2330.css new file mode 100644 index 00000000..6d15e7ef --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/academy-2330.css @@ -0,0 +1 @@ +.seo_page_wpseo_page_academy{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity));z-index:-1}.seo_page_wpseo_page_academy #wpcontent{padding-left:0!important}.seo_page_wpseo_page_academy #wpfooter{padding-right:1rem}@media (min-width:768px){.seo_page_wpseo_page_academy #wpfooter{padding-left:17rem;padding-right:2rem}}@media screen and (max-width:782px){.seo_page_wpseo_page_academy .wp-responsive-open #wpbody{right:-190px}} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/admin-global-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/admin-global-2330-rtl.css new file mode 100644 index 00000000..4103d80d --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/admin-global-2330-rtl.css @@ -0,0 +1 @@ +:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.yoast-tooltip{position:relative}button.yoast-tooltip{overflow:visible}.yoast-tooltip:after{word-wrap:break-word;-webkit-font-smoothing:subpixel-antialiased;background:#000c;border-radius:3px;color:#fff;content:attr(aria-label);display:none;font:normal normal 11px/1.45454545 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;letter-spacing:normal;opacity:0;padding:6px 8px 5px;pointer-events:none;position:absolute;text-align:center;text-decoration:none;text-shadow:none;text-transform:none;white-space:pre;z-index:1000000}.yoast-tooltip-alt:after{content:attr(data-label)}.yoast-tooltip:before{border:5px solid #0000;color:#000c;content:"\00a0";display:none;height:0;opacity:0;pointer-events:none;position:absolute;width:0;z-index:1000001}@keyframes yoast-tooltip-appear{0%{opacity:0}to{opacity:1}}.yoast-tooltip:active:after,.yoast-tooltip:active:before,.yoast-tooltip:focus:after,.yoast-tooltip:focus:before,.yoast-tooltip:hover:after,.yoast-tooltip:hover:before{animation-duration:.1s;animation-fill-mode:forwards;animation-name:yoast-tooltip-appear;animation-timing-function:ease-in;display:inline-block;text-decoration:none}.yoast-tooltip-no-delay:active:after,.yoast-tooltip-no-delay:active:before,.yoast-tooltip-no-delay:focus:after,.yoast-tooltip-no-delay:focus:before,.yoast-tooltip-no-delay:hover:after,.yoast-tooltip-no-delay:hover:before{animation:none;opacity:1}.yoast-tooltip-multiline:active:after,.yoast-tooltip-multiline:focus:after,.yoast-tooltip-multiline:hover:after{display:table-cell}.yoast-tooltip-s:after,.yoast-tooltip-se:after,.yoast-tooltip-sw:after{margin-top:5px;left:50%;top:100%}.yoast-tooltip-s:before,.yoast-tooltip-se:before,.yoast-tooltip-sw:before{border-bottom-color:#000c;bottom:-5px;margin-left:-5px;left:50%;top:auto}.yoast-tooltip-se:after{right:50%;margin-right:-15px;left:auto}.yoast-tooltip-sw:after{margin-left:-15px}.yoast-tooltip-n:after,.yoast-tooltip-ne:after,.yoast-tooltip-nw:after{bottom:100%;margin-bottom:5px;left:50%}.yoast-tooltip-n:before,.yoast-tooltip-ne:before,.yoast-tooltip-nw:before{border-top-color:#000c;bottom:auto;margin-left:-5px;left:50%;top:-5px}.yoast-tooltip-ne:after{right:50%;margin-right:-15px;left:auto}.yoast-tooltip-nw:after{margin-left:-15px}.yoast-tooltip-n:after,.yoast-tooltip-s:after{transform:translateX(-50%)}.yoast-tooltip-w:after{bottom:50%;margin-left:5px;left:100%;transform:translateY(50%)}.yoast-tooltip-w:before{border-right-color:#000c;bottom:50%;right:-5px;margin-top:-5px;top:50%}.yoast-tooltip-e:after{bottom:50%;right:100%;margin-right:5px;transform:translateY(50%)}.yoast-tooltip-e:before{border-left-color:#000c;bottom:50%;margin-top:-5px;left:-5px;top:50%}.yoast-tooltip-multiline:after{word-wrap:normal;border-collapse:initial;max-width:250px;white-space:pre-line;width:250px;width:max-content;word-break:break-word}.yoast-tooltip-multiline.yoast-tooltip-n:after,.yoast-tooltip-multiline.yoast-tooltip-s:after{right:50%;left:auto;transform:translateX(50%)}.yoast-tooltip-multiline.yoast-tooltip-e:after,.yoast-tooltip-multiline.yoast-tooltip-w:after{left:100%}@media screen and (min-width:0\0){.yoast-tooltip-multiline:after{width:250px}}.yoast-tooltip-sticky:after,.yoast-tooltip-sticky:before{display:inline-block}.yoast-tooltip-sticky.yoast-tooltip-multiline:after{display:table-cell}@media only screen and (-moz-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.yoast-tooltip-w:after{margin-left:4.5px}}.yoast-tooltip.yoast-tooltip-hidden:after,.yoast-tooltip.yoast-tooltip-hidden:before{display:none}.rtl .yst-icon-rtl{--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.wpseo-premium-indicator{display:inline-block;height:1px;width:1px}#adminmenu .wpseo-premium-indicator{color:inherit;margin:-2px 2px -3px 0}.wpseo-premium-indicator svg{display:none;height:100%;width:auto}.yoast-measure{max-width:600px}.yoast-measure.padded{max-width:632px}#TB_window .wpseo_content_wrapper p{font-size:14px;font-style:normal}#TB_window .wpseo_content_wrapper label{font-size:14px;font-weight:600;margin:0 0 0 10px}.wpseo-premium-popup-title{font-size:1.3em!important;font-weight:600!important;margin:1em 0!important;padding:0!important}.wpseo-premium-popup-icon{margin:10px}.edit-tags-php .column-description img{height:auto;max-width:100%}.yoast-label-strong{font-weight:600}.yoast-video-container-max-width{max-width:560px}.yoast-video-container{height:0;overflow:hidden;padding-bottom:56.25%;position:relative}.yoast-video-container iframe{height:100%;right:0;position:absolute;top:0;width:100%}.yoast-settings{margin-bottom:2em;padding-right:220px}.yoast-settings h2{margin-bottom:0;margin-right:-220px}.yoast-settings label{color:#23282d;display:inline-block;font-size:14px;font-weight:600;line-height:1.3;margin-right:-220px;margin-left:6px;padding-left:10px;padding-top:4px;vertical-align:top;width:200px}.yoast .yoast-settings__checkbox,.yoast .yoast-settings__radio,.yoast-settings fieldset,.yoast-settings input[type=text],.yoast-settings label,.yoast-settings select,.yoast-settings textarea{margin-bottom:.5em;margin-top:2em}.yoast-settings__textarea--medium{max-width:600px;width:100%}.yoast .yoast-settings__checkbox,.yoast .yoast-settings__radio{position:relative;top:1px;vertical-align:top}.yoast-settings__group--checkbox,.yoast-settings__group--radio{padding-top:1em}.yoast-settings__group--checkbox .yoast-settings__checkbox,.yoast-settings__group--radio .yoast-settings__radio{margin:0 0 10px 4px}.yoast-settings__checkbox+label,.yoast-settings__radio+label{margin-right:0;margin-left:0;max-width:calc(100% - 25px);padding:0;width:auto}.yoast-settings__group--checkbox .yoast-settings__checkbox+label,.yoast-settings__group--radio .yoast-settings__radio+label{font-weight:400;margin-bottom:10px;margin-top:0}.yoast-settings legend{color:#23282d;font-size:14px;font-weight:600}.yoast-settings .description{font-size:14px;margin-top:0}td .wpseo-score-icon{background:#888;border-radius:50%;display:inline-block;height:12px;line-height:16px;margin-right:5px;margin-top:3px;width:12px}.fixed th.column-wpseo-linked,.fixed th.column-wpseo-links,.fixed th.column-wpseo-score,.fixed th.column-wpseo-score-readability{padding:0;width:3em}.fixed th.column-wpseo-score-readability.sortable,.fixed th.column-wpseo-score-readability.sorted,.fixed th.column-wpseo-score.sortable,.fixed th.column-wpseo-score.sorted{width:3.5em}th.column-wpseo-linked a,th.column-wpseo-links a,th.column-wpseo-score .yoast-tooltip,th.column-wpseo-score-readability .yoast-tooltip{display:inline-block;overflow:visible;padding:8px 0;vertical-align:middle}th.column-wpseo-score .yoast-tooltip,th.column-wpseo-score-readability .yoast-tooltip{padding:8px 11px}th.column-wpseo-score-readability.sortable .yoast-tooltip,th.column-wpseo-score-readability.sorted .yoast-tooltip,th.column-wpseo-score.sortable .yoast-tooltip,th.column-wpseo-score.sorted .yoast-tooltip{padding-left:0}.column-wpseo-links .yoast-tooltip-multiline:after{max-width:160px}.column-wpseo-linked .yoast-tooltip-multiline:after{max-width:170px}.yoast-column-header-has-tooltip{position:relative}.manage-column .yoast-column-header-has-tooltip:before{color:#444;content:"";display:inline-block;height:20px;padding:0;text-decoration:none!important;vertical-align:top;width:20px}.manage-column .yoast-linked-to:before{background:#0000 url(../../images/link-out-icon.svg) no-repeat 100% 0;background-size:20px}.manage-column .yoast-linked-from:before{background:#0000 url(../../images/link-in-icon.svg) no-repeat 100% 0;background-size:20px}.manage-column .yoast-column-seo-score:before{background:#0000 url(../../images/Yoast_SEO_negative_icon.svg) no-repeat 100% 0;background-size:20px}.manage-column .yoast-column-readability:before{background:#0000 url(../../images/readability-icon.svg) no-repeat 100% 0;background-size:20px}td.column-wpseo-linked,td.column-wpseo-links{word-wrap:normal}@media screen and (max-width:782px){.yoast-settings{padding-right:0}.yoast-settings h2{margin-right:0}.yoast-settings label{margin-right:0;margin-left:0;padding:0;width:auto}.yoast .yoast-settings__radio,.yoast-settings__radio+label{margin-bottom:1em}.yoast-settings__checkbox+label,.yoast-settings__radio+label{max-width:calc(100% - 35px);padding-top:8px}.yoast-settings__group--checkbox .yoast-settings__checkbox+label,.yoast-settings__group--radio .yoast-settings__radio+label{padding-top:4px}.yoast-settings input[type=text],.yoast-settings select,.yoast-settings textarea{box-sizing:border-box;display:block;line-height:1.5;margin-bottom:0;margin-top:0;max-width:none;padding:7px 10px;width:100%}.screen-reader-text.wpseo-score-text{-webkit-clip-path:none;clip-path:none;height:auto;margin:0;position:static!important;width:auto}}.react-tabs__tab-panel{margin:0 auto;max-width:900px}.react-tabs__tab-panel li{max-width:none!important}.contact-premium-support{text-align:center}.contact-premium-support__content{font-size:.9375rem;line-height:1.4;margin:0 auto 1.5em}.contact-premium-support__content:nth-child(2){max-width:610px}.contact-premium-support__content:nth-child(3){max-width:560px}.contact-premium-support .contact-premium-support__button{margin-bottom:48px}.wpseo-premium-description{margin-top:.5em}.wpseo-premium-advantages-list{list-style:disc;padding-right:1.5em}.yoast_help.yoast-help-button,.yoast_help.yoast-help-link{background:#0000;border:0;box-shadow:none;color:#72777c;cursor:pointer;height:20px;margin:0;outline:none;padding:0;position:relative;vertical-align:top;width:20px}.yoast-section .yoast_help.yoast-help-button{float:left}.help-button-inline .yoast_help.yoast-help-button{margin-top:-4px}.yoast-section .yoast_help.yoast-help-button{margin-top:-44px}.wpseo-admin-page .yoast_help.yoast-help-button{margin-left:6px}.yoast_help .yoast-help-icon:before{content:"\f223";right:0;padding:4px;position:absolute;top:0}.yoast_help.yoast-help-button:focus,.yoast_help.yoast-help-button:hover,.yoast_help.yoast-help-link:hover{color:#0073aa}.assessment-results__mark:focus,.yoast_help.yoast-help-button:focus .yoast-help-icon:before,.yoast_help.yoast-help-link:focus .yoast-help-icon:before{border-radius:100%;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc}.yoast-help-panel{clear:both;display:none;font-weight:400;max-width:30em!important;padding:0 0 1em;white-space:normal}.wpseo-admin-page .yoast-help-panel{max-width:600px!important}.copy-home-meta-description{margin-top:1em}.copy-home-meta-description .yoast-help-panel{max-width:400px!important}.yoast-modal_is-open{overflow:hidden}.yoast-notification .yoast-seo-icon{float:right;margin:20px 10px}.yoast-notification .yoast-seo-icon-wrap{margin:0 85px 0 0}.yoast-button-upsell{align-items:center;background-color:#fec228;border-radius:4px;box-shadow:inset 0 -4px 0 #0003;box-sizing:border-box;color:#000;display:inline-flex;filter:drop-shadow(0 2px 4px rgba(0,0,0,.2));font-family:Arial,sans-serif;font-size:16px;justify-content:center;line-height:1.5;min-height:48px;padding:8px 1em;text-decoration:none}.yoast-button-upsell:active,.yoast-button-upsell:focus,.yoast-button-upsell:hover{background-color:#f2ae01;color:#000}.yoast-button-upsell:focus{box-shadow:inset 0 -4px 0 #0003,0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc}.yoast-button-upsell:active{box-shadow:none;filter:none;transform:translateY(1px)}.yoast-button-upsell#wpseo-premium-button{color:#000}.yoast-button-upsell__caret{background:#0000 var(--yoast-svg-icon-caret-right) center no-repeat;flex-shrink:0;height:16px;margin:0 6px 0 -2px;width:8px}.rtl .yoast-button-upsell__caret{background-image:var(--yoast-svg-icon-caret-left)}body.folded .wpseo-admin-submit-fixed{right:36px}@media screen and (max-width:782px){body.folded .wpseo-admin-submit-fixed{right:0}}.wpseo-admin-submit{align-items:baseline;display:flex;justify-content:flex-start;margin:0;padding:16px 0;z-index:5}.wpseo-admin-submit.wpseo-admin-submit-fixed{background-color:#fff;bottom:0;box-shadow:0 1px 8px 1px #00000080;padding:16px;position:fixed;width:600px}@media screen and (max-width:782px){.wpseo-admin-submit.wpseo-admin-submit-fixed{right:0;width:782px}}.wpseo-admin-submit p.submit{margin:0;padding:0}.wpseo-admin-submit p.wpseo-message{color:#008a00;margin:0 0 0 16px;padding:0}.yoast-site-health__signature{color:#707070;display:flex;font-size:12px;line-height:20px;margin-top:2em}.yoast-site-health__inline-button.fetch-status,.yoast-site-health__signature-icon{margin-left:8px}#wpadminbar .yoast-badge,.yoast-badge{border-radius:8px;display:inline-block;font-weight:600;line-height:1.6;padding:0 8px}.yoast-badge{font-size:10px;min-height:16px}.yoast-badge--sale{background-color:#a4286a;border-radius:999px!important;color:#fff;font-size:12px!important;margin-top:-24px;position:absolute;left:30px;transform:rotate(-14deg)}@media (max-width:1024px){.yoast-badge--sale{display:inline-block;position:unset;vertical-align:top}}.yoast-badge__is-link:focus,.yoast-badge__is-link:hover{background-color:#004973;box-shadow:none;color:#fff;outline:none}#wpadminbar .yoast-badge,.wp-submenu .yoast-badge{font-size:9px;min-height:14px}.yoast-new-badge{background-color:#cce5ff;color:#004973}.yoast-premium-badge{background-color:#fff3cd;color:#674e00}.yoast-beta-badge{background-color:#cce5ff;color:#004973}.yoast-badge__is-link{text-decoration:none}.switch-container .yoast-badge{vertical-align:-1em}.switch-container legend .yoast-badge{vertical-align:0}.yoast_help+.yoast-badge{vertical-align:bottom}.yoast #crawl-settings fieldset[id$=_disabled],.yoast #crawl-settings p.disabled,.yoast label[for=clean_permalinks_extra_variables_free],.yoast label[for=search_character_limit_free],.yoast p.yoast-extra-variables-label-free{opacity:.5}.yoast #crawl-settings fieldset[id$=_disabled] .switch-toggle.switch-yoast-seo input:disabled~a{background:#a4286a;border:1px solid #b5b5b5}.yoast label[for^=search_character_limit]{font-weight:600;margin-bottom:10px!important;padding-right:2px;width:320px!important}.yoast input[id^=search_character_limit]{width:70px!important}.yoast label[for^=clean_permalinks_extra_variables]{font-weight:600;padding-right:2px;width:240px!important}.yoast input[id^=clean_permalinks_extra_variables]{width:358px!important}.yoast .yoast-crawl-single-setting{margin-top:18px}.yoast p[class*=yoast-extra-variables-label]{padding-right:243px!important}@media screen and (max-width:782px){.yoast p[class*=yoast-extra-variables-label]{margin-top:-20px!important;padding-right:0!important}}.yoast .yoast-crawl-settings-help{font-style:italic}.notice-yoast{background:#fff;border:1px solid #c3c4c7;border-right:4px solid var(--yoast-color-primary);box-shadow:0 1px 1px #0000000a;margin:20px 0 15px;padding:1px 12px}#black-friday-2023-product-editor-checklist .notice-yoast__container{padding:0 5px}.notice-yoast.is-dismissible{padding-left:38px;position:relative}.notice-yoast__container{padding:10px 0 5px}.notice-yoast__container,.notice-yoast__header{align-items:center;display:flex;flex-direction:row}.notice-yoast__header{box-sizing:border-box;justify-content:left;margin-bottom:8px;padding:0;width:100%}.notice-yoast__header .notice-yoast__header-heading{line-height:1.2;margin:0;padding:0}.notice-yoast__header h2.notice-yoast__header-heading{color:var(--yoast-color-primary);font-size:14px;font-weight:600;line-height:1;margin:0}.notice-yoast__header .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:14px;margin-left:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:14px}.notice-yoast__content{display:flex;padding:0}.notice-yoast .notice-yoast__container>svg{height:60px;line-height:1;margin-right:10px;width:auto}.notice-yoast img{height:60px;line-height:1;margin-bottom:5px;margin-right:16px;width:auto}.notice-yoast p{font-size:13px;font-weight:400;line-height:19px;max-width:600px}.notice-yoast .yoast-button--small{min-height:unset}.notice-yoast .notice-dismiss{background:none;border:none;color:#787c82;cursor:pointer;margin:0;padding:9px;position:absolute;left:1px;top:0}.notice-yoast .notice-dismiss:before{speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:none;color:#787c82;content:"\f153";display:block;font:normal 16px/20px dashicons;height:20px;text-align:center;width:20px}.notice-yoast .notice-dismiss:hover:before{color:#d63638}.privacy-settings .notice-yoast{margin:0 20px}.yoast .yoast-crawl-settings-explanation-free,.yoast .yoast-crawl-settings-help-free{opacity:.5}.yoast h3.yoast-crawl-settings,.yoast h3.yoast-crawl-settings-free{margin:2em 0 .5em}.yoast .yoast-crawl-settings-disabled,.yoast h3.yoast-crawl-settings-free{opacity:.5}.yoast .indexables-indexing-error p{margin-bottom:13px}.yoast .indexables-indexing-error strong{font-weight:500}.yoast .indexables-indexing-error summary{font-weight:700}.yoast-dashicons-notice{color:#dba617}#black-friday-2023-promotion-sidebar.notice-yoast{background:#fff;border-color:#fcd34d;border-radius:8px;border-width:2px;margin:20px 0 15px;padding:1px 12px}#black-friday-2023-promotion-sidebar .notice-yoast__header{margin-bottom:2px}#black-friday-2023-promotion-metabox.notice-yoast{background:#fff;border-color:#fcd34d;border-radius:8px;border-width:2px;margin:20px}#black-friday-2023-promotion-metabox h2.notice-yoast__header-heading{padding:0}#black-friday-2023-promotion-metabox .notice-yoast__container{padding-bottom:0}#black-friday-2023-promotion-metabox .notice-yoast__container p{display:inline}#black-friday-2023-promotion-metabox .notice-yoast__header{margin-bottom:8px}#black-friday-2023-promotion-metabox .notice-yoast__header a{font-weight:400;margin-right:13px}.yoast-bf-sale-badge{display:block;right:12px;position:absolute;top:-10px}.yoast-bf-sale-badge,.yoast-menu-bf-sale-badge{background-color:#1f2937;border-radius:8px;color:#fcd34d;font-size:10px;font-weight:600;line-height:normal;padding:2px 8px}.yoast-menu-bf-sale-badge{border:1px solid #fcd34d;margin-right:5px} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/admin-global-2330.css b/wp-content/plugins/wordpress-seo/css/dist/admin-global-2330.css new file mode 100644 index 00000000..41fa18ef --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/admin-global-2330.css @@ -0,0 +1 @@ +:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.yoast-tooltip{position:relative}button.yoast-tooltip{overflow:visible}.yoast-tooltip:after{word-wrap:break-word;-webkit-font-smoothing:subpixel-antialiased;background:#000c;border-radius:3px;color:#fff;content:attr(aria-label);display:none;font:normal normal 11px/1.45454545 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;letter-spacing:normal;opacity:0;padding:6px 8px 5px;pointer-events:none;position:absolute;text-align:center;text-decoration:none;text-shadow:none;text-transform:none;white-space:pre;z-index:1000000}.yoast-tooltip-alt:after{content:attr(data-label)}.yoast-tooltip:before{border:5px solid #0000;color:#000c;content:"\00a0";display:none;height:0;opacity:0;pointer-events:none;position:absolute;width:0;z-index:1000001}@keyframes yoast-tooltip-appear{0%{opacity:0}to{opacity:1}}.yoast-tooltip:active:after,.yoast-tooltip:active:before,.yoast-tooltip:focus:after,.yoast-tooltip:focus:before,.yoast-tooltip:hover:after,.yoast-tooltip:hover:before{animation-duration:.1s;animation-fill-mode:forwards;animation-name:yoast-tooltip-appear;animation-timing-function:ease-in;display:inline-block;text-decoration:none}.yoast-tooltip-no-delay:active:after,.yoast-tooltip-no-delay:active:before,.yoast-tooltip-no-delay:focus:after,.yoast-tooltip-no-delay:focus:before,.yoast-tooltip-no-delay:hover:after,.yoast-tooltip-no-delay:hover:before{animation:none;opacity:1}.yoast-tooltip-multiline:active:after,.yoast-tooltip-multiline:focus:after,.yoast-tooltip-multiline:hover:after{display:table-cell}.yoast-tooltip-s:after,.yoast-tooltip-se:after,.yoast-tooltip-sw:after{margin-top:5px;right:50%;top:100%}.yoast-tooltip-s:before,.yoast-tooltip-se:before,.yoast-tooltip-sw:before{border-bottom-color:#000c;bottom:-5px;margin-right:-5px;right:50%;top:auto}.yoast-tooltip-se:after{left:50%;margin-left:-15px;right:auto}.yoast-tooltip-sw:after{margin-right:-15px}.yoast-tooltip-n:after,.yoast-tooltip-ne:after,.yoast-tooltip-nw:after{bottom:100%;margin-bottom:5px;right:50%}.yoast-tooltip-n:before,.yoast-tooltip-ne:before,.yoast-tooltip-nw:before{border-top-color:#000c;bottom:auto;margin-right:-5px;right:50%;top:-5px}.yoast-tooltip-ne:after{left:50%;margin-left:-15px;right:auto}.yoast-tooltip-nw:after{margin-right:-15px}.yoast-tooltip-n:after,.yoast-tooltip-s:after{transform:translateX(50%)}.yoast-tooltip-w:after{bottom:50%;margin-right:5px;right:100%;transform:translateY(50%)}.yoast-tooltip-w:before{border-left-color:#000c;bottom:50%;left:-5px;margin-top:-5px;top:50%}.yoast-tooltip-e:after{bottom:50%;left:100%;margin-left:5px;transform:translateY(50%)}.yoast-tooltip-e:before{border-right-color:#000c;bottom:50%;margin-top:-5px;right:-5px;top:50%}.yoast-tooltip-multiline:after{word-wrap:normal;border-collapse:initial;max-width:250px;white-space:pre-line;width:250px;width:max-content;word-break:break-word}.yoast-tooltip-multiline.yoast-tooltip-n:after,.yoast-tooltip-multiline.yoast-tooltip-s:after{left:50%;right:auto;transform:translateX(-50%)}.yoast-tooltip-multiline.yoast-tooltip-e:after,.yoast-tooltip-multiline.yoast-tooltip-w:after{right:100%}@media screen and (min-width:0\0){.yoast-tooltip-multiline:after{width:250px}}.yoast-tooltip-sticky:after,.yoast-tooltip-sticky:before{display:inline-block}.yoast-tooltip-sticky.yoast-tooltip-multiline:after{display:table-cell}@media only screen and (-moz-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.yoast-tooltip-w:after{margin-right:4.5px}}.yoast-tooltip.yoast-tooltip-hidden:after,.yoast-tooltip.yoast-tooltip-hidden:before{display:none}.rtl .yst-icon-rtl{--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.wpseo-premium-indicator{display:inline-block;height:1px;width:1px}#adminmenu .wpseo-premium-indicator{color:inherit;margin:-2px 0 -3px 2px}.wpseo-premium-indicator svg{display:none;height:100%;width:auto}.yoast-measure{max-width:600px}.yoast-measure.padded{max-width:632px}#TB_window .wpseo_content_wrapper p{font-size:14px;font-style:normal}#TB_window .wpseo_content_wrapper label{font-size:14px;font-weight:600;margin:0 10px 0 0}.wpseo-premium-popup-title{font-size:1.3em!important;font-weight:600!important;margin:1em 0!important;padding:0!important}.wpseo-premium-popup-icon{margin:10px}.edit-tags-php .column-description img{height:auto;max-width:100%}.yoast-label-strong{font-weight:600}.yoast-video-container-max-width{max-width:560px}.yoast-video-container{height:0;overflow:hidden;padding-bottom:56.25%;position:relative}.yoast-video-container iframe{height:100%;left:0;position:absolute;top:0;width:100%}.yoast-settings{margin-bottom:2em;padding-left:220px}.yoast-settings h2{margin-bottom:0;margin-left:-220px}.yoast-settings label{color:#23282d;display:inline-block;font-size:14px;font-weight:600;line-height:1.3;margin-left:-220px;margin-right:6px;padding-right:10px;padding-top:4px;vertical-align:top;width:200px}.yoast .yoast-settings__checkbox,.yoast .yoast-settings__radio,.yoast-settings fieldset,.yoast-settings input[type=text],.yoast-settings label,.yoast-settings select,.yoast-settings textarea{margin-bottom:.5em;margin-top:2em}.yoast-settings__textarea--medium{max-width:600px;width:100%}.yoast .yoast-settings__checkbox,.yoast .yoast-settings__radio{position:relative;top:1px;vertical-align:top}.yoast-settings__group--checkbox,.yoast-settings__group--radio{padding-top:1em}.yoast-settings__group--checkbox .yoast-settings__checkbox,.yoast-settings__group--radio .yoast-settings__radio{margin:0 4px 10px 0}.yoast-settings__checkbox+label,.yoast-settings__radio+label{margin-left:0;margin-right:0;max-width:calc(100% - 25px);padding:0;width:auto}.yoast-settings__group--checkbox .yoast-settings__checkbox+label,.yoast-settings__group--radio .yoast-settings__radio+label{font-weight:400;margin-bottom:10px;margin-top:0}.yoast-settings legend{color:#23282d;font-size:14px;font-weight:600}.yoast-settings .description{font-size:14px;margin-top:0}td .wpseo-score-icon{background:#888;border-radius:50%;display:inline-block;height:12px;line-height:16px;margin-left:5px;margin-top:3px;width:12px}.fixed th.column-wpseo-linked,.fixed th.column-wpseo-links,.fixed th.column-wpseo-score,.fixed th.column-wpseo-score-readability{padding:0;width:3em}.fixed th.column-wpseo-score-readability.sortable,.fixed th.column-wpseo-score-readability.sorted,.fixed th.column-wpseo-score.sortable,.fixed th.column-wpseo-score.sorted{width:3.5em}th.column-wpseo-linked a,th.column-wpseo-links a,th.column-wpseo-score .yoast-tooltip,th.column-wpseo-score-readability .yoast-tooltip{display:inline-block;overflow:visible;padding:8px 0;vertical-align:middle}th.column-wpseo-score .yoast-tooltip,th.column-wpseo-score-readability .yoast-tooltip{padding:8px 11px}th.column-wpseo-score-readability.sortable .yoast-tooltip,th.column-wpseo-score-readability.sorted .yoast-tooltip,th.column-wpseo-score.sortable .yoast-tooltip,th.column-wpseo-score.sorted .yoast-tooltip{padding-right:0}.column-wpseo-links .yoast-tooltip-multiline:after{max-width:160px}.column-wpseo-linked .yoast-tooltip-multiline:after{max-width:170px}.yoast-column-header-has-tooltip{position:relative}.manage-column .yoast-column-header-has-tooltip:before{color:#444;content:"";display:inline-block;height:20px;padding:0;text-decoration:none!important;vertical-align:top;width:20px}.manage-column .yoast-linked-to:before{background:#0000 url(../../images/link-out-icon.svg) no-repeat 0 0;background-size:20px}.manage-column .yoast-linked-from:before{background:#0000 url(../../images/link-in-icon.svg) no-repeat 0 0;background-size:20px}.manage-column .yoast-column-seo-score:before{background:#0000 url(../../images/Yoast_SEO_negative_icon.svg) no-repeat 0 0;background-size:20px}.manage-column .yoast-column-readability:before{background:#0000 url(../../images/readability-icon.svg) no-repeat 0 0;background-size:20px}td.column-wpseo-linked,td.column-wpseo-links{word-wrap:normal}@media screen and (max-width:782px){.yoast-settings{padding-left:0}.yoast-settings h2{margin-left:0}.yoast-settings label{margin-left:0;margin-right:0;padding:0;width:auto}.yoast .yoast-settings__radio,.yoast-settings__radio+label{margin-bottom:1em}.yoast-settings__checkbox+label,.yoast-settings__radio+label{max-width:calc(100% - 35px);padding-top:8px}.yoast-settings__group--checkbox .yoast-settings__checkbox+label,.yoast-settings__group--radio .yoast-settings__radio+label{padding-top:4px}.yoast-settings input[type=text],.yoast-settings select,.yoast-settings textarea{box-sizing:border-box;display:block;line-height:1.5;margin-bottom:0;margin-top:0;max-width:none;padding:7px 10px;width:100%}.screen-reader-text.wpseo-score-text{-webkit-clip-path:none;clip-path:none;height:auto;margin:0;position:static!important;width:auto}}.react-tabs__tab-panel{margin:0 auto;max-width:900px}.react-tabs__tab-panel li{max-width:none!important}.contact-premium-support{text-align:center}.contact-premium-support__content{font-size:.9375rem;line-height:1.4;margin:0 auto 1.5em}.contact-premium-support__content:nth-child(2){max-width:610px}.contact-premium-support__content:nth-child(3){max-width:560px}.contact-premium-support .contact-premium-support__button{margin-bottom:48px}.wpseo-premium-description{margin-top:.5em}.wpseo-premium-advantages-list{list-style:disc;padding-left:1.5em}.yoast_help.yoast-help-button,.yoast_help.yoast-help-link{background:#0000;border:0;box-shadow:none;color:#72777c;cursor:pointer;height:20px;margin:0;outline:none;padding:0;position:relative;vertical-align:top;width:20px}.yoast-section .yoast_help.yoast-help-button{float:right}.help-button-inline .yoast_help.yoast-help-button{margin-top:-4px}.yoast-section .yoast_help.yoast-help-button{margin-top:-44px}.wpseo-admin-page .yoast_help.yoast-help-button{margin-right:6px}.yoast_help .yoast-help-icon:before{content:"\f223";left:0;padding:4px;position:absolute;top:0}.yoast_help.yoast-help-button:focus,.yoast_help.yoast-help-button:hover,.yoast_help.yoast-help-link:hover{color:#0073aa}.assessment-results__mark:focus,.yoast_help.yoast-help-button:focus .yoast-help-icon:before,.yoast_help.yoast-help-link:focus .yoast-help-icon:before{border-radius:100%;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc}.yoast-help-panel{clear:both;display:none;font-weight:400;max-width:30em!important;padding:0 0 1em;white-space:normal}.wpseo-admin-page .yoast-help-panel{max-width:600px!important}.copy-home-meta-description{margin-top:1em}.copy-home-meta-description .yoast-help-panel{max-width:400px!important}.yoast-modal_is-open{overflow:hidden}.yoast-notification .yoast-seo-icon{float:left;margin:20px 10px}.yoast-notification .yoast-seo-icon-wrap{margin:0 0 0 85px}.yoast-button-upsell{align-items:center;background-color:#fec228;border-radius:4px;box-shadow:inset 0 -4px 0 #0003;box-sizing:border-box;color:#000;display:inline-flex;filter:drop-shadow(0 2px 4px rgba(0,0,0,.2));font-family:Arial,sans-serif;font-size:16px;justify-content:center;line-height:1.5;min-height:48px;padding:8px 1em;text-decoration:none}.yoast-button-upsell:active,.yoast-button-upsell:focus,.yoast-button-upsell:hover{background-color:#f2ae01;color:#000}.yoast-button-upsell:focus{box-shadow:inset 0 -4px 0 #0003,0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc}.yoast-button-upsell:active{box-shadow:none;filter:none;transform:translateY(1px)}.yoast-button-upsell#wpseo-premium-button{color:#000}.yoast-button-upsell__caret{background:#0000 var(--yoast-svg-icon-caret-right) center no-repeat;flex-shrink:0;height:16px;margin:0 -2px 0 6px;width:8px}.rtl .yoast-button-upsell__caret{background-image:var(--yoast-svg-icon-caret-left)}body.folded .wpseo-admin-submit-fixed{left:36px}@media screen and (max-width:782px){body.folded .wpseo-admin-submit-fixed{left:0}}.wpseo-admin-submit{align-items:baseline;display:flex;justify-content:flex-start;margin:0;padding:16px 0;z-index:5}.wpseo-admin-submit.wpseo-admin-submit-fixed{background-color:#fff;bottom:0;box-shadow:0 1px 8px 1px #00000080;padding:16px;position:fixed;width:600px}@media screen and (max-width:782px){.wpseo-admin-submit.wpseo-admin-submit-fixed{left:0;width:782px}}.wpseo-admin-submit p.submit{margin:0;padding:0}.wpseo-admin-submit p.wpseo-message{color:#008a00;margin:0 16px 0 0;padding:0}.yoast-site-health__signature{color:#707070;display:flex;font-size:12px;line-height:20px;margin-top:2em}.yoast-site-health__inline-button.fetch-status,.yoast-site-health__signature-icon{margin-right:8px}#wpadminbar .yoast-badge,.yoast-badge{border-radius:8px;display:inline-block;font-weight:600;line-height:1.6;padding:0 8px}.yoast-badge{font-size:10px;min-height:16px}.yoast-badge--sale{background-color:#a4286a;border-radius:999px!important;color:#fff;font-size:12px!important;margin-top:-24px;position:absolute;right:30px;transform:rotate(14deg)}@media (max-width:1024px){.yoast-badge--sale{display:inline-block;position:unset;vertical-align:top}}.yoast-badge__is-link:focus,.yoast-badge__is-link:hover{background-color:#004973;box-shadow:none;color:#fff;outline:none}#wpadminbar .yoast-badge,.wp-submenu .yoast-badge{font-size:9px;min-height:14px}.yoast-new-badge{background-color:#cce5ff;color:#004973}.yoast-premium-badge{background-color:#fff3cd;color:#674e00}.yoast-beta-badge{background-color:#cce5ff;color:#004973}.yoast-badge__is-link{text-decoration:none}.switch-container .yoast-badge{vertical-align:-1em}.switch-container legend .yoast-badge{vertical-align:0}.yoast_help+.yoast-badge{vertical-align:bottom}.yoast #crawl-settings fieldset[id$=_disabled],.yoast #crawl-settings p.disabled,.yoast label[for=clean_permalinks_extra_variables_free],.yoast label[for=search_character_limit_free],.yoast p.yoast-extra-variables-label-free{opacity:.5}.yoast #crawl-settings fieldset[id$=_disabled] .switch-toggle.switch-yoast-seo input:disabled~a{background:#a4286a;border:1px solid #b5b5b5}.yoast label[for^=search_character_limit]{font-weight:600;margin-bottom:10px!important;padding-left:2px;width:320px!important}.yoast input[id^=search_character_limit]{width:70px!important}.yoast label[for^=clean_permalinks_extra_variables]{font-weight:600;padding-left:2px;width:240px!important}.yoast input[id^=clean_permalinks_extra_variables]{width:358px!important}.yoast .yoast-crawl-single-setting{margin-top:18px}.yoast p[class*=yoast-extra-variables-label]{padding-left:243px!important}@media screen and (max-width:782px){.yoast p[class*=yoast-extra-variables-label]{margin-top:-20px!important;padding-left:0!important}}.yoast .yoast-crawl-settings-help{font-style:italic}.notice-yoast{background:#fff;border:1px solid #c3c4c7;border-left:4px solid var(--yoast-color-primary);box-shadow:0 1px 1px #0000000a;margin:20px 0 15px;padding:1px 12px}#black-friday-2023-product-editor-checklist .notice-yoast__container{padding:0 5px}.notice-yoast.is-dismissible{padding-right:38px;position:relative}.notice-yoast__container{padding:10px 0 5px}.notice-yoast__container,.notice-yoast__header{align-items:center;display:flex;flex-direction:row}.notice-yoast__header{box-sizing:border-box;justify-content:left;margin-bottom:8px;padding:0;width:100%}.notice-yoast__header .notice-yoast__header-heading{line-height:1.2;margin:0;padding:0}.notice-yoast__header h2.notice-yoast__header-heading{color:var(--yoast-color-primary);font-size:14px;font-weight:600;line-height:1;margin:0}.notice-yoast__header .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:14px;margin-right:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:14px}.notice-yoast__content{display:flex;padding:0}.notice-yoast .notice-yoast__container>svg{height:60px;line-height:1;margin-left:10px;width:auto}.notice-yoast img{height:60px;line-height:1;margin-bottom:5px;margin-left:16px;width:auto}.notice-yoast p{font-size:13px;font-weight:400;line-height:19px;max-width:600px}.notice-yoast .yoast-button--small{min-height:unset}.notice-yoast .notice-dismiss{background:none;border:none;color:#787c82;cursor:pointer;margin:0;padding:9px;position:absolute;right:1px;top:0}.notice-yoast .notice-dismiss:before{speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:none;color:#787c82;content:"\f153";display:block;font:normal 16px/20px dashicons;height:20px;text-align:center;width:20px}.notice-yoast .notice-dismiss:hover:before{color:#d63638}.privacy-settings .notice-yoast{margin:0 20px}.yoast .yoast-crawl-settings-explanation-free,.yoast .yoast-crawl-settings-help-free{opacity:.5}.yoast h3.yoast-crawl-settings,.yoast h3.yoast-crawl-settings-free{margin:2em 0 .5em}.yoast .yoast-crawl-settings-disabled,.yoast h3.yoast-crawl-settings-free{opacity:.5}.yoast .indexables-indexing-error p{margin-bottom:13px}.yoast .indexables-indexing-error strong{font-weight:500}.yoast .indexables-indexing-error summary{font-weight:700}.yoast-dashicons-notice{color:#dba617}#black-friday-2023-promotion-sidebar.notice-yoast{background:#fff;border-color:#fcd34d;border-radius:8px;border-width:2px;margin:20px 0 15px;padding:1px 12px}#black-friday-2023-promotion-sidebar .notice-yoast__header{margin-bottom:2px}#black-friday-2023-promotion-metabox.notice-yoast{background:#fff;border-color:#fcd34d;border-radius:8px;border-width:2px;margin:20px}#black-friday-2023-promotion-metabox h2.notice-yoast__header-heading{padding:0}#black-friday-2023-promotion-metabox .notice-yoast__container{padding-bottom:0}#black-friday-2023-promotion-metabox .notice-yoast__container p{display:inline}#black-friday-2023-promotion-metabox .notice-yoast__header{margin-bottom:8px}#black-friday-2023-promotion-metabox .notice-yoast__header a{font-weight:400;margin-left:13px}.yoast-bf-sale-badge{display:block;left:12px;position:absolute;top:-10px}.yoast-bf-sale-badge,.yoast-menu-bf-sale-badge{background-color:#1f2937;border-radius:8px;color:#fcd34d;font-size:10px;font-weight:600;line-height:normal;padding:2px 8px}.yoast-menu-bf-sale-badge{border:1px solid #fcd34d;margin-left:5px} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/adminbar-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/adminbar-2330-rtl.css new file mode 100644 index 00000000..ebbe7da7 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/adminbar-2330-rtl.css @@ -0,0 +1 @@ +.wpseo-score-icon{background:#888;border-radius:50%!important;display:inline-block!important;height:12px!important;margin:3px 3px 0 10px;vertical-align:top;width:12px!important}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}#wp-admin-bar-wpseo-menu .wpseo-score-icon{margin:10px 4px 0 0!important}#wp-admin-bar-wpseo-menu .wpseo-score-icon.adminbar-sub-menu-score{margin:11px 4px 0 0!important}#wp-admin-bar-wpseo-menu-default .ab-item{line-height:2.46153846!important}#wp-admin-bar-wpseo-menu .ab-submenu{margin-bottom:5px}#wpadminbar .quicklinks #wp-admin-bar-wpseo-menu #wp-admin-bar-wpseo-menu-default li#wp-admin-bar-wpseo-get-premium a{color:#fff!important;font-weight:700!important}#wpadminbar .quicklinks #wp-admin-bar-wpseo-menu #wp-admin-bar-wpseo-menu-default li#wp-admin-bar-wpseo-get-premium span{background:#1f2937;border:1px solid #fcd34d;border-radius:14px;color:#fcd34d;font-size:13px;font-weight:600;padding:1px 4px}#wpadminbar .yoast-menu-bf-sale-badge{background-color:#1f2937;border:1px solid #fcd34d;border-radius:8px;color:#fcd34d;font-size:10px;font-weight:600;line-height:normal;margin-right:5px;padding:2px 8px}#wpadminbar .quicklinks #wp-admin-bar-wpseo-menu .wpseo-focus-keyword{display:inline-block!important;max-width:100px!important;overflow:hidden;text-overflow:ellipsis!important;vertical-align:bottom;white-space:nowrap}#wpadminbar .yoast-badge{border-radius:8px;display:inline-block;font-weight:600;line-height:1.6;margin-right:4px;padding:0 8px}#wpadminbar .yoast-beta-badge{background-color:#cce5ff;color:#004973}#wpadminbar .yoast-premium-badge{background-color:#fff3cd;color:#674e00}#wpadminbar .yoast-issue-added,#wpadminbar .yoast-issue-added:hover{background-color:#a4286a;border-radius:10px 0 10px 10px;box-shadow:-1px 1px 1px 1px grey;color:#fff;right:0;padding:2px 12px;position:absolute;top:32px;white-space:nowrap}#wpadminbar .yoast-issue-added{display:none}#wpadminbar .yoast-issue-counter{background-color:#d63638;border-radius:9px;color:#fff;display:inline;padding:1px 6px 1px 7px!important}#wpadminbar .yoast-logo.svg{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIHN0eWxlPSJmaWxsOiM4Mjg3OGMiIHZpZXdCb3g9IjAgMCA1MTIgNTEyIj48cGF0aCBkPSJNMjAzLjYgMzk1YzYuOC0xNy40IDYuOC0zNi42IDAtNTRsLTc5LjQtMjA0aDcwLjlsNDcuNyAxNDkuNCA3NC44LTIwNy42SDExNi40Yy00MS44IDAtNzYgMzQuMi03NiA3NlYzNTdjMCA0MS44IDM0LjIgNzYgNzYgNzZIMTczYzE2LTguOSAyNC42LTIyLjcgMzAuNi0zOHpNNDcxLjYgMTU0LjhjMC00MS44LTM0LjItNzYtNzYtNzZoLTNMMjg1LjcgMzY1Yy05LjYgMjYuNy0xOS40IDQ5LjMtMzAuMyA2OGgyMTYuMlYxNTQuOHoiLz48cGF0aCBkPSJtMzM4IDEuMy05My4zIDI1OS4xLTQyLjEtMTMxLjloLTg5LjFsODMuOCAyMTUuMmM2IDE1LjUgNiAzMi41IDAgNDgtNy40IDE5LTE5IDM3LjMtNTMgNDEuOWwtNy4yIDF2NzZoOC4zYzgxLjcgMCAxMTguOS01Ny4yIDE0OS42LTE0Mi45TDQzMS42IDEuM0gzMzh6TTI3OS40IDM2MmMtMzIuOSA5Mi02Ny42IDEyOC43LTEyNS43IDEzMS44di00NWMzNy41LTcuNSA1MS4zLTMxIDU5LjEtNTEuMSA3LjUtMTkuMyA3LjUtNDAuNyAwLTYwbC03NS0xOTIuN2g1Mi44bDUzLjMgMTY2LjggMTA1LjktMjk0aDU4LjFMMjc5LjQgMzYyeiIvPjwvc3ZnPg==");background-position:100% 6px;background-repeat:no-repeat;background-size:20px;float:right;height:30px;width:26px}#wpadminbar #wp-admin-bar-wpseo-licenses .ab-item{color:#f18500}@media screen and (max-width:782px){#wp-admin-bar-wpseo-menu .wpseo-score-icon{margin:16px 2px 0 10px!important}#wpadminbar #wp-admin-bar-wpseo-menu{display:block;position:static}#wpadminbar .yoast-logo.svg{background-position:50% 8px;background-size:30px;height:46px;width:52px}#wpadminbar .yoast-logo+.yoast-issue-counter{margin-right:-5px;margin-left:10px}#wpadminbar .ab-sub-wrapper .yoast-issue-counter{position:relative;top:-5px;vertical-align:text-top}#wpadminbar .yoast-issue-added,#wpadminbar .yoast-issue-added:hover{line-height:1.8;top:46px;white-space:normal}#wp-admin-bar-wpseo-menu.menupop .ab-sub-wrapper #wp-admin-bar-wpseo-kwresearch,#wp-admin-bar-wpseo-menu.menupop .ab-sub-wrapper #wp-admin-bar-wpseo-settings{display:none}} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/adminbar-2330.css b/wp-content/plugins/wordpress-seo/css/dist/adminbar-2330.css new file mode 100644 index 00000000..5d8fc6f3 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/adminbar-2330.css @@ -0,0 +1 @@ +.wpseo-score-icon{background:#888;border-radius:50%!important;display:inline-block!important;height:12px!important;margin:3px 10px 0 3px;vertical-align:top;width:12px!important}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}#wp-admin-bar-wpseo-menu .wpseo-score-icon{margin:10px 0 0 4px!important}#wp-admin-bar-wpseo-menu .wpseo-score-icon.adminbar-sub-menu-score{margin:11px 0 0 4px!important}#wp-admin-bar-wpseo-menu-default .ab-item{line-height:2.46153846!important}#wp-admin-bar-wpseo-menu .ab-submenu{margin-bottom:5px}#wpadminbar .quicklinks #wp-admin-bar-wpseo-menu #wp-admin-bar-wpseo-menu-default li#wp-admin-bar-wpseo-get-premium a{color:#fff!important;font-weight:700!important}#wpadminbar .quicklinks #wp-admin-bar-wpseo-menu #wp-admin-bar-wpseo-menu-default li#wp-admin-bar-wpseo-get-premium span{background:#1f2937;border:1px solid #fcd34d;border-radius:14px;color:#fcd34d;font-size:13px;font-weight:600;padding:1px 4px}#wpadminbar .yoast-menu-bf-sale-badge{background-color:#1f2937;border:1px solid #fcd34d;border-radius:8px;color:#fcd34d;font-size:10px;font-weight:600;line-height:normal;margin-left:5px;padding:2px 8px}#wpadminbar .quicklinks #wp-admin-bar-wpseo-menu .wpseo-focus-keyword{display:inline-block!important;max-width:100px!important;overflow:hidden;text-overflow:ellipsis!important;vertical-align:bottom;white-space:nowrap}#wpadminbar .yoast-badge{border-radius:8px;display:inline-block;font-weight:600;line-height:1.6;margin-left:4px;padding:0 8px}#wpadminbar .yoast-beta-badge{background-color:#cce5ff;color:#004973}#wpadminbar .yoast-premium-badge{background-color:#fff3cd;color:#674e00}#wpadminbar .yoast-issue-added,#wpadminbar .yoast-issue-added:hover{background-color:#a4286a;border-radius:0 10px 10px 10px;box-shadow:1px 1px 1px 1px grey;color:#fff;left:0;padding:2px 12px;position:absolute;top:32px;white-space:nowrap}#wpadminbar .yoast-issue-added{display:none}#wpadminbar .yoast-issue-counter{background-color:#d63638;border-radius:9px;color:#fff;display:inline;padding:1px 7px 1px 6px!important}#wpadminbar .yoast-logo.svg{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIHN0eWxlPSJmaWxsOiM4Mjg3OGMiIHZpZXdCb3g9IjAgMCA1MTIgNTEyIj48cGF0aCBkPSJNMjAzLjYgMzk1YzYuOC0xNy40IDYuOC0zNi42IDAtNTRsLTc5LjQtMjA0aDcwLjlsNDcuNyAxNDkuNCA3NC44LTIwNy42SDExNi40Yy00MS44IDAtNzYgMzQuMi03NiA3NlYzNTdjMCA0MS44IDM0LjIgNzYgNzYgNzZIMTczYzE2LTguOSAyNC42LTIyLjcgMzAuNi0zOHpNNDcxLjYgMTU0LjhjMC00MS44LTM0LjItNzYtNzYtNzZoLTNMMjg1LjcgMzY1Yy05LjYgMjYuNy0xOS40IDQ5LjMtMzAuMyA2OGgyMTYuMlYxNTQuOHoiLz48cGF0aCBkPSJtMzM4IDEuMy05My4zIDI1OS4xLTQyLjEtMTMxLjloLTg5LjFsODMuOCAyMTUuMmM2IDE1LjUgNiAzMi41IDAgNDgtNy40IDE5LTE5IDM3LjMtNTMgNDEuOWwtNy4yIDF2NzZoOC4zYzgxLjcgMCAxMTguOS01Ny4yIDE0OS42LTE0Mi45TDQzMS42IDEuM0gzMzh6TTI3OS40IDM2MmMtMzIuOSA5Mi02Ny42IDEyOC43LTEyNS43IDEzMS44di00NWMzNy41LTcuNSA1MS4zLTMxIDU5LjEtNTEuMSA3LjUtMTkuMyA3LjUtNDAuNyAwLTYwbC03NS0xOTIuN2g1Mi44bDUzLjMgMTY2LjggMTA1LjktMjk0aDU4LjFMMjc5LjQgMzYyeiIvPjwvc3ZnPg==");background-position:0 6px;background-repeat:no-repeat;background-size:20px;float:left;height:30px;width:26px}#wpadminbar #wp-admin-bar-wpseo-licenses .ab-item{color:#f18500}@media screen and (max-width:782px){#wp-admin-bar-wpseo-menu .wpseo-score-icon{margin:16px 10px 0 2px!important}#wpadminbar #wp-admin-bar-wpseo-menu{display:block;position:static}#wpadminbar .yoast-logo.svg{background-position:50% 8px;background-size:30px;height:46px;width:52px}#wpadminbar .yoast-logo+.yoast-issue-counter{margin-left:-5px;margin-right:10px}#wpadminbar .ab-sub-wrapper .yoast-issue-counter{position:relative;top:-5px;vertical-align:text-top}#wpadminbar .yoast-issue-added,#wpadminbar .yoast-issue-added:hover{line-height:1.8;top:46px;white-space:normal}#wp-admin-bar-wpseo-menu.menupop .ab-sub-wrapper #wp-admin-bar-wpseo-kwresearch,#wp-admin-bar-wpseo-menu.menupop .ab-sub-wrapper #wp-admin-bar-wpseo-settings{display:none}} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/ai-fix-assessments-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/ai-fix-assessments-2330-rtl.css new file mode 100644 index 00000000..6520677a --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/ai-fix-assessments-2330-rtl.css @@ -0,0 +1 @@ +.yst-fixes-button__lock-icon{background-color:#fde68a;border-radius:50%;height:14px;padding:1px 2px;position:absolute;left:-6px;top:-6px;width:14px}.ai-button:disabled{pointer-events:auto} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/ai-fix-assessments-2330.css b/wp-content/plugins/wordpress-seo/css/dist/ai-fix-assessments-2330.css new file mode 100644 index 00000000..066f8ebd --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/ai-fix-assessments-2330.css @@ -0,0 +1 @@ +.yst-fixes-button__lock-icon{background-color:#fde68a;border-radius:50%;height:14px;padding:1px 2px;position:absolute;right:-6px;top:-6px;width:14px}.ai-button:disabled{pointer-events:auto} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/ai-generator-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/ai-generator-2330-rtl.css new file mode 100644 index 00000000..e8f6cee9 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/ai-generator-2330-rtl.css @@ -0,0 +1 @@ +.yst-replacevar__use-ai-button-upsell{align-items:center;background-color:#f7f7f7;border:1px solid #dbdbdb;border-radius:4px;box-shadow:inset 0 -2px 0 0 #0000001a;box-sizing:border-box;color:#303030;cursor:pointer;display:flex;min-height:32px;padding:0 .5em;transition:var(--yoast-transition-default)}.yst-replacevar__use-ai-button-upsell:hover{background-color:#fff;border-color:var(--yoast-color-border--default);color:#000} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/ai-generator-2330.css b/wp-content/plugins/wordpress-seo/css/dist/ai-generator-2330.css new file mode 100644 index 00000000..e8f6cee9 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/ai-generator-2330.css @@ -0,0 +1 @@ +.yst-replacevar__use-ai-button-upsell{align-items:center;background-color:#f7f7f7;border:1px solid #dbdbdb;border-radius:4px;box-shadow:inset 0 -2px 0 0 #0000001a;box-sizing:border-box;color:#303030;cursor:pointer;display:flex;min-height:32px;padding:0 .5em;transition:var(--yoast-transition-default)}.yst-replacevar__use-ai-button-upsell:hover{background-color:#fff;border-color:var(--yoast-color-border--default);color:#000} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/alerts-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/alerts-2330-rtl.css new file mode 100644 index 00000000..273a5d84 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/alerts-2330-rtl.css @@ -0,0 +1 @@ +.yoast-alert{align-items:flex-start;border:1px solid #0003;display:flex;font-size:13px;line-height:1.5;margin:16px 0;padding:16px}.yoast-alert--error{background:#f9dcdc;color:#8f1919}.yoast-alert--info{background:#cce5ff;color:#00468f}.yoast-alert--success{background:#e2f2cc;color:#395315}.yoast-alert--warning{background:#fff3cd;color:#674e00}.yoast-alert__icon.yoast-alert__icon{display:block;height:16px;margin-left:8px;margin-top:.1rem;max-width:none;width:16px}.yoast-alert a{color:#004973} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/alerts-2330.css b/wp-content/plugins/wordpress-seo/css/dist/alerts-2330.css new file mode 100644 index 00000000..275d7f75 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/alerts-2330.css @@ -0,0 +1 @@ +.yoast-alert{align-items:flex-start;border:1px solid #0003;display:flex;font-size:13px;line-height:1.5;margin:16px 0;padding:16px}.yoast-alert--error{background:#f9dcdc;color:#8f1919}.yoast-alert--info{background:#cce5ff;color:#00468f}.yoast-alert--success{background:#e2f2cc;color:#395315}.yoast-alert--warning{background:#fff3cd;color:#674e00}.yoast-alert__icon.yoast-alert__icon{display:block;height:16px;margin-right:8px;margin-top:.1rem;max-width:none;width:16px}.yoast-alert a{color:#004973} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/black-friday-banner-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/black-friday-banner-2330-rtl.css new file mode 100644 index 00000000..97ab5580 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/black-friday-banner-2330-rtl.css @@ -0,0 +1 @@ +.sidebar__sale_banner_container .sidebar__sale_banner{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity));box-shadow:0 -1px 4px 0 #fcd34d,0 1px 4px 0 #fcd34d,0 -1px 0 0 #fcd34d,0 1px 0 0 #fcd34d;color:#fcd34d;font-size:1.125rem;font-weight:700;letter-spacing:.5px;line-height:30px;margin-bottom:10px;margin-right:-30px;margin-top:1.25rem;padding:.25rem 0;text-align:center;transform:rotate(5deg);width:calc(100% + 60px)}.sidebar__sale_banner_container .sidebar__sale_banner .banner_text{display:inline-block;margin:0 35px}.sidebar__sale_banner_container{margin-bottom:-25px;margin-right:-24px;margin-top:-25px;overflow:hidden;padding-bottom:10px;width:calc(100% + 48px)} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/black-friday-banner-2330.css b/wp-content/plugins/wordpress-seo/css/dist/black-friday-banner-2330.css new file mode 100644 index 00000000..fc2c025b --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/black-friday-banner-2330.css @@ -0,0 +1 @@ +.sidebar__sale_banner_container .sidebar__sale_banner{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity));box-shadow:0 -1px 4px 0 #fcd34d,0 1px 4px 0 #fcd34d,0 -1px 0 0 #fcd34d,0 1px 0 0 #fcd34d;color:#fcd34d;font-size:1.125rem;font-weight:700;letter-spacing:.5px;line-height:30px;margin-bottom:10px;margin-left:-30px;margin-top:1.25rem;padding:.25rem 0;text-align:center;transform:rotate(-5deg);width:calc(100% + 60px)}.sidebar__sale_banner_container .sidebar__sale_banner .banner_text{display:inline-block;margin:0 35px}.sidebar__sale_banner_container{margin-bottom:-25px;margin-left:-24px;margin-top:-25px;overflow:hidden;padding-bottom:10px;width:calc(100% + 48px)} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/dashboard-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/dashboard-2330-rtl.css new file mode 100644 index 00000000..51f5b707 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/dashboard-2330-rtl.css @@ -0,0 +1 @@ +#yoast-seo-dashboard-widget h3{font-weight:700}#yoast-seo-dashboard-widget .assessments,#yoast-seo-dashboard-widget .score-assessments{padding-right:0}#yoast-seo-dashboard-widget .wordpress-feed{border-top:1px solid #eee;margin:16px -12px 0;padding:12px 12px 0}#yoast-seo-dashboard-widget .wordpress-feed .wordpress-feed__post{margin-top:12px}#yoast-seo-dashboard-widget .wordpress-feed .wordpress-feed__footer{border-top:1px solid #eee;margin:0 -12px;padding:4px 12px 0}#yoast-seo-dashboard-widget:empty:before,#yoast-seo-wincher-dashboard-widget:empty:before{animation:rotate 2s linear infinite;background-image:url(../../packages/js/images/Yoast_SEO_Icon.svg);content:"";display:block;height:40px;margin:25px auto;width:40px}@keyframes rotate{0%{transform:perspective(120px) rotateX(0deg) rotateY(0deg);-webkit-transform:perspective(120px) rotateX(0deg) rotateY(0deg)}to{transform:perspective(120px) rotateX(0deg) rotateY(-1turn);-webkit-transform:perspective(120px) rotateX(0deg) rotateY(-1turn)}} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/dashboard-2330.css b/wp-content/plugins/wordpress-seo/css/dist/dashboard-2330.css new file mode 100644 index 00000000..c9a82129 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/dashboard-2330.css @@ -0,0 +1 @@ +#yoast-seo-dashboard-widget h3{font-weight:700}#yoast-seo-dashboard-widget .assessments,#yoast-seo-dashboard-widget .score-assessments{padding-left:0}#yoast-seo-dashboard-widget .wordpress-feed{border-top:1px solid #eee;margin:16px -12px 0;padding:12px 12px 0}#yoast-seo-dashboard-widget .wordpress-feed .wordpress-feed__post{margin-top:12px}#yoast-seo-dashboard-widget .wordpress-feed .wordpress-feed__footer{border-top:1px solid #eee;margin:0 -12px;padding:4px 12px 0}#yoast-seo-dashboard-widget:empty:before,#yoast-seo-wincher-dashboard-widget:empty:before{animation:rotate 2s linear infinite;background-image:url(../../packages/js/images/Yoast_SEO_Icon.svg);content:"";display:block;height:40px;margin:25px auto;width:40px}@keyframes rotate{0%{transform:perspective(120px) rotateX(0deg) rotateY(0deg);-webkit-transform:perspective(120px) rotateX(0deg) rotateY(0deg)}to{transform:perspective(120px) rotateX(0deg) rotateY(1turn);-webkit-transform:perspective(120px) rotateX(0deg) rotateY(1turn)}} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/edit-page-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/edit-page-2330-rtl.css new file mode 100644 index 00000000..63cce966 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/edit-page-2330-rtl.css @@ -0,0 +1 @@ +.wpseo-score-icon{background:#888;border-radius:50%!important;display:inline-block!important;height:12px!important;margin:3px 3px 0 10px;vertical-align:top;width:12px!important}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}@media screen and (max-width:782px){.column-wpseo-focuskw,.column-wpseo-metadesc,.column-wpseo-score,.column-wpseo-title{display:none}} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/edit-page-2330.css b/wp-content/plugins/wordpress-seo/css/dist/edit-page-2330.css new file mode 100644 index 00000000..eb516235 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/edit-page-2330.css @@ -0,0 +1 @@ +.wpseo-score-icon{background:#888;border-radius:50%!important;display:inline-block!important;height:12px!important;margin:3px 10px 0 3px;vertical-align:top;width:12px!important}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}@media screen and (max-width:782px){.column-wpseo-focuskw,.column-wpseo-metadesc,.column-wpseo-score,.column-wpseo-title{display:none}} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/elementor-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/elementor-2330-rtl.css new file mode 100644 index 00000000..13168cb5 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/elementor-2330-rtl.css @@ -0,0 +1 @@ +:root{--yoast-elementor-color-paragraph:#555d66}.yoast,.yoast h2,.yoast h3{font-family:var(--yoast-font-family)!important}.yoast h2{color:var(--yoast-color-dark);font-size:1.3em;font-weight:var(--yoast-font-weight-bold);margin-bottom:1em}.yoast input,.yoast input:focus,.yoast label,.yoast select:focus,.yoast select:not(:focus){background-color:#0000;border-color:var(--yoast-color-secondary-darker);color:var(--yoast-color-font-default)}.yoast label{color:var(--yoast-color-label)}.yoast input[disabled]{background-color:var(--yoast-color-inactive-grey-light)}.yoast.components-panel__body .yoast-title{font-weight:500}.yoast-field-group__title b{font-weight:var(--yoast-font-weight-bold)}.yoast h3 span>span{font-weight:400}.elementor-panel .elementor-tab-control-yoast-tab a:before,.elementor-panel .elementor-tab-control-yoast-tab span:before,.yoast-element-menu-icon:before{background-color:#6d7882;color:#0000;content:".";height:16px;margin:0 auto;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:16px}.yoast-element-menu-icon{display:inline-flex}.yoast-element-menu-icon:before{background-color:#a4afb7;height:19px;width:19px}.yoast-elementor-panel__fills{-webkit-font-smoothing:subpixel-antialiased;background-color:var(--yoast-color-white);color:var(--yoast-color-dark);margin-top:10px;padding:5px 5px 0}.yoast li,.yoast p,.yoast small{line-height:1.5;margin-bottom:6px}.yoast p,.yoast small,.yoast ul[role=list] li{color:var(--yoast-elementor-color-paragraph)}.button-link,.yoast a,.yoast a p,.yoast-elementor-panel__fills p a{color:var(--yoast-color-link);text-decoration:underline}.yoast a.dashicons{color:var(--yoast-color-inactive-text);height:24px;vertical-align:text-bottom;width:24px}.button-link{background:none;border:none;cursor:pointer;font-size:1em;line-height:1.5}.yoast .yoast-button-upsell,.yoast-elementor-panel__fills .UpsellLinkButton{color:var(--yoast-color-label);line-height:1.4em;text-decoration:none}.yoast-elementor-panel__fills h3>button{background:none;border:none;box-shadow:none}.yoast-gutenberg-modal .yoast-notice-container>hr{border-top-color:#ddd;border-top-style:solid}.yoast-gutenberg-modal input[type=radio]{-webkit-appearance:none;-moz-appearance:none;border:var(--yoast-border-default);border-radius:50%;box-shadow:inset 0 2px 4px #0000001a;cursor:pointer;height:18px;margin:0 0 0 8px;overflow:hidden;padding:2px;position:relative;transition:all .15s ease-out 0s;vertical-align:text-bottom;width:18px}.yoast-gutenberg-modal input[type=radio]:checked{background-color:inherit;border-color:var(--yoast-color-primary)}.yoast-gutenberg-modal input[type=radio]:checked:after{background:var(--yoast-color-primary);border-radius:50%;content:"";display:block;height:10px;right:3px;position:absolute;top:3px;width:10px}.yoast-post-settings-modal .yoast-notice-container{bottom:auto}.yoast-gutenberg-modal .components-popover.components-tooltip{right:unset!important;position:relative;left:40px;top:15px!important}.yoast div:focus,div.yoast:focus{outline:0}.yoast .button-link:focus,.yoast a:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc;color:#124964;outline:1px solid #0000}.yoast a.dashicons:focus{color:#1e8cbe}.yoast input[type=radio]:checked:focus{border-color:#fff;box-shadow:var(--yoast-color-focus)}.yoast .yoast-button-upsell:focus{box-shadow:inset 0 -4px 0 #0003,0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc;color:#000}.yoast-elementor-introduction{background-color:#fff;box-shadow:var(--yoast-shadow-default);padding:20px;position:absolute!important;text-align:right;z-index:1}#yoast-introduction{border-radius:3px;right:41px!important;top:5px!important}#yoast-introduction-editor-v2{border:1px solid #000;border-radius:8px}.yoast-elementor-introduction:before{border:solid #0000;content:"";position:absolute}#yoast-introduction:before{border-bottom-color:#fff;border-width:7px 5px;right:-12px;top:8px;transform:rotate(90deg)}#yoast-introduction-editor-v2:before{border-bottom-color:#000;border-width:10px 8px;right:var(--yoast-elementor-introduction-arrow,28%);top:-20px}.yoast-elementor-introduction>div{color:var(--yoast-color-default)}.yoast-elementor-introduction>.dialog-header{font-weight:var(--yoast-font-weight-bold);line-height:1.3}.yoast-elementor-introduction>.dialog-message{margin-top:.5em}.yoast-elementor-introduction>.dialog-buttons-wrapper{display:flex;justify-content:flex-end;margin-top:12px}#yoast-introduction .dialog-button,#yoast-introduction-editor-v2 .dialog-button{background-color:var(--yoast-color-primary);font-size:12px;padding:7px 17px}@media(hover:hover){.button-link:hover,.yoast a:hover,.yoast a:hover p,.yoast-elementor-panel__fills p a:hover{color:var(--yoast-color-primary-darker)}.yoast a.dashicons:hover{color:var(--yoast-color-link)}.yoast .yoast-button-upsell:hover,.yoast-elementor-panel__fills .UpsellLinkButton:hover{color:var(--yoast-color-label)}} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/elementor-2330.css b/wp-content/plugins/wordpress-seo/css/dist/elementor-2330.css new file mode 100644 index 00000000..2411f2b2 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/elementor-2330.css @@ -0,0 +1 @@ +:root{--yoast-elementor-color-paragraph:#555d66}.yoast,.yoast h2,.yoast h3{font-family:var(--yoast-font-family)!important}.yoast h2{color:var(--yoast-color-dark);font-size:1.3em;font-weight:var(--yoast-font-weight-bold);margin-bottom:1em}.yoast input,.yoast input:focus,.yoast label,.yoast select:focus,.yoast select:not(:focus){background-color:#0000;border-color:var(--yoast-color-secondary-darker);color:var(--yoast-color-font-default)}.yoast label{color:var(--yoast-color-label)}.yoast input[disabled]{background-color:var(--yoast-color-inactive-grey-light)}.yoast.components-panel__body .yoast-title{font-weight:500}.yoast-field-group__title b{font-weight:var(--yoast-font-weight-bold)}.yoast h3 span>span{font-weight:400}.elementor-panel .elementor-tab-control-yoast-tab a:before,.elementor-panel .elementor-tab-control-yoast-tab span:before,.yoast-element-menu-icon:before{background-color:#6d7882;color:#0000;content:".";height:16px;margin:0 auto;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:16px}.yoast-element-menu-icon{display:inline-flex}.yoast-element-menu-icon:before{background-color:#a4afb7;height:19px;width:19px}.yoast-elementor-panel__fills{-webkit-font-smoothing:subpixel-antialiased;background-color:var(--yoast-color-white);color:var(--yoast-color-dark);margin-top:10px;padding:5px 5px 0}.yoast li,.yoast p,.yoast small{line-height:1.5;margin-bottom:6px}.yoast p,.yoast small,.yoast ul[role=list] li{color:var(--yoast-elementor-color-paragraph)}.button-link,.yoast a,.yoast a p,.yoast-elementor-panel__fills p a{color:var(--yoast-color-link);text-decoration:underline}.yoast a.dashicons{color:var(--yoast-color-inactive-text);height:24px;vertical-align:text-bottom;width:24px}.button-link{background:none;border:none;cursor:pointer;font-size:1em;line-height:1.5}.yoast .yoast-button-upsell,.yoast-elementor-panel__fills .UpsellLinkButton{color:var(--yoast-color-label);line-height:1.4em;text-decoration:none}.yoast-elementor-panel__fills h3>button{background:none;border:none;box-shadow:none}.yoast-gutenberg-modal .yoast-notice-container>hr{border-top-color:#ddd;border-top-style:solid}.yoast-gutenberg-modal input[type=radio]{-webkit-appearance:none;-moz-appearance:none;border:var(--yoast-border-default);border-radius:50%;box-shadow:inset 0 2px 4px #0000001a;cursor:pointer;height:18px;margin:0 8px 0 0;overflow:hidden;padding:2px;position:relative;transition:all .15s ease-out 0s;vertical-align:text-bottom;width:18px}.yoast-gutenberg-modal input[type=radio]:checked{background-color:inherit;border-color:var(--yoast-color-primary)}.yoast-gutenberg-modal input[type=radio]:checked:after{background:var(--yoast-color-primary);border-radius:50%;content:"";display:block;height:10px;left:3px;position:absolute;top:3px;width:10px}.yoast-post-settings-modal .yoast-notice-container{bottom:auto}.yoast-gutenberg-modal .components-popover.components-tooltip{left:unset!important;position:relative;right:40px;top:15px!important}.yoast div:focus,div.yoast:focus{outline:0}.yoast .button-link:focus,.yoast a:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc;color:#124964;outline:1px solid #0000}.yoast a.dashicons:focus{color:#1e8cbe}.yoast input[type=radio]:checked:focus{border-color:#fff;box-shadow:var(--yoast-color-focus)}.yoast .yoast-button-upsell:focus{box-shadow:inset 0 -4px 0 #0003,0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc;color:#000}.yoast-elementor-introduction{background-color:#fff;box-shadow:var(--yoast-shadow-default);padding:20px;position:absolute!important;text-align:left;z-index:1}#yoast-introduction{border-radius:3px;left:41px!important;top:5px!important}#yoast-introduction-editor-v2{border:1px solid #000;border-radius:8px}.yoast-elementor-introduction:before{border:solid #0000;content:"";position:absolute}#yoast-introduction:before{border-bottom-color:#fff;border-width:7px 5px;left:-12px;top:8px;transform:rotate(-90deg)}#yoast-introduction-editor-v2:before{border-bottom-color:#000;border-width:10px 8px;left:var(--yoast-elementor-introduction-arrow,28%);top:-20px}.yoast-elementor-introduction>div{color:var(--yoast-color-default)}.yoast-elementor-introduction>.dialog-header{font-weight:var(--yoast-font-weight-bold);line-height:1.3}.yoast-elementor-introduction>.dialog-message{margin-top:.5em}.yoast-elementor-introduction>.dialog-buttons-wrapper{display:flex;justify-content:flex-end;margin-top:12px}#yoast-introduction .dialog-button,#yoast-introduction-editor-v2 .dialog-button{background-color:var(--yoast-color-primary);font-size:12px;padding:7px 17px}@media(hover:hover){.button-link:hover,.yoast a:hover,.yoast a:hover p,.yoast-elementor-panel__fills p a:hover{color:var(--yoast-color-primary-darker)}.yoast a.dashicons:hover{color:var(--yoast-color-link)}.yoast .yoast-button-upsell:hover,.yoast-elementor-panel__fills .UpsellLinkButton:hover{color:var(--yoast-color-label)}} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/featured-image-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/featured-image-2330-rtl.css new file mode 100644 index 00000000..336c6100 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/featured-image-2330-rtl.css @@ -0,0 +1 @@ +#yst_opengraph_image_warning{margin-top:0}.yoast-opengraph-image-notice #set-post-thumbnail>img{box-shadow:0 0 0 2px #fff,0 0 0 5px #dc3232} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/featured-image-2330.css b/wp-content/plugins/wordpress-seo/css/dist/featured-image-2330.css new file mode 100644 index 00000000..336c6100 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/featured-image-2330.css @@ -0,0 +1 @@ +#yst_opengraph_image_warning{margin-top:0}.yoast-opengraph-image-notice #set-post-thumbnail>img{box-shadow:0 0 0 2px #fff,0 0 0 5px #dc3232} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/filter-explanation-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/filter-explanation-2330-rtl.css new file mode 100644 index 00000000..bd1b36eb --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/filter-explanation-2330-rtl.css @@ -0,0 +1 @@ +#posts-filter .wpseo-filter-explanation{clear:both;margin:10px 1px 5px} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/filter-explanation-2330.css b/wp-content/plugins/wordpress-seo/css/dist/filter-explanation-2330.css new file mode 100644 index 00000000..bd1b36eb --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/filter-explanation-2330.css @@ -0,0 +1 @@ +#posts-filter .wpseo-filter-explanation{clear:both;margin:10px 1px 5px} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/first-time-configuration-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/first-time-configuration-2330-rtl.css new file mode 100644 index 00000000..f6a2d2cc --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/first-time-configuration-2330-rtl.css @@ -0,0 +1 @@ +#wpseo-first-time-configuration .yst-root .yst-input{--tw-bg-opacity:1!important;--tw-shadow:0 1px 2px 0 #0000000d!important;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important;border-radius:.375rem!important;border-width:1px!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important;font-size:.8125rem!important;padding:.5rem .75rem!important}#wpseo-first-time-configuration .yst-root .yst-radio{align-items:center!important;display:flex!important}#wpseo-first-time-configuration .yst-root .yst-radio__input{--tw-border-opacity:1!important;--tw-text-opacity:1!important;--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important;-webkit-appearance:none!important;appearance:none!important;border-color:rgb(209 213 219/var(--tw-border-opacity))!important;border-radius:9999px!important;border-width:1px!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important;color:rgb(166 30 105/var(--tw-text-opacity))!important;height:1rem!important;margin:0!important;transition-property:none!important;width:1rem!important}#wpseo-first-time-configuration .yst-root .yst-radio__input:before{content:var(--tw-content)!important;display:none!important}#wpseo-first-time-configuration .yst-root .yst-radio__input:checked{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important;border-width:5px!important}#wpseo-first-time-configuration .yst-root .yst-radio__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;--tw-ring-opacity:1!important;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))!important;--tw-ring-offset-width:2px!important;--tw-ring-offset-color:#fff!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important;outline:2px solid #0000!important;outline-offset:2px!important}#wpseo-first-time-configuration .yst-root .yst-radio__label{--tw-text-opacity:1!important;color:rgb(55 65 81/var(--tw-text-opacity))!important;font-weight:500!important;margin-right:.75rem!important}#wpseo-first-time-configuration .yst-root .yst-radio-group__label{margin-bottom:.25rem!important}#wpseo-first-time-configuration .yst-root .yst-radio-group__options{display:flex!important;flex-direction:column!important;gap:.5rem!important}#wpseo-first-time-configuration .yst-root .yst-radio-group__description{margin-bottom:1rem!important}#wpseo-first-time-configuration .yst-root .yst-checkbox__input:before{--tw-content:none!important;content:var(--tw-content)!important} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/first-time-configuration-2330.css b/wp-content/plugins/wordpress-seo/css/dist/first-time-configuration-2330.css new file mode 100644 index 00000000..04d8c25b --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/first-time-configuration-2330.css @@ -0,0 +1 @@ +#wpseo-first-time-configuration .yst-root .yst-input{--tw-bg-opacity:1!important;--tw-shadow:0 1px 2px 0 #0000000d!important;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important;border-radius:.375rem!important;border-width:1px!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important;font-size:.8125rem!important;padding:.5rem .75rem!important}#wpseo-first-time-configuration .yst-root .yst-radio{align-items:center!important;display:flex!important}#wpseo-first-time-configuration .yst-root .yst-radio__input{--tw-border-opacity:1!important;--tw-text-opacity:1!important;--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important;-webkit-appearance:none!important;appearance:none!important;border-color:rgb(209 213 219/var(--tw-border-opacity))!important;border-radius:9999px!important;border-width:1px!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important;color:rgb(166 30 105/var(--tw-text-opacity))!important;height:1rem!important;margin:0!important;transition-property:none!important;width:1rem!important}#wpseo-first-time-configuration .yst-root .yst-radio__input:before{content:var(--tw-content)!important;display:none!important}#wpseo-first-time-configuration .yst-root .yst-radio__input:checked{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important;border-width:5px!important}#wpseo-first-time-configuration .yst-root .yst-radio__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;--tw-ring-opacity:1!important;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))!important;--tw-ring-offset-width:2px!important;--tw-ring-offset-color:#fff!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important;outline:2px solid #0000!important;outline-offset:2px!important}#wpseo-first-time-configuration .yst-root .yst-radio__label{--tw-text-opacity:1!important;color:rgb(55 65 81/var(--tw-text-opacity))!important;font-weight:500!important;margin-left:.75rem!important}#wpseo-first-time-configuration .yst-root .yst-radio-group__label{margin-bottom:.25rem!important}#wpseo-first-time-configuration .yst-root .yst-radio-group__options{display:flex!important;flex-direction:column!important;gap:.5rem!important}#wpseo-first-time-configuration .yst-root .yst-radio-group__description{margin-bottom:1rem!important}#wpseo-first-time-configuration .yst-root .yst-checkbox__input:before{--tw-content:none!important;content:var(--tw-content)!important} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/icons-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/icons-2330-rtl.css new file mode 100644 index 00000000..e8929ee9 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/icons-2330-rtl.css @@ -0,0 +1 @@ +:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/icons-2330.css b/wp-content/plugins/wordpress-seo/css/dist/icons-2330.css new file mode 100644 index 00000000..e8929ee9 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/icons-2330.css @@ -0,0 +1 @@ +:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/inside-editor-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/inside-editor-2330-rtl.css new file mode 100644 index 00000000..c7e4aab5 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/inside-editor-2330-rtl.css @@ -0,0 +1 @@ +.yoast-text-mark{background-color:#e1bee7}.yoast-text-mark__highlight{background-color:#4a148c;color:#fff} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/inside-editor-2330.css b/wp-content/plugins/wordpress-seo/css/dist/inside-editor-2330.css new file mode 100644 index 00000000..c7e4aab5 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/inside-editor-2330.css @@ -0,0 +1 @@ +.yoast-text-mark{background-color:#e1bee7}.yoast-text-mark__highlight{background-color:#4a148c;color:#fff} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/introductions-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/introductions-2330-rtl.css new file mode 100644 index 00000000..7cb43907 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/introductions-2330-rtl.css @@ -0,0 +1 @@ +:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-color-default:#404040;--yoast-color-default-darker:#303030;--yoast-color-primary:#a4286a;--yoast-color-secondary:#f7f7f7;--yoast-color-white:#fff;--yoast-color-green:#6ea029;--yoast-color-primary-darker:#7b1e50;--yoast-color-primary-lighter:#f5d6e6;--yoast-color-secondary-darker:#d9d9d9;--yoast-color-button-upsell:#fec228;--yoast-color-button-upsell-hover:#f2ae01;--yoast-color-dark:#303030;--yoast-color-sale:#fec228;--yoast-color-sale-darker:#feb601;--yoast-color-border:#0003;--yoast-color-label:#303030;--yoast-color-label-help:#707070;--yoast-color-active:#6ea029;--yoast-color-inactive:#dc3232;--yoast-color-inactive-text:#707070;--yoast-color-inactive-grey:#9e9e9e;--yoast-color-inactive-grey-light:#f1f1f1;--yoast-color-active-light:#b6cf94;--yoast-transition-default:all 150ms ease-out;--yoast-color-link:#006dac;--yoast-color-border--default:#0003;--yoast-color-focus:0 0 0 2px #007fff,0 0 0 5px #bfdfff}.yst-root .yst-introduction-modal .yst-modal__close-button{--tw-text-opacity:1;background-color:initial;color:rgb(107 114 128/var(--tw-text-opacity))}.yst-root .yst-introduction-modal .yst-modal__close-button:focus{--tw-ring-offset-width:0px;outline:2px solid #0000;outline-offset:2px}.yst-root .yst-introduction-gradient{background:linear-gradient(-180deg,#a61e6940 10%,#fff0 80%)}.yst-root .yst-introduction-modal-uppercase{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity));letter-spacing:.8px;text-transform:uppercase}.yst-root .yst-logo-icon{background-color:var(--yoast-color-primary);height:17px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:17px} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/introductions-2330.css b/wp-content/plugins/wordpress-seo/css/dist/introductions-2330.css new file mode 100644 index 00000000..6001f965 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/introductions-2330.css @@ -0,0 +1 @@ +:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-color-default:#404040;--yoast-color-default-darker:#303030;--yoast-color-primary:#a4286a;--yoast-color-secondary:#f7f7f7;--yoast-color-white:#fff;--yoast-color-green:#6ea029;--yoast-color-primary-darker:#7b1e50;--yoast-color-primary-lighter:#f5d6e6;--yoast-color-secondary-darker:#d9d9d9;--yoast-color-button-upsell:#fec228;--yoast-color-button-upsell-hover:#f2ae01;--yoast-color-dark:#303030;--yoast-color-sale:#fec228;--yoast-color-sale-darker:#feb601;--yoast-color-border:#0003;--yoast-color-label:#303030;--yoast-color-label-help:#707070;--yoast-color-active:#6ea029;--yoast-color-inactive:#dc3232;--yoast-color-inactive-text:#707070;--yoast-color-inactive-grey:#9e9e9e;--yoast-color-inactive-grey-light:#f1f1f1;--yoast-color-active-light:#b6cf94;--yoast-transition-default:all 150ms ease-out;--yoast-color-link:#006dac;--yoast-color-border--default:#0003;--yoast-color-focus:0 0 0 2px #007fff,0 0 0 5px #bfdfff}.yst-root .yst-introduction-modal .yst-modal__close-button{--tw-text-opacity:1;background-color:initial;color:rgb(107 114 128/var(--tw-text-opacity))}.yst-root .yst-introduction-modal .yst-modal__close-button:focus{--tw-ring-offset-width:0px;outline:2px solid #0000;outline-offset:2px}.yst-root .yst-introduction-gradient{background:linear-gradient(180deg,#a61e6940 10%,#fff0 80%)}.yst-root .yst-introduction-modal-uppercase{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity));letter-spacing:.8px;text-transform:uppercase}.yst-root .yst-logo-icon{background-color:var(--yoast-color-primary);height:17px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:17px} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/metabox-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/metabox-2330-rtl.css new file mode 100644 index 00000000..02554f7f --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/metabox-2330-rtl.css @@ -0,0 +1 @@ +:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.yoast-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#a4286a99;bottom:0;right:0;position:fixed;left:0;top:0;z-index:100000}.yoast-modal{background:#fff;bottom:48px;display:flex;flex-direction:column;height:calc(100% - 96px);right:calc(50% - 440px);max-width:880px;overflow:hidden;position:fixed;top:48px;width:100%}.yoast-gutenberg-modal .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-left:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.yoast-tabs .yoast-modal__content{display:grid;grid-template-areas:"heading heading" "menu content" "menu footer";grid-template-columns:280px 1fr;grid-template-rows:72px 1fr 88px}.yoast-modal__heading{align-items:center;background:var(--yoast-color-white);border-bottom:var(--yoast-border-default);box-sizing:border-box;display:flex;grid-area:heading;min-height:72px;padding:0 24px}.yoast-modal__heading .yoast-close{position:absolute;left:16px}.yoast-gutenberg-modal__box.components-modal__frame{box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}@media (min-width:600px){.yoast-gutenberg-modal__box.components-modal__frame{border-radius:8px;max-height:calc(100% - 48px)}}.yoast-gutenberg-modal__no-padding .components-modal__content{padding:0}.yoast-gutenberg-modal .components-modal__header-heading,.yoast-modal__heading h1{color:var(--yoast-color-primary);font-size:20px;font-weight:400;line-height:1.2;margin:0}.yoast-gutenberg-modal .components-modal__content .components-modal__header{border-bottom:1px solid #e2e8f0!important}.yoast-gutenberg-modal .components-modal__icon-container{display:inline-flex}.yoast-gutenberg-modal .components-modal__icon-container svg,.yoast-modal__heading-icon{fill:var(--yoast-color-primary);flex-shrink:0;height:20px;margin-left:16px;width:19px}.yoast-modal__menu{border-left:var(--yoast-border-default);grid-area:menu;overflow-y:auto}.yoast-modal__menu ul{list-style:none;margin:0;padding:0}.yoast-modal__menu li{border-bottom:var(--yoast-border-default);color:var(--yoast-color-default);cursor:pointer;display:block;font-size:16px;padding:12px 16px 11px;text-decoration:none}.yoast-modal__menu li:hover{background-color:#edd4e1}.yoast-modal__menu li.yoast-tabs__tab--selected{background-color:var(--yoast-color-primary);border-bottom:var(--yoast-border-default);color:#fff}.yoast-modal__content,.yoast-modal__section{display:flex;flex-direction:column;flex-grow:1;grid-area:content;overflow-y:auto;position:relative}.yoast-modal__section *{max-width:600px}.yoast-modal__section-header{background:var(--yoast-color-white);padding:24px 24px 0;position:sticky;top:0;z-index:10}.yoast-modal__section .yoast-h2{border-bottom:var(--yoast-border-default);padding-bottom:24px}.yoast-modal__footer{align-items:center;align-self:flex-end;background:var(--yoast-color-white);border-top:var(--yoast-border-default);bottom:0;box-sizing:border-box;display:flex;grid-area:footer;justify-content:flex-end;margin:0 24px;min-height:88px;padding:0;position:sticky;width:calc(100% - 48px);z-index:10}.yoast-modal__settings-saved{align-items:center;display:inline-flex;margin-left:16px;position:relative}.yoast-modal__settings-saved:before{background:var(--yoast-checkmark--green) no-repeat center;content:"";display:inline-block;height:13px;margin-left:8px;width:14px}.yoast-modal__footer .yoast-button{display:block}.yoast-modal__section-content{flex-grow:1;padding:24px}@media screen and (max-width:880px){.yoast-modal{bottom:0;height:auto;right:0;left:0;top:0}}@media screen and (max-width:782px){.yoast-modal{overflow-y:initial}.yoast-modal.yoast-modal-collapsible{padding-bottom:72px}.yoast-tabs .yoast-modal__content{grid-template-rows:48px 1fr 72px}.yoast-modal__heading{min-height:48px;padding:0 16px;position:fixed;top:0;width:100%;z-index:11}.yoast-modal__heading h1{font-size:var(--yoast-font-size-default)}.yoast-close svg{width:10px}.yoast-modal__heading-icon{height:15px;margin-left:8px}.yoast .yoast-close{left:3px}.yoast-modal__heading .yoast-h2{font-size:var(--yoast-font-size-default)}.yoast-modal__section{flex-grow:0;overflow:initial}.yoast-modal__section-content{margin:0 16px;padding:24px 0}.yoast-modal__section:first-of-type{margin-top:48px}.yoast-modal__section:last-of-type{margin-bottom:72px}.yoast-modal__section-header{margin:0;padding:0;position:sticky;top:48px}.yoast-modal__section-open .yoast-modal__section-header{margin-right:16px;margin-left:16px;padding-right:0;padding-left:0}.yoast-modal__section-open{border-bottom:var(--yoast-border-default)}.yoast-modal__footer{margin:0;min-height:72px;padding:0 16px;position:fixed;width:100%;z-index:11}.yoast-modal-collapsible .yoast-modal__footer{min-height:72px}.yoast-modal-collapsible .yoast-modal__section-content{border-bottom:var(--yoast-border-default);margin:0;padding:24px 16px}.yoast-collapsible__hidden{display:none}.yoast-collapsible__trigger{background:#fff;border:none;border-bottom:var(--yoast-border-default);color:var(--yoast-color-primary);cursor:pointer;font-size:var(--yoast-font-size-default);justify-content:space-between;padding:16px;text-align:right;width:100%}.yoast-collapsible__trigger[aria-expanded=true] .yoast-collapsible__icon{transform:rotate(-180deg)}.yoast-collapsible__trigger[aria-expanded=true]{margin:0 16px;padding:16px 0;width:calc(100% - 32px)}.yoast-collapsible__icon{background-color:var(--yoast-color-white);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8' fill='%23404040'%3E%3Cpath d='M1.4 0 6 4.6 10.6 0 12 1.4 6 7.5 0 1.4z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:10px auto;border:none;display:block;float:left;height:19px;width:19px}.yoast-collapsible-block{margin-top:48px;width:100%}.yoast-collapsible-block+.yoast-collapsible-block{margin-top:0}}.yoast-post-settings-modal{height:100%;max-height:calc(100% - 96px);max-width:calc(100% - 96px);overflow:hidden;width:880px}.yoast-modal-content{padding:16px}@media (min-width:782px){.yoast-modal-content--columns{grid-gap:24px;display:grid;grid-template-columns:1fr 1fr}}.yoast-post-settings-modal__button-container{border-bottom:1px solid #0003;display:flex;flex-direction:column;padding:16px}.yoast-post-settings-modal .components-modal__content{display:flex;flex-direction:column;padding:0}.yoast-post-settings-modal .components-modal__header{border-bottom:var(--yoast-border-default);flex-shrink:0;margin:0}.yoast-post-settings-modal .yoast-notice-container{bottom:0;right:0;margin-top:auto;position:sticky;width:100%;z-index:1}.yoast-post-settings-modal .components-modal__content>div:not([class]):not([class=""]){display:flex;flex-direction:column;overflow:hidden}.yoast-post-settings-modal .yoast-notice-container>hr{margin-bottom:0;margin-top:-1px}.yoast-post-settings-modal .yoast-content-container{flex-grow:1;overflow-y:auto}.yoast-post-settings-modal .yoast-button-container{display:flex;flex-direction:row;justify-content:flex-end;margin:0;padding:24px}.yoast-post-settings-modal .yoast-button-container p{align-self:center;color:var(--yoast-color-label-help);padding-left:24px}.yoast-post-settings-modal .yoast-button-container button{align-self:center;flex-shrink:0;max-height:45px}@media only screen and (max-width:600px){.yoast-post-settings-modal{max-height:100%;max-width:100%}.yoast-post-settings-modal .yoast-button-container{justify-content:space-between;padding:16px}.yoast-post-settings-modal .yoast-button-container p{padding-left:0}}.yoast-related-keyphrases-modal,.yoast-wincher-seo-performance-modal{max-width:712px}.yoast-wincher-seo-performance-modal__content{padding:25px 32px 32px}#yoast-get-related-keyphrases-metabox,#yoast-get-related-keyphrases-sidebar{margin-top:8px}.yoast-gutenberg-modal .yoast-related-keyphrases-modal__content{min-height:66vh;position:relative}#yoast-semrush-country-selector{border:none;position:relative}.yoast-related-keyphrases-modal__chart{display:block}.m6zwb4v,.m6zwb4v:visited{background:#e6f3ff;border-radius:2px;color:#575f67;cursor:pointer;display:inline-block;padding-right:2px;padding-left:2px;-webkit-text-decoration:none;text-decoration:none}.m6zwb4v:focus,.m6zwb4v:hover{background:#edf5fd;color:#677584;outline:0}.m6zwb4v:active{background:#455261;color:#222}.mnw6qvm{background:#fff;border:1px solid #eee;border-radius:2px;box-shadow:0 4px 30px 0 #dcdcdc;box-sizing:border-box;cursor:pointer;display:flex;flex-direction:column;max-width:440px;min-width:220px;padding-bottom:8px;padding-top:8px;position:absolute;transform:scale(0);z-index:2}.m1ymsnxd{opacity:0;transition:opacity .25s cubic-bezier(.3,1.2,.2,1)}.m126ak5t{opacity:1}.mtiwdxc{padding:7px 10px 3px;transition:background-color .4s cubic-bezier(.27,1.27,.48,.56)}.mtiwdxc:active{background-color:#cce7ff}.myz2dw1{background-color:#e6f3ff;padding:7px 10px 3px;transition:background-color .4s cubic-bezier(.27,1.27,.48,.56)}.myz2dw1:active{background-color:#cce7ff}.mpqdcgq{font-size:.9em;margin-bottom:.2em;margin-right:8px;max-width:368px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.m1mfvffo,.mpqdcgq{display:inline-block}.m1mfvffo{border-radius:12px;height:24px;width:24px}.DraftEditor-editorContainer,.DraftEditor-root,.public-DraftEditor-content{height:inherit;text-align:initial}.public-DraftEditor-content[contenteditable=true]{-webkit-user-modify:read-write-plaintext-only}.DraftEditor-root{position:relative}.DraftEditor-editorContainer{background-color:#fff0;border-left:.1px solid #0000;position:relative;z-index:1}.public-DraftEditor-block{position:relative}.DraftEditor-alignLeft .public-DraftStyleDefault-block{text-align:left}.DraftEditor-alignLeft .public-DraftEditorPlaceholder-root{left:0;text-align:left}.DraftEditor-alignCenter .public-DraftStyleDefault-block{text-align:center}.DraftEditor-alignCenter .public-DraftEditorPlaceholder-root{margin:0 auto;text-align:center;width:100%}.DraftEditor-alignRight .public-DraftStyleDefault-block{text-align:right}.DraftEditor-alignRight .public-DraftEditorPlaceholder-root{right:0;text-align:right}.public-DraftEditorPlaceholder-root{color:#9197a3;position:absolute;width:100%;z-index:1}.public-DraftEditorPlaceholder-hasFocus{color:#bdc1c9}.DraftEditorPlaceholder-hidden{display:none}.public-DraftStyleDefault-block{position:relative;white-space:pre-wrap}.public-DraftStyleDefault-ltr{direction:ltr;text-align:left}.public-DraftStyleDefault-rtl{direction:rtl;text-align:right}.public-DraftStyleDefault-listLTR{direction:ltr}.public-DraftStyleDefault-listRTL{direction:rtl}.public-DraftStyleDefault-ol,.public-DraftStyleDefault-ul{margin:16px 0;padding:0}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-listLTR{margin-left:1.5em}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-listRTL{margin-right:1.5em}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-listLTR{margin-left:3em}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-listRTL{margin-right:3em}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-listLTR{margin-left:4.5em}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-listRTL{margin-right:4.5em}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-listLTR{margin-left:6em}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-listRTL{margin-right:6em}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-listLTR{margin-left:7.5em}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-listRTL{margin-right:7.5em}.public-DraftStyleDefault-unorderedListItem{list-style-type:square;position:relative}.public-DraftStyleDefault-unorderedListItem.public-DraftStyleDefault-depth0{list-style-type:disc}.public-DraftStyleDefault-unorderedListItem.public-DraftStyleDefault-depth1{list-style-type:circle}.public-DraftStyleDefault-orderedListItem{list-style-type:none;position:relative}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-listLTR:before{left:-36px;position:absolute;text-align:right;width:30px}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-listRTL:before{position:absolute;right:-36px;text-align:left;width:30px}.public-DraftStyleDefault-orderedListItem:before{content:counter(ol0) ". ";counter-increment:ol0}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth1:before{content:counter(ol1,lower-alpha) ". ";counter-increment:ol1}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth2:before{content:counter(ol2,lower-roman) ". ";counter-increment:ol2}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth3:before{content:counter(ol3) ". ";counter-increment:ol3}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth4:before{content:counter(ol4,lower-alpha) ". ";counter-increment:ol4}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-reset{counter-reset:ol0}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-reset{counter-reset:ol1}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-reset{counter-reset:ol2}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-reset{counter-reset:ol3}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-reset{counter-reset:ol4}#wpseo_meta{box-sizing:border-box}#wpseo_meta *,#wpseo_meta :after,#wpseo_meta :before{box-sizing:inherit}.DraftEditor-root [data-block]{margin:0}#edittag>#wp-description-wrap{display:none}#wp-description-wrap .wp-editor-area{border:0}.term-description-wrap td>textarea#description{min-height:530px}.wpseo-meta-section,.wpseo-meta-section-react{border:1px solid #0003;display:none;height:auto;max-width:600px;min-height:100%;vertical-align:top;width:100%}.wpseo-meta-section-react.active,.wpseo-meta-section.active{background:#fff;position:relative;z-index:12}.wpseo-meta-section.active{display:inline-block}.wpseo-meta-section-react.active{display:block;margin-bottom:10px}.wpseo-meta-section-content{padding:16px}.wpseo-metabox-content{max-width:800px;padding-top:16px}.wpseo-metabox-menu{background-color:#fff;max-width:600px;padding:0}.wpseo-metabox-menu ul{align-items:flex-end;display:flex;flex-wrap:wrap;flex-flow:wrap-reverse;margin:0 0 0 1px;padding:0 16px 0 0}.wpseo-metabox-menu ul li:first-child{z-index:10}.wpseo-metabox-menu ul li:nth-child(2){z-index:9}.wpseo-metabox-menu ul li:nth-child(3){z-index:8}.wpseo-metabox-menu ul li:nth-child(4){z-index:7}.wpseo-metabox-menu ul li:nth-child(5){z-index:6}.wpseo-metabox-menu ul li:nth-child(6){z-index:5}.wpseo-metabox-menu ul li{background-color:#f8f8f8;box-shadow:0 0 4px 0 #0000001a;height:32px;margin-bottom:-1px;margin-right:-1px;position:relative;text-align:center}.wpseo-metabox-menu ul li a{align-items:center;border:1px solid #0003;border-bottom:2px #0000;color:#0073aa;display:flex}.wpseo-metabox-menu ul li a:focus{box-shadow:inherit}.wpseo-metabox-menu ul li .yst-traffic-light{height:20px;margin-right:4px;margin-left:10px;width:auto}.wpseo-metabox-menu ul li span.dashicons{margin-left:8px}.wpseo-metabox-menu ul li span.wpseo-buy-premium{color:#a4286a}.wpseo-metabox-menu ul li span.wpseo-buy-premium:hover{color:#832055}.wpseo-metabox-menu ul li.active{background-color:#fff;border-bottom:2px #0000;box-shadow:none;height:36px;margin-top:-4px;z-index:13}.wpseo-metabox-menu ul li.active a{color:#444;height:36px}.wpseo-metabox-menu ul li.active span.wpseo-buy-premium{border-color:#a4286a;color:#a4286a}.wpseo-metabox-menu ul li.active span.wpseo-buy-premium:hover{border-color:#832055;color:#832055}.wpseo-metabox-menu a{height:32px;padding:0 8px;text-decoration:none}.wpseotab{background-color:#fdfdfd;border:1px solid #ddd;display:none;padding:16px}.wpseotab .wpseo-cornerstone-checkbox{margin-left:.5em}.wpseotab.content{padding:20px 15px}.wpseotab.active{display:block}.wpseo-metabox-sidebar .dashicons{font-size:30px;height:30px;width:30px}#wpseo_meta .inside{margin:0}#wpseo_meta .inside:after{clear:both;content:"";display:table}#wpseo_meta .postbox .inside .wpseotab{font-size:13px!important}.wpseo-form input,.wpseo-form label,.wpseo-form p.error-message,.wpseo-form textarea{max-width:600px}.wpseo-form fieldset{padding-top:5px}.wpseo-form legend{font-weight:600}.wpseo-form label{display:block;font-weight:600}.wpseo-form input[type=checkbox]+label,.wpseo-form input[type=radio]+label{display:inline-block;font-weight:400}.wpseo-form fieldset,.wpseo-form label{margin-bottom:.5em;margin-top:2em}.wpseo-form input[type=checkbox],.wpseo-form input[type=checkbox]+label{font-size:1em;margin-bottom:0;margin-top:2em}.wpseo-form fieldset:first-child,.wpseo-form input[type=checkbox]:first-child,.wpseo-form input[type=checkbox]:first-child+label,.wpseo-form label:first-child{margin-top:10px}.wpseo-form input[type=radio]{margin-top:0}.wpseo-form input[type=radio]+label{margin:0 0 0 1em}.wpseo-form p.error-message{margin:.5em 0}.wpseo-form select[multiple]{margin-top:0}.yoast-metabox__description{margin:.5em 0;max-width:600px}.wpseo_image_upload_button{margin-right:3px}.good,.warn,.wrong{font-weight:600}.good{color:green}.warn{color:maroon}.wrong{color:#dc3232}#current_seo_title span{background-color:#ffffe0;padding:2px 5px}#focuskwresults ul{margin:0}#focuskwresults li,#focuskwresults p{font-size:13px}#focuskwresults li{list-style-type:disc;margin:0 20px 0 0}.wpseo_hidden{display:none}.wpseo_msg{background-color:#ffffe0;border:1px solid #e6db55;margin:5px 0 10px;padding:0 5px}.snippet-editor__button.snippet-editor__edit-button:focus{background-color:#fafafa;border-color:#5b9dd9;box-shadow:0 0 3px #0073aacc;color:#23282d;outline:none}.wpseo-admin-page .subsubsub li{display:inline;max-width:none}.yoast-seo-help-container{float:right;max-width:none;width:100%}.yoast-seo-help-container .yoast-help-panel{margin:.5em 0!important}.wpseo_content_wrapper p.search-box{margin:10px 0 5px}#wpseotab .ui-widget-content .ui-state-hover{background:#f1f1f1;border:1px solid #dfdfdf;color:#333}.yst-traffic-light{height:30px;margin:0 5px 0 0;width:19px}.yst-traffic-light .traffic-light-color{display:none}.yst-traffic-light.bad .traffic-light-red,.yst-traffic-light.good .traffic-light-green,.yst-traffic-light.init .traffic-light-init,.yst-traffic-light.na .traffic-light-empty,.yst-traffic-light.ok .traffic-light-orange{display:inline}.yoast-zapier-text{display:flex}.yoast-zapier-text .yoast-logo.svg{max-width:18px;width:100%!important}.yoast-seo-score .yoast-logo.svg{background:var(--yoast-svg-icon-yoast) no-repeat;background-size:18px;flex-shrink:0;float:right;height:18px;margin-left:7px;width:18px}.yoast-seo-score .yoast-logo.svg.good{background-image:var(--yoast-svg-icon-yoast-good)}.yoast-seo-score .yoast-logo.svg.ok{background-image:var(--yoast-svg-icon-yoast-ok)}.yoast-seo-score .yoast-logo.svg.bad{background-image:var(--yoast-svg-icon-yoast-bad)}.yoast-seo-score .yoast-logo.svg.na,.yoast-seo-score .yoast-logo.svg.noindex{background-image:var(--yoast-svg-icon-yoast)}.term-php .wpseo-taxonomy-metabox-postbox>h2{border-bottom:1px solid #eee;font-size:14px;line-height:1.4;margin:0;padding:8px 12px}#TB_window #TB_ajaxContent p{margin:5px 0 0;padding:5px 0 0}#TB_window #TB_ajaxContent ul{margin:5px 0 10px}#TB_window #TB_ajaxContent li{list-style:none;margin:5px 0 0}#TB_window #TB_ajaxContent li:before{content:"+";font-weight:700;margin:0 0 0 10px}.yoast-section__heading-icon-list{background-image:var(--yoast-svg-icon-list)}.yoast-section__heading-icon-key{background-image:var(--yoast-svg-icon-key)}.yoast-section__heading-icon-edit{background-image:var(--yoast-svg-icon-edit)}.yoast-tooltip.yoast-tooltip-hidden:after,.yoast-tooltip.yoast-tooltip-hidden:before{display:none}.screen-reader-text.wpseo-generic-tab-textual-score,.screen-reader-text.wpseo-keyword-tab-textual-score{display:block}.yoast-notice-go-premium{background:#f1f1f1;border-right-color:#a4286a;margin:0}.editor-styles-wrapper mark.annotation-text-yoast{background-color:#e1bee7}@media screen and (max-width:782px){.wpseo-metabox-buy-premium .wpseo-buy-premium{display:inline-block;height:20px;margin-left:5px;padding:0;width:20px}.yoast-help-panel{max-width:none!important}#wpseo-crawl-issues-table-form .subsubsub{float:none;max-width:calc(100vw - 20px)}#wpseo-crawl-issues-table-form .yoast-help-button{margin-top:3px}.wpseotab select[multiple]{height:auto!important}}@media screen and (max-width:600px){.wpseotab.content{padding:16px 0}}.wpseo-score-icon-container{align-items:center;display:flex;height:20px;justify-content:center;margin-left:8px;width:20px}.yoast-seo-sidebar-panel .yoast-analysis-check{display:flex}.yoast-seo-sidebar-panel .yoast-analysis-check svg{margin-left:5px;margin-top:6px}.yoast-seo-sidebar-panel .yoast-analysis-check span{line-height:1.5;margin-top:3px}.yoast-seo-sidebar-panel div{line-height:2}.yoast-seo-sidebar-panel div svg{vertical-align:middle}ul.yoast-seo-social-share-buttons li{display:inline-block;margin-left:24px}ul.yoast-seo-social-share-buttons li .x-share svg{fill:#000;height:30px;width:30px}ul.yoast-seo-social-share-buttons svg{height:32px;margin-bottom:8px;width:32px}ul.yoast-seo-social-share-buttons a{align-items:center;display:flex;flex-direction:column}.yoast.yoast-zapier{margin:8px 0 25px}.yoast-field-group.yoast-wincher-post-publish{margin-bottom:10px}.edit-post-pinned-plugins button.components-button:not(.is-compact)[aria-label="Yoast SEO Premium"]>svg,.edit-post-pinned-plugins button.components-button:not(.is-compact)[aria-label="Yoast SEO"]>svg,div.interface-pinned-items button.components-button:not(.is-compact)[aria-label="Yoast SEO Premium"]>svg,div.interface-pinned-items button.components-button:not(.is-compact)[aria-label="Yoast SEO"]>svg{height:28px;max-height:28px;max-width:28px;width:28px}div.interface-pinned-items button.components-button.is-pressed[aria-label="Yoast SEO Premium"]>svg path,div.interface-pinned-items button.components-button.is-pressed[aria-label="Yoast SEO"]>svg path{fill:#fff}.wpseo-schema-icon{align-items:center;background-image:var(--yoast-svg-icon-schema);background-size:cover;display:flex;height:16px;justify-content:center;margin-left:8px;width:16px}.wpseo-metabox-menu ul li.active a .wpseo-schema-icon{background-image:var(--yoast-svg-icon-schema-active)}.yoast-icon-span svg{fill:inherit;margin-left:8px}.yoast.components-panel__body{border-top:0}.components-button>.yoast-title-container{flex-grow:1;line-height:normal;overflow-x:hidden}.yoast-title-container>.yoast-subtitle,.yoast-title-container>.yoast-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yoast-title-container>.yoast-subtitle{font-size:.8125rem;font-weight:300;margin-top:2px}.yoast.components-panel__body .yoast-chevron{background-color:#1e1e1e;display:inline-block;height:24px;-webkit-mask-image:var(--yoast-svg-icon-chevron-down);mask-image:var(--yoast-svg-icon-chevron-down);-webkit-mask-size:100% 100%;mask-size:100% 100%;width:24px}.yoast.components-panel__body.is-opened .yoast-chevron{-webkit-mask-image:var(--yoast-svg-icon-chevron-up);mask-image:var(--yoast-svg-icon-chevron-up)}.yoast .components-panel__body-toggle{padding-left:16px}.yoast .components-form-token-field__remove-token.components-button,.yoast .components-form-token-field__token-text{background-color:var(--yoast-color-primary);color:var(--yoast-color-white)}.yoast .yoast-insights{color:#404040}.yoast .yoast-insights .yoast-field-group__title>b{color:var(--yoast-color-primary);font-size:16px;font-weight:var(--yoast-font-weight-default);line-height:1.2em}.yoast .yoast-insights-card__score{color:var(--yoast-color-primary);margin-block:0}.yoast .yoast-insights-card__description{line-height:1.4em}.yoast .yoast-prominent-words p,.yoast .yoast-prominent-words ul,.yoast .yoast-text-formality p{margin-block:1.2em}.yoast #wpseo-metabox-root .yoast-prominent-words{border-bottom:1px solid #0000001a;margin-bottom:24px;padding-bottom:24px}.yoast .yoast-insights .yoast-data-model--upsell li{color:#bbb}.yoast .yoast-insights .yoast-data-model--upsell li:after{background:#fdf4f8} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/metabox-2330.css b/wp-content/plugins/wordpress-seo/css/dist/metabox-2330.css new file mode 100644 index 00000000..edb01a8c --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/metabox-2330.css @@ -0,0 +1,3 @@ +:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.yoast-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#a4286a99;bottom:0;left:0;position:fixed;right:0;top:0;z-index:100000}.yoast-modal{background:#fff;bottom:48px;display:flex;flex-direction:column;height:calc(100% - 96px);left:calc(50% - 440px);max-width:880px;overflow:hidden;position:fixed;top:48px;width:100%}.yoast-gutenberg-modal .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-right:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.yoast-tabs .yoast-modal__content{display:grid;grid-template-areas:"heading heading" "menu content" "menu footer";grid-template-columns:280px 1fr;grid-template-rows:72px 1fr 88px}.yoast-modal__heading{align-items:center;background:var(--yoast-color-white);border-bottom:var(--yoast-border-default);box-sizing:border-box;display:flex;grid-area:heading;min-height:72px;padding:0 24px}.yoast-modal__heading .yoast-close{position:absolute;right:16px}.yoast-gutenberg-modal__box.components-modal__frame{box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}@media (min-width:600px){.yoast-gutenberg-modal__box.components-modal__frame{border-radius:8px;max-height:calc(100% - 48px)}}.yoast-gutenberg-modal__no-padding .components-modal__content{padding:0}.yoast-gutenberg-modal .components-modal__header-heading,.yoast-modal__heading h1{color:var(--yoast-color-primary);font-size:20px;font-weight:400;line-height:1.2;margin:0}.yoast-gutenberg-modal .components-modal__content .components-modal__header{border-bottom:1px solid #e2e8f0!important}.yoast-gutenberg-modal .components-modal__icon-container{display:inline-flex}.yoast-gutenberg-modal .components-modal__icon-container svg,.yoast-modal__heading-icon{fill:var(--yoast-color-primary);flex-shrink:0;height:20px;margin-right:16px;width:19px}.yoast-modal__menu{border-right:var(--yoast-border-default);grid-area:menu;overflow-y:auto}.yoast-modal__menu ul{list-style:none;margin:0;padding:0}.yoast-modal__menu li{border-bottom:var(--yoast-border-default);color:var(--yoast-color-default);cursor:pointer;display:block;font-size:16px;padding:12px 16px 11px;text-decoration:none}.yoast-modal__menu li:hover{background-color:#edd4e1}.yoast-modal__menu li.yoast-tabs__tab--selected{background-color:var(--yoast-color-primary);border-bottom:var(--yoast-border-default);color:#fff}.yoast-modal__content,.yoast-modal__section{display:flex;flex-direction:column;flex-grow:1;grid-area:content;overflow-y:auto;position:relative}.yoast-modal__section *{max-width:600px}.yoast-modal__section-header{background:var(--yoast-color-white);padding:24px 24px 0;position:sticky;top:0;z-index:10}.yoast-modal__section .yoast-h2{border-bottom:var(--yoast-border-default);padding-bottom:24px}.yoast-modal__footer{align-items:center;align-self:flex-end;background:var(--yoast-color-white);border-top:var(--yoast-border-default);bottom:0;box-sizing:border-box;display:flex;grid-area:footer;justify-content:flex-end;margin:0 24px;min-height:88px;padding:0;position:sticky;width:calc(100% - 48px);z-index:10}.yoast-modal__settings-saved{align-items:center;display:inline-flex;margin-right:16px;position:relative}.yoast-modal__settings-saved:before{background:var(--yoast-checkmark--green) no-repeat center;content:"";display:inline-block;height:13px;margin-right:8px;width:14px}.yoast-modal__footer .yoast-button{display:block}.yoast-modal__section-content{flex-grow:1;padding:24px}@media screen and (max-width:880px){.yoast-modal{bottom:0;height:auto;left:0;right:0;top:0}}@media screen and (max-width:782px){.yoast-modal{overflow-y:initial}.yoast-modal.yoast-modal-collapsible{padding-bottom:72px}.yoast-tabs .yoast-modal__content{grid-template-rows:48px 1fr 72px}.yoast-modal__heading{min-height:48px;padding:0 16px;position:fixed;top:0;width:100%;z-index:11}.yoast-modal__heading h1{font-size:var(--yoast-font-size-default)}.yoast-close svg{width:10px}.yoast-modal__heading-icon{height:15px;margin-right:8px}.yoast .yoast-close{right:3px}.yoast-modal__heading .yoast-h2{font-size:var(--yoast-font-size-default)}.yoast-modal__section{flex-grow:0;overflow:initial}.yoast-modal__section-content{margin:0 16px;padding:24px 0}.yoast-modal__section:first-of-type{margin-top:48px}.yoast-modal__section:last-of-type{margin-bottom:72px}.yoast-modal__section-header{margin:0;padding:0;position:sticky;top:48px}.yoast-modal__section-open .yoast-modal__section-header{margin-left:16px;margin-right:16px;padding-left:0;padding-right:0}.yoast-modal__section-open{border-bottom:var(--yoast-border-default)}.yoast-modal__footer{margin:0;min-height:72px;padding:0 16px;position:fixed;width:100%;z-index:11}.yoast-modal-collapsible .yoast-modal__footer{min-height:72px}.yoast-modal-collapsible .yoast-modal__section-content{border-bottom:var(--yoast-border-default);margin:0;padding:24px 16px}.yoast-collapsible__hidden{display:none}.yoast-collapsible__trigger{background:#fff;border:none;border-bottom:var(--yoast-border-default);color:var(--yoast-color-primary);cursor:pointer;font-size:var(--yoast-font-size-default);justify-content:space-between;padding:16px;text-align:left;width:100%}.yoast-collapsible__trigger[aria-expanded=true] .yoast-collapsible__icon{transform:rotate(180deg)}.yoast-collapsible__trigger[aria-expanded=true]{margin:0 16px;padding:16px 0;width:calc(100% - 32px)}.yoast-collapsible__icon{background-color:var(--yoast-color-white);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8' fill='%23404040'%3E%3Cpath d='M1.4 0 6 4.6 10.6 0 12 1.4 6 7.5 0 1.4z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:10px auto;border:none;display:block;float:right;height:19px;width:19px}.yoast-collapsible-block{margin-top:48px;width:100%}.yoast-collapsible-block+.yoast-collapsible-block{margin-top:0}}.yoast-post-settings-modal{height:100%;max-height:calc(100% - 96px);max-width:calc(100% - 96px);overflow:hidden;width:880px}.yoast-modal-content{padding:16px}@media (min-width:782px){.yoast-modal-content--columns{grid-gap:24px;display:grid;grid-template-columns:1fr 1fr}}.yoast-post-settings-modal__button-container{border-bottom:1px solid #0003;display:flex;flex-direction:column;padding:16px}.yoast-post-settings-modal .components-modal__content{display:flex;flex-direction:column;padding:0}.yoast-post-settings-modal .components-modal__header{border-bottom:var(--yoast-border-default);flex-shrink:0;margin:0}.yoast-post-settings-modal .yoast-notice-container{bottom:0;left:0;margin-top:auto;position:sticky;width:100%;z-index:1}.yoast-post-settings-modal .components-modal__content>div:not([class]):not([class=""]){display:flex;flex-direction:column;overflow:hidden}.yoast-post-settings-modal .yoast-notice-container>hr{margin-bottom:0;margin-top:-1px}.yoast-post-settings-modal .yoast-content-container{flex-grow:1;overflow-y:auto}.yoast-post-settings-modal .yoast-button-container{display:flex;flex-direction:row;justify-content:flex-end;margin:0;padding:24px}.yoast-post-settings-modal .yoast-button-container p{align-self:center;color:var(--yoast-color-label-help);padding-right:24px}.yoast-post-settings-modal .yoast-button-container button{align-self:center;flex-shrink:0;max-height:45px}@media only screen and (max-width:600px){.yoast-post-settings-modal{max-height:100%;max-width:100%}.yoast-post-settings-modal .yoast-button-container{justify-content:space-between;padding:16px}.yoast-post-settings-modal .yoast-button-container p{padding-right:0}}.yoast-related-keyphrases-modal,.yoast-wincher-seo-performance-modal{max-width:712px}.yoast-wincher-seo-performance-modal__content{padding:25px 32px 32px}#yoast-get-related-keyphrases-metabox,#yoast-get-related-keyphrases-sidebar{margin-top:8px}.yoast-gutenberg-modal .yoast-related-keyphrases-modal__content{min-height:66vh;position:relative}#yoast-semrush-country-selector{border:none;position:relative}.yoast-related-keyphrases-modal__chart{display:block}.m6zwb4v,.m6zwb4v:visited{background:#e6f3ff;border-radius:2px;color:#575f67;cursor:pointer;display:inline-block;padding-left:2px;padding-right:2px;-webkit-text-decoration:none;text-decoration:none}.m6zwb4v:focus,.m6zwb4v:hover{background:#edf5fd;color:#677584;outline:0}.m6zwb4v:active{background:#455261;color:#222}.mnw6qvm{background:#fff;border:1px solid #eee;border-radius:2px;box-shadow:0 4px 30px 0 #dcdcdc;box-sizing:border-box;cursor:pointer;display:flex;flex-direction:column;max-width:440px;min-width:220px;padding-bottom:8px;padding-top:8px;position:absolute;transform:scale(0);z-index:2}.m1ymsnxd{opacity:0;transition:opacity .25s cubic-bezier(.3,1.2,.2,1)}.m126ak5t{opacity:1}.mtiwdxc{padding:7px 10px 3px;transition:background-color .4s cubic-bezier(.27,1.27,.48,.56)}.mtiwdxc:active{background-color:#cce7ff}.myz2dw1{background-color:#e6f3ff;padding:7px 10px 3px;transition:background-color .4s cubic-bezier(.27,1.27,.48,.56)}.myz2dw1:active{background-color:#cce7ff}.mpqdcgq{font-size:.9em;margin-bottom:.2em;margin-left:8px;max-width:368px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.m1mfvffo,.mpqdcgq{display:inline-block}.m1mfvffo{border-radius:12px;height:24px;width:24px} +/*!rtl:begin:ignore*/.DraftEditor-editorContainer,.DraftEditor-root,.public-DraftEditor-content{height:inherit;text-align:initial}.public-DraftEditor-content[contenteditable=true]{-webkit-user-modify:read-write-plaintext-only}.DraftEditor-root{position:relative}.DraftEditor-editorContainer{background-color:#fff0;border-left:.1px solid #0000;position:relative;z-index:1}.public-DraftEditor-block{position:relative}.DraftEditor-alignLeft .public-DraftStyleDefault-block{text-align:left}.DraftEditor-alignLeft .public-DraftEditorPlaceholder-root{left:0;text-align:left}.DraftEditor-alignCenter .public-DraftStyleDefault-block{text-align:center}.DraftEditor-alignCenter .public-DraftEditorPlaceholder-root{margin:0 auto;text-align:center;width:100%}.DraftEditor-alignRight .public-DraftStyleDefault-block{text-align:right}.DraftEditor-alignRight .public-DraftEditorPlaceholder-root{right:0;text-align:right}.public-DraftEditorPlaceholder-root{color:#9197a3;position:absolute;width:100%;z-index:1}.public-DraftEditorPlaceholder-hasFocus{color:#bdc1c9}.DraftEditorPlaceholder-hidden{display:none}.public-DraftStyleDefault-block{position:relative;white-space:pre-wrap}.public-DraftStyleDefault-ltr{direction:ltr;text-align:left}.public-DraftStyleDefault-rtl{direction:rtl;text-align:right}.public-DraftStyleDefault-listLTR{direction:ltr}.public-DraftStyleDefault-listRTL{direction:rtl}.public-DraftStyleDefault-ol,.public-DraftStyleDefault-ul{margin:16px 0;padding:0}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-listLTR{margin-left:1.5em}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-listRTL{margin-right:1.5em}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-listLTR{margin-left:3em}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-listRTL{margin-right:3em}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-listLTR{margin-left:4.5em}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-listRTL{margin-right:4.5em}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-listLTR{margin-left:6em}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-listRTL{margin-right:6em}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-listLTR{margin-left:7.5em}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-listRTL{margin-right:7.5em}.public-DraftStyleDefault-unorderedListItem{list-style-type:square;position:relative}.public-DraftStyleDefault-unorderedListItem.public-DraftStyleDefault-depth0{list-style-type:disc}.public-DraftStyleDefault-unorderedListItem.public-DraftStyleDefault-depth1{list-style-type:circle}.public-DraftStyleDefault-orderedListItem{list-style-type:none;position:relative}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-listLTR:before{left:-36px;position:absolute;text-align:right;width:30px}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-listRTL:before{position:absolute;right:-36px;text-align:left;width:30px}.public-DraftStyleDefault-orderedListItem:before{content:counter(ol0) ". ";counter-increment:ol0}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth1:before{content:counter(ol1,lower-alpha) ". ";counter-increment:ol1}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth2:before{content:counter(ol2,lower-roman) ". ";counter-increment:ol2}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth3:before{content:counter(ol3) ". ";counter-increment:ol3}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth4:before{content:counter(ol4,lower-alpha) ". ";counter-increment:ol4}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-reset{counter-reset:ol0}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-reset{counter-reset:ol1}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-reset{counter-reset:ol2}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-reset{counter-reset:ol3}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-reset{counter-reset:ol4} +/*!rtl:end:ignore*/#wpseo_meta{box-sizing:border-box}#wpseo_meta *,#wpseo_meta :after,#wpseo_meta :before{box-sizing:inherit}.DraftEditor-root [data-block]{margin:0}#edittag>#wp-description-wrap{display:none}#wp-description-wrap .wp-editor-area{border:0}.term-description-wrap td>textarea#description{min-height:530px}.wpseo-meta-section,.wpseo-meta-section-react{border:1px solid #0003;display:none;height:auto;max-width:600px;min-height:100%;vertical-align:top;width:100%}.wpseo-meta-section-react.active,.wpseo-meta-section.active{background:#fff;position:relative;z-index:12}.wpseo-meta-section.active{display:inline-block}.wpseo-meta-section-react.active{display:block;margin-bottom:10px}.wpseo-meta-section-content{padding:16px}.wpseo-metabox-content{max-width:800px;padding-top:16px}.wpseo-metabox-menu{background-color:#fff;max-width:600px;padding:0}.wpseo-metabox-menu ul{align-items:flex-end;display:flex;flex-wrap:wrap;flex-flow:wrap-reverse;margin:0 1px 0 0;padding:0 0 0 16px}.wpseo-metabox-menu ul li:first-child{z-index:10}.wpseo-metabox-menu ul li:nth-child(2){z-index:9}.wpseo-metabox-menu ul li:nth-child(3){z-index:8}.wpseo-metabox-menu ul li:nth-child(4){z-index:7}.wpseo-metabox-menu ul li:nth-child(5){z-index:6}.wpseo-metabox-menu ul li:nth-child(6){z-index:5}.wpseo-metabox-menu ul li{background-color:#f8f8f8;box-shadow:0 0 4px 0 #0000001a;height:32px;margin-bottom:-1px;margin-left:-1px;position:relative;text-align:center}.wpseo-metabox-menu ul li a{align-items:center;border:1px solid #0003;border-bottom:2px #0000;color:#0073aa;display:flex}.wpseo-metabox-menu ul li a:focus{box-shadow:inherit}.wpseo-metabox-menu ul li .yst-traffic-light{height:20px;margin-left:4px;margin-right:10px;width:auto}.wpseo-metabox-menu ul li span.dashicons{margin-right:8px}.wpseo-metabox-menu ul li span.wpseo-buy-premium{color:#a4286a}.wpseo-metabox-menu ul li span.wpseo-buy-premium:hover{color:#832055}.wpseo-metabox-menu ul li.active{background-color:#fff;border-bottom:2px #0000;box-shadow:none;height:36px;margin-top:-4px;z-index:13}.wpseo-metabox-menu ul li.active a{color:#444;height:36px}.wpseo-metabox-menu ul li.active span.wpseo-buy-premium{border-color:#a4286a;color:#a4286a}.wpseo-metabox-menu ul li.active span.wpseo-buy-premium:hover{border-color:#832055;color:#832055}.wpseo-metabox-menu a{height:32px;padding:0 8px;text-decoration:none}.wpseotab{background-color:#fdfdfd;border:1px solid #ddd;display:none;padding:16px}.wpseotab .wpseo-cornerstone-checkbox{margin-right:.5em}.wpseotab.content{padding:20px 15px}.wpseotab.active{display:block}.wpseo-metabox-sidebar .dashicons{font-size:30px;height:30px;width:30px}#wpseo_meta .inside{margin:0}#wpseo_meta .inside:after{clear:both;content:"";display:table}#wpseo_meta .postbox .inside .wpseotab{font-size:13px!important}.wpseo-form input,.wpseo-form label,.wpseo-form p.error-message,.wpseo-form textarea{max-width:600px}.wpseo-form fieldset{padding-top:5px}.wpseo-form legend{font-weight:600}.wpseo-form label{display:block;font-weight:600}.wpseo-form input[type=checkbox]+label,.wpseo-form input[type=radio]+label{display:inline-block;font-weight:400}.wpseo-form fieldset,.wpseo-form label{margin-bottom:.5em;margin-top:2em}.wpseo-form input[type=checkbox],.wpseo-form input[type=checkbox]+label{font-size:1em;margin-bottom:0;margin-top:2em}.wpseo-form fieldset:first-child,.wpseo-form input[type=checkbox]:first-child,.wpseo-form input[type=checkbox]:first-child+label,.wpseo-form label:first-child{margin-top:10px}.wpseo-form input[type=radio]{margin-top:0}.wpseo-form input[type=radio]+label{margin:0 1em 0 0}.wpseo-form p.error-message{margin:.5em 0}.wpseo-form select[multiple]{margin-top:0}.yoast-metabox__description{margin:.5em 0;max-width:600px}.wpseo_image_upload_button{margin-left:3px}.good,.warn,.wrong{font-weight:600}.good{color:green}.warn{color:maroon}.wrong{color:#dc3232}#current_seo_title span{background-color:#ffffe0;padding:2px 5px}#focuskwresults ul{margin:0}#focuskwresults li,#focuskwresults p{font-size:13px}#focuskwresults li{list-style-type:disc;margin:0 0 0 20px}.wpseo_hidden{display:none}.wpseo_msg{background-color:#ffffe0;border:1px solid #e6db55;margin:5px 0 10px;padding:0 5px}.snippet-editor__button.snippet-editor__edit-button:focus{background-color:#fafafa;border-color:#5b9dd9;box-shadow:0 0 3px #0073aacc;color:#23282d;outline:none}.wpseo-admin-page .subsubsub li{display:inline;max-width:none}.yoast-seo-help-container{float:left;max-width:none;width:100%}.yoast-seo-help-container .yoast-help-panel{margin:.5em 0!important}.wpseo_content_wrapper p.search-box{margin:10px 0 5px}#wpseotab .ui-widget-content .ui-state-hover{background:#f1f1f1;border:1px solid #dfdfdf;color:#333}.yst-traffic-light{height:30px;margin:0 0 0 5px;width:19px}.yst-traffic-light .traffic-light-color{display:none}.yst-traffic-light.bad .traffic-light-red,.yst-traffic-light.good .traffic-light-green,.yst-traffic-light.init .traffic-light-init,.yst-traffic-light.na .traffic-light-empty,.yst-traffic-light.ok .traffic-light-orange{display:inline}.yoast-zapier-text{display:flex}.yoast-zapier-text .yoast-logo.svg{max-width:18px;width:100%!important}.yoast-seo-score .yoast-logo.svg{background:var(--yoast-svg-icon-yoast) no-repeat;background-size:18px;flex-shrink:0;float:left;height:18px;margin-right:7px;width:18px}.yoast-seo-score .yoast-logo.svg.good{background-image:var(--yoast-svg-icon-yoast-good)}.yoast-seo-score .yoast-logo.svg.ok{background-image:var(--yoast-svg-icon-yoast-ok)}.yoast-seo-score .yoast-logo.svg.bad{background-image:var(--yoast-svg-icon-yoast-bad)}.yoast-seo-score .yoast-logo.svg.na,.yoast-seo-score .yoast-logo.svg.noindex{background-image:var(--yoast-svg-icon-yoast)}.term-php .wpseo-taxonomy-metabox-postbox>h2{border-bottom:1px solid #eee;font-size:14px;line-height:1.4;margin:0;padding:8px 12px}#TB_window #TB_ajaxContent p{margin:5px 0 0;padding:5px 0 0}#TB_window #TB_ajaxContent ul{margin:5px 0 10px}#TB_window #TB_ajaxContent li{list-style:none;margin:5px 0 0}#TB_window #TB_ajaxContent li:before{content:"+";font-weight:700;margin:0 10px 0 0}.yoast-section__heading-icon-list{background-image:var(--yoast-svg-icon-list)}.yoast-section__heading-icon-key{background-image:var(--yoast-svg-icon-key)}.yoast-section__heading-icon-edit{background-image:var(--yoast-svg-icon-edit)}.yoast-tooltip.yoast-tooltip-hidden:after,.yoast-tooltip.yoast-tooltip-hidden:before{display:none}.screen-reader-text.wpseo-generic-tab-textual-score,.screen-reader-text.wpseo-keyword-tab-textual-score{display:block}.yoast-notice-go-premium{background:#f1f1f1;border-left-color:#a4286a;margin:0}.editor-styles-wrapper mark.annotation-text-yoast{background-color:#e1bee7}@media screen and (max-width:782px){.wpseo-metabox-buy-premium .wpseo-buy-premium{display:inline-block;height:20px;margin-right:5px;padding:0;width:20px}.yoast-help-panel{max-width:none!important}#wpseo-crawl-issues-table-form .subsubsub{float:none;max-width:calc(100vw - 20px)}#wpseo-crawl-issues-table-form .yoast-help-button{margin-top:3px}.wpseotab select[multiple]{height:auto!important}}@media screen and (max-width:600px){.wpseotab.content{padding:16px 0}}.wpseo-score-icon-container{align-items:center;display:flex;height:20px;justify-content:center;margin-right:8px;width:20px}.yoast-seo-sidebar-panel .yoast-analysis-check{display:flex}.yoast-seo-sidebar-panel .yoast-analysis-check svg{margin-right:5px;margin-top:6px}.yoast-seo-sidebar-panel .yoast-analysis-check span{line-height:1.5;margin-top:3px}.yoast-seo-sidebar-panel div{line-height:2}.yoast-seo-sidebar-panel div svg{vertical-align:middle}ul.yoast-seo-social-share-buttons li{display:inline-block;margin-right:24px}ul.yoast-seo-social-share-buttons li .x-share svg{fill:#000;height:30px;width:30px}ul.yoast-seo-social-share-buttons svg{height:32px;margin-bottom:8px;width:32px}ul.yoast-seo-social-share-buttons a{align-items:center;display:flex;flex-direction:column}.yoast.yoast-zapier{margin:8px 0 25px}.yoast-field-group.yoast-wincher-post-publish{margin-bottom:10px}.edit-post-pinned-plugins button.components-button:not(.is-compact)[aria-label="Yoast SEO Premium"]>svg,.edit-post-pinned-plugins button.components-button:not(.is-compact)[aria-label="Yoast SEO"]>svg,div.interface-pinned-items button.components-button:not(.is-compact)[aria-label="Yoast SEO Premium"]>svg,div.interface-pinned-items button.components-button:not(.is-compact)[aria-label="Yoast SEO"]>svg{height:28px;max-height:28px;max-width:28px;width:28px}div.interface-pinned-items button.components-button.is-pressed[aria-label="Yoast SEO Premium"]>svg path,div.interface-pinned-items button.components-button.is-pressed[aria-label="Yoast SEO"]>svg path{fill:#fff}.wpseo-schema-icon{align-items:center;background-image:var(--yoast-svg-icon-schema);background-size:cover;display:flex;height:16px;justify-content:center;margin-right:8px;width:16px}.wpseo-metabox-menu ul li.active a .wpseo-schema-icon{background-image:var(--yoast-svg-icon-schema-active)}.yoast-icon-span svg{fill:inherit;margin-right:8px}.yoast.components-panel__body{border-top:0}.components-button>.yoast-title-container{flex-grow:1;line-height:normal;overflow-x:hidden}.yoast-title-container>.yoast-subtitle,.yoast-title-container>.yoast-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yoast-title-container>.yoast-subtitle{font-size:.8125rem;font-weight:300;margin-top:2px}.yoast.components-panel__body .yoast-chevron{background-color:#1e1e1e;display:inline-block;height:24px;-webkit-mask-image:var(--yoast-svg-icon-chevron-down);mask-image:var(--yoast-svg-icon-chevron-down);-webkit-mask-size:100% 100%;mask-size:100% 100%;width:24px}.yoast.components-panel__body.is-opened .yoast-chevron{-webkit-mask-image:var(--yoast-svg-icon-chevron-up);mask-image:var(--yoast-svg-icon-chevron-up)}.yoast .components-panel__body-toggle{padding-right:16px}.yoast .components-form-token-field__remove-token.components-button,.yoast .components-form-token-field__token-text{background-color:var(--yoast-color-primary);color:var(--yoast-color-white)}.yoast .yoast-insights{color:#404040}.yoast .yoast-insights .yoast-field-group__title>b{color:var(--yoast-color-primary);font-size:16px;font-weight:var(--yoast-font-weight-default);line-height:1.2em}.yoast .yoast-insights-card__score{color:var(--yoast-color-primary);margin-block:0}.yoast .yoast-insights-card__description{line-height:1.4em}.yoast .yoast-prominent-words p,.yoast .yoast-prominent-words ul,.yoast .yoast-text-formality p{margin-block:1.2em}.yoast #wpseo-metabox-root .yoast-prominent-words{border-bottom:1px solid #0000001a;margin-bottom:24px;padding-bottom:24px}.yoast .yoast-insights .yoast-data-model--upsell li{color:#bbb}.yoast .yoast-insights .yoast-data-model--upsell li:after{background:#fdf4f8} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/metabox-primary-category-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/metabox-primary-category-2330-rtl.css new file mode 100644 index 00000000..6070b13b --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/metabox-primary-category-2330-rtl.css @@ -0,0 +1 @@ +.wpseo-is-primary-term,.wpseo-primary-term>label{font-weight:600}.wpseo-non-primary-term>.wpseo-is-primary-term,.wpseo-primary-term>.wpseo-make-primary-term,.wpseo-term-unchecked>.wpseo-is-primary-term,.wpseo-term-unchecked>.wpseo-make-primary-term{display:none}.wpseo-is-primary-term,.wpseo-make-primary-term{float:left}.wpseo-non-primary-term:after,.wpseo-non-primary-term:before,.wpseo-primary-term:after,.wpseo-primary-term:before{content:"";display:table}.wpseo-non-primary-term:after,.wpseo-primary-term:after{clear:both}.wpseo-make-primary-term{background:none;border:none;color:#0073aa;cursor:pointer;margin:4px 0 0;padding:0;text-decoration:underline}.wpseo-make-primary-term:hover{color:#00a0d2} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/metabox-primary-category-2330.css b/wp-content/plugins/wordpress-seo/css/dist/metabox-primary-category-2330.css new file mode 100644 index 00000000..32b768ce --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/metabox-primary-category-2330.css @@ -0,0 +1 @@ +.wpseo-is-primary-term,.wpseo-primary-term>label{font-weight:600}.wpseo-non-primary-term>.wpseo-is-primary-term,.wpseo-primary-term>.wpseo-make-primary-term,.wpseo-term-unchecked>.wpseo-is-primary-term,.wpseo-term-unchecked>.wpseo-make-primary-term{display:none}.wpseo-is-primary-term,.wpseo-make-primary-term{float:right}.wpseo-non-primary-term:after,.wpseo-non-primary-term:before,.wpseo-primary-term:after,.wpseo-primary-term:before{content:"";display:table}.wpseo-non-primary-term:after,.wpseo-primary-term:after{clear:both}.wpseo-make-primary-term{background:none;border:none;color:#0073aa;cursor:pointer;margin:4px 0 0;padding:0;text-decoration:underline}.wpseo-make-primary-term:hover{color:#00a0d2} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/modal-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/modal-2330-rtl.css new file mode 100644 index 00000000..9737503e --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/modal-2330-rtl.css @@ -0,0 +1 @@ +.yoast-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#a4286a99;bottom:0;right:0;position:fixed;left:0;top:0;z-index:100000}.yoast-modal{background:#fff;bottom:48px;display:flex;flex-direction:column;height:calc(100% - 96px);right:calc(50% - 440px);max-width:880px;overflow:hidden;position:fixed;top:48px;width:100%}.yoast-gutenberg-modal .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-left:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.yoast-tabs .yoast-modal__content{display:grid;grid-template-areas:"heading heading" "menu content" "menu footer";grid-template-columns:280px 1fr;grid-template-rows:72px 1fr 88px}.yoast-modal__heading{align-items:center;background:var(--yoast-color-white);border-bottom:var(--yoast-border-default);box-sizing:border-box;display:flex;grid-area:heading;min-height:72px;padding:0 24px}.yoast-modal__heading .yoast-close{position:absolute;left:16px}.yoast-gutenberg-modal__box.components-modal__frame{box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}@media (min-width:600px){.yoast-gutenberg-modal__box.components-modal__frame{border-radius:8px;max-height:calc(100% - 48px)}}.yoast-gutenberg-modal__no-padding .components-modal__content{padding:0}.yoast-gutenberg-modal .components-modal__header-heading,.yoast-modal__heading h1{color:var(--yoast-color-primary);font-size:20px;font-weight:400;line-height:1.2;margin:0}.yoast-gutenberg-modal .components-modal__content .components-modal__header{border-bottom:1px solid #e2e8f0!important}.yoast-gutenberg-modal .components-modal__icon-container{display:inline-flex}.yoast-gutenberg-modal .components-modal__icon-container svg,.yoast-modal__heading-icon{fill:var(--yoast-color-primary);flex-shrink:0;height:20px;margin-left:16px;width:19px}.yoast-modal__menu{border-left:var(--yoast-border-default);grid-area:menu;overflow-y:auto}.yoast-modal__menu ul{list-style:none;margin:0;padding:0}.yoast-modal__menu li{border-bottom:var(--yoast-border-default);color:var(--yoast-color-default);cursor:pointer;display:block;font-size:16px;padding:12px 16px 11px;text-decoration:none}.yoast-modal__menu li:hover{background-color:#edd4e1}.yoast-modal__menu li.yoast-tabs__tab--selected{background-color:var(--yoast-color-primary);border-bottom:var(--yoast-border-default);color:#fff}.yoast-modal__content,.yoast-modal__section{display:flex;flex-direction:column;flex-grow:1;grid-area:content;overflow-y:auto;position:relative}.yoast-modal__section *{max-width:600px}.yoast-modal__section-header{background:var(--yoast-color-white);padding:24px 24px 0;position:sticky;top:0;z-index:10}.yoast-modal__section .yoast-h2{border-bottom:var(--yoast-border-default);padding-bottom:24px}.yoast-modal__footer{align-items:center;align-self:flex-end;background:var(--yoast-color-white);border-top:var(--yoast-border-default);bottom:0;box-sizing:border-box;display:flex;grid-area:footer;justify-content:flex-end;margin:0 24px;min-height:88px;padding:0;position:sticky;width:calc(100% - 48px);z-index:10}.yoast-modal__settings-saved{align-items:center;display:inline-flex;margin-left:16px;position:relative}.yoast-modal__settings-saved:before{background:var(--yoast-checkmark--green) no-repeat center;content:"";display:inline-block;height:13px;margin-left:8px;width:14px}.yoast-modal__footer .yoast-button{display:block}.yoast-modal__section-content{flex-grow:1;padding:24px}@media screen and (max-width:880px){.yoast-modal{bottom:0;height:auto;right:0;left:0;top:0}}@media screen and (max-width:782px){.yoast-modal{overflow-y:initial}.yoast-modal.yoast-modal-collapsible{padding-bottom:72px}.yoast-tabs .yoast-modal__content{grid-template-rows:48px 1fr 72px}.yoast-modal__heading{min-height:48px;padding:0 16px;position:fixed;top:0;width:100%;z-index:11}.yoast-modal__heading h1{font-size:var(--yoast-font-size-default)}.yoast-close svg{width:10px}.yoast-modal__heading-icon{height:15px;margin-left:8px}.yoast .yoast-close{left:3px}.yoast-modal__heading .yoast-h2{font-size:var(--yoast-font-size-default)}.yoast-modal__section{flex-grow:0;overflow:initial}.yoast-modal__section-content{margin:0 16px;padding:24px 0}.yoast-modal__section:first-of-type{margin-top:48px}.yoast-modal__section:last-of-type{margin-bottom:72px}.yoast-modal__section-header{margin:0;padding:0;position:sticky;top:48px}.yoast-modal__section-open .yoast-modal__section-header{margin-right:16px;margin-left:16px;padding-right:0;padding-left:0}.yoast-modal__section-open{border-bottom:var(--yoast-border-default)}.yoast-modal__footer{margin:0;min-height:72px;padding:0 16px;position:fixed;width:100%;z-index:11}.yoast-modal-collapsible .yoast-modal__footer{min-height:72px}.yoast-modal-collapsible .yoast-modal__section-content{border-bottom:var(--yoast-border-default);margin:0;padding:24px 16px}.yoast-collapsible__hidden{display:none}.yoast-collapsible__trigger{background:#fff;border:none;border-bottom:var(--yoast-border-default);color:var(--yoast-color-primary);cursor:pointer;font-size:var(--yoast-font-size-default);justify-content:space-between;padding:16px;text-align:right;width:100%}.yoast-collapsible__trigger[aria-expanded=true] .yoast-collapsible__icon{transform:rotate(-180deg)}.yoast-collapsible__trigger[aria-expanded=true]{margin:0 16px;padding:16px 0;width:calc(100% - 32px)}.yoast-collapsible__icon{background-color:var(--yoast-color-white);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8' fill='%23404040'%3E%3Cpath d='M1.4 0 6 4.6 10.6 0 12 1.4 6 7.5 0 1.4z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:10px auto;border:none;display:block;float:left;height:19px;width:19px}.yoast-collapsible-block{margin-top:48px;width:100%}.yoast-collapsible-block+.yoast-collapsible-block{margin-top:0}}.yoast-post-settings-modal{height:100%;max-height:calc(100% - 96px);max-width:calc(100% - 96px);overflow:hidden;width:880px}.yoast-modal-content{padding:16px}@media (min-width:782px){.yoast-modal-content--columns{grid-gap:24px;display:grid;grid-template-columns:1fr 1fr}}.yoast-post-settings-modal__button-container{border-bottom:1px solid #0003;display:flex;flex-direction:column;padding:16px}.yoast-post-settings-modal .components-modal__content{display:flex;flex-direction:column;padding:0}.yoast-post-settings-modal .components-modal__header{border-bottom:var(--yoast-border-default);flex-shrink:0;margin:0}.yoast-post-settings-modal .yoast-notice-container{bottom:0;right:0;margin-top:auto;position:sticky;width:100%;z-index:1}.yoast-post-settings-modal .components-modal__content>div:not([class]):not([class=""]){display:flex;flex-direction:column;overflow:hidden}.yoast-post-settings-modal .yoast-notice-container>hr{margin-bottom:0;margin-top:-1px}.yoast-post-settings-modal .yoast-content-container{flex-grow:1;overflow-y:auto}.yoast-post-settings-modal .yoast-button-container{display:flex;flex-direction:row;justify-content:flex-end;margin:0;padding:24px}.yoast-post-settings-modal .yoast-button-container p{align-self:center;color:var(--yoast-color-label-help);padding-left:24px}.yoast-post-settings-modal .yoast-button-container button{align-self:center;flex-shrink:0;max-height:45px}@media only screen and (max-width:600px){.yoast-post-settings-modal{max-height:100%;max-width:100%}.yoast-post-settings-modal .yoast-button-container{justify-content:space-between;padding:16px}.yoast-post-settings-modal .yoast-button-container p{padding-left:0}}.yoast-related-keyphrases-modal,.yoast-wincher-seo-performance-modal{max-width:712px}.yoast-wincher-seo-performance-modal__content{padding:25px 32px 32px}#yoast-get-related-keyphrases-metabox,#yoast-get-related-keyphrases-sidebar{margin-top:8px}.yoast-gutenberg-modal .yoast-related-keyphrases-modal__content{min-height:66vh;position:relative}#yoast-semrush-country-selector{border:none;position:relative}.yoast-related-keyphrases-modal__chart{display:block} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/modal-2330.css b/wp-content/plugins/wordpress-seo/css/dist/modal-2330.css new file mode 100644 index 00000000..b4af6b4f --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/modal-2330.css @@ -0,0 +1 @@ +.yoast-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#a4286a99;bottom:0;left:0;position:fixed;right:0;top:0;z-index:100000}.yoast-modal{background:#fff;bottom:48px;display:flex;flex-direction:column;height:calc(100% - 96px);left:calc(50% - 440px);max-width:880px;overflow:hidden;position:fixed;top:48px;width:100%}.yoast-gutenberg-modal .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-right:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.yoast-tabs .yoast-modal__content{display:grid;grid-template-areas:"heading heading" "menu content" "menu footer";grid-template-columns:280px 1fr;grid-template-rows:72px 1fr 88px}.yoast-modal__heading{align-items:center;background:var(--yoast-color-white);border-bottom:var(--yoast-border-default);box-sizing:border-box;display:flex;grid-area:heading;min-height:72px;padding:0 24px}.yoast-modal__heading .yoast-close{position:absolute;right:16px}.yoast-gutenberg-modal__box.components-modal__frame{box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}@media (min-width:600px){.yoast-gutenberg-modal__box.components-modal__frame{border-radius:8px;max-height:calc(100% - 48px)}}.yoast-gutenberg-modal__no-padding .components-modal__content{padding:0}.yoast-gutenberg-modal .components-modal__header-heading,.yoast-modal__heading h1{color:var(--yoast-color-primary);font-size:20px;font-weight:400;line-height:1.2;margin:0}.yoast-gutenberg-modal .components-modal__content .components-modal__header{border-bottom:1px solid #e2e8f0!important}.yoast-gutenberg-modal .components-modal__icon-container{display:inline-flex}.yoast-gutenberg-modal .components-modal__icon-container svg,.yoast-modal__heading-icon{fill:var(--yoast-color-primary);flex-shrink:0;height:20px;margin-right:16px;width:19px}.yoast-modal__menu{border-right:var(--yoast-border-default);grid-area:menu;overflow-y:auto}.yoast-modal__menu ul{list-style:none;margin:0;padding:0}.yoast-modal__menu li{border-bottom:var(--yoast-border-default);color:var(--yoast-color-default);cursor:pointer;display:block;font-size:16px;padding:12px 16px 11px;text-decoration:none}.yoast-modal__menu li:hover{background-color:#edd4e1}.yoast-modal__menu li.yoast-tabs__tab--selected{background-color:var(--yoast-color-primary);border-bottom:var(--yoast-border-default);color:#fff}.yoast-modal__content,.yoast-modal__section{display:flex;flex-direction:column;flex-grow:1;grid-area:content;overflow-y:auto;position:relative}.yoast-modal__section *{max-width:600px}.yoast-modal__section-header{background:var(--yoast-color-white);padding:24px 24px 0;position:sticky;top:0;z-index:10}.yoast-modal__section .yoast-h2{border-bottom:var(--yoast-border-default);padding-bottom:24px}.yoast-modal__footer{align-items:center;align-self:flex-end;background:var(--yoast-color-white);border-top:var(--yoast-border-default);bottom:0;box-sizing:border-box;display:flex;grid-area:footer;justify-content:flex-end;margin:0 24px;min-height:88px;padding:0;position:sticky;width:calc(100% - 48px);z-index:10}.yoast-modal__settings-saved{align-items:center;display:inline-flex;margin-right:16px;position:relative}.yoast-modal__settings-saved:before{background:var(--yoast-checkmark--green) no-repeat center;content:"";display:inline-block;height:13px;margin-right:8px;width:14px}.yoast-modal__footer .yoast-button{display:block}.yoast-modal__section-content{flex-grow:1;padding:24px}@media screen and (max-width:880px){.yoast-modal{bottom:0;height:auto;left:0;right:0;top:0}}@media screen and (max-width:782px){.yoast-modal{overflow-y:initial}.yoast-modal.yoast-modal-collapsible{padding-bottom:72px}.yoast-tabs .yoast-modal__content{grid-template-rows:48px 1fr 72px}.yoast-modal__heading{min-height:48px;padding:0 16px;position:fixed;top:0;width:100%;z-index:11}.yoast-modal__heading h1{font-size:var(--yoast-font-size-default)}.yoast-close svg{width:10px}.yoast-modal__heading-icon{height:15px;margin-right:8px}.yoast .yoast-close{right:3px}.yoast-modal__heading .yoast-h2{font-size:var(--yoast-font-size-default)}.yoast-modal__section{flex-grow:0;overflow:initial}.yoast-modal__section-content{margin:0 16px;padding:24px 0}.yoast-modal__section:first-of-type{margin-top:48px}.yoast-modal__section:last-of-type{margin-bottom:72px}.yoast-modal__section-header{margin:0;padding:0;position:sticky;top:48px}.yoast-modal__section-open .yoast-modal__section-header{margin-left:16px;margin-right:16px;padding-left:0;padding-right:0}.yoast-modal__section-open{border-bottom:var(--yoast-border-default)}.yoast-modal__footer{margin:0;min-height:72px;padding:0 16px;position:fixed;width:100%;z-index:11}.yoast-modal-collapsible .yoast-modal__footer{min-height:72px}.yoast-modal-collapsible .yoast-modal__section-content{border-bottom:var(--yoast-border-default);margin:0;padding:24px 16px}.yoast-collapsible__hidden{display:none}.yoast-collapsible__trigger{background:#fff;border:none;border-bottom:var(--yoast-border-default);color:var(--yoast-color-primary);cursor:pointer;font-size:var(--yoast-font-size-default);justify-content:space-between;padding:16px;text-align:left;width:100%}.yoast-collapsible__trigger[aria-expanded=true] .yoast-collapsible__icon{transform:rotate(180deg)}.yoast-collapsible__trigger[aria-expanded=true]{margin:0 16px;padding:16px 0;width:calc(100% - 32px)}.yoast-collapsible__icon{background-color:var(--yoast-color-white);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8' fill='%23404040'%3E%3Cpath d='M1.4 0 6 4.6 10.6 0 12 1.4 6 7.5 0 1.4z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:10px auto;border:none;display:block;float:right;height:19px;width:19px}.yoast-collapsible-block{margin-top:48px;width:100%}.yoast-collapsible-block+.yoast-collapsible-block{margin-top:0}}.yoast-post-settings-modal{height:100%;max-height:calc(100% - 96px);max-width:calc(100% - 96px);overflow:hidden;width:880px}.yoast-modal-content{padding:16px}@media (min-width:782px){.yoast-modal-content--columns{grid-gap:24px;display:grid;grid-template-columns:1fr 1fr}}.yoast-post-settings-modal__button-container{border-bottom:1px solid #0003;display:flex;flex-direction:column;padding:16px}.yoast-post-settings-modal .components-modal__content{display:flex;flex-direction:column;padding:0}.yoast-post-settings-modal .components-modal__header{border-bottom:var(--yoast-border-default);flex-shrink:0;margin:0}.yoast-post-settings-modal .yoast-notice-container{bottom:0;left:0;margin-top:auto;position:sticky;width:100%;z-index:1}.yoast-post-settings-modal .components-modal__content>div:not([class]):not([class=""]){display:flex;flex-direction:column;overflow:hidden}.yoast-post-settings-modal .yoast-notice-container>hr{margin-bottom:0;margin-top:-1px}.yoast-post-settings-modal .yoast-content-container{flex-grow:1;overflow-y:auto}.yoast-post-settings-modal .yoast-button-container{display:flex;flex-direction:row;justify-content:flex-end;margin:0;padding:24px}.yoast-post-settings-modal .yoast-button-container p{align-self:center;color:var(--yoast-color-label-help);padding-right:24px}.yoast-post-settings-modal .yoast-button-container button{align-self:center;flex-shrink:0;max-height:45px}@media only screen and (max-width:600px){.yoast-post-settings-modal{max-height:100%;max-width:100%}.yoast-post-settings-modal .yoast-button-container{justify-content:space-between;padding:16px}.yoast-post-settings-modal .yoast-button-container p{padding-right:0}}.yoast-related-keyphrases-modal,.yoast-wincher-seo-performance-modal{max-width:712px}.yoast-wincher-seo-performance-modal__content{padding:25px 32px 32px}#yoast-get-related-keyphrases-metabox,#yoast-get-related-keyphrases-sidebar{margin-top:8px}.yoast-gutenberg-modal .yoast-related-keyphrases-modal__content{min-height:66vh;position:relative}#yoast-semrush-country-selector{border:none;position:relative}.yoast-related-keyphrases-modal__chart{display:block} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/monorepo-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/monorepo-2330-rtl.css new file mode 100644 index 00000000..6ca7bccf --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/monorepo-2330-rtl.css @@ -0,0 +1 @@ +:root{--yoast-border-default:1px solid #0003;--yoast-color-default:#404040;--yoast-color-default-darker:#303030;--yoast-color-primary:#a4286a;--yoast-color-secondary:#f7f7f7;--yoast-color-white:#fff;--yoast-color-green:#6ea029;--yoast-color-primary-darker:#7b1e50;--yoast-color-primary-lighter:#f5d6e6;--yoast-color-secondary-darker:#d9d9d9;--yoast-color-button-upsell:#fec228;--yoast-color-button-upsell-hover:#f2ae01;--yoast-color-dark:#303030;--yoast-color-sale:#fec228;--yoast-color-sale-darker:#feb601;--yoast-color-border:#0003;--yoast-color-label:#303030;--yoast-color-label-help:#707070;--yoast-color-active:#6ea029;--yoast-color-inactive:#dc3232;--yoast-color-inactive-text:#707070;--yoast-color-inactive-grey:#9e9e9e;--yoast-color-inactive-grey-light:#f1f1f1;--yoast-color-active-light:#b6cf94;--yoast-transition-default:all 150ms ease-out;--yoast-color-link:#006dac;--yoast-color-border--default:#0003;--yoast-color-focus:0 0 0 2px #007fff,0 0 0 5px #bfdfff;--yoast-svg-icon-chevron-down:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-chevron-up:url('data:image/svg+xml;charset=utf-8,');--yoast-checkmark--white:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23FFF' viewBox='0 0 512 512'%3E%3Cpath d='m173.898 439.404-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001'/%3E%3C/svg%3E");--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23m-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23m640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' aria-hidden='true' viewBox='0 0 1792 1792'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' aria-hidden='true' viewBox='0 0 192 512'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960M944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34m848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136m0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136m1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5M384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136m1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5m0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5'/%3E%3C/svg%3E");--yoast-svg-icon-key:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-edit:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url('data:image/svg+xml;charset=utf-8,');--yoast-checkmark--green:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%236EA029' viewBox='0 0 512 512'%3E%3Cpath d='m173.898 439.404-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001'/%3E%3C/svg%3E");--yoast-exclamation-mark:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23DC3232' viewBox='0 0 512 512'%3E%3Cpath d='M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248m-248 50c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46m-43.673-165.346 7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654'/%3E%3C/svg%3E");--yoast-svg-icon-schema:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M149.333 56v80c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V56c0-13.255 10.745-24 24-24h101.333c13.255 0 24 10.745 24 24m181.334 240v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24m32-240v80c0 13.255 10.745 24 24 24H488c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24m-32 80V56c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24m-205.334 56H24c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24M0 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24m386.667-56H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24m0 160H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24M181.333 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24'/%3E%3C/svg%3E");--yoast-svg-icon-schema-active:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' aria-hidden='true'%3E%3Cpath fill='D4444' d='M149.333 56v80c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V56c0-13.255 10.745-24 24-24h101.333c13.255 0 24 10.745 24 24m181.334 240v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24m32-240v80c0 13.255 10.745 24 24 24H488c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24m-32 80V56c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24m-205.334 56H24c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24M0 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24m386.667-56H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24m0 160H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24M181.333 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24'/%3E%3C/svg%3E");--yoast-svg-icon-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='%23707070' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m4 16 4.586-4.586a2 2 0 0 1 2.828 0L16 16m-2-2 1.586-1.586a2 2 0 0 1 2.828 0L20 14m-6-6h.01M6 20h12a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2'/%3E%3C/svg%3E");--yoast-font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;--yoast-font-size-default:14px;--yoast-font-weight-default:400;--yoast-font-weight-bold:600;--yoast-color-font-default:#404040;--yoast-shadow-default:0px 3px 6px #00000026}.yoast-h1,.yoast-h2,.yoast-h3{color:var(--yoast-color-primary);font-weight:400;line-height:1.2;margin:0}.yoast-h1 a,.yoast-h2 a,.yoast-h3 a{color:var(--yoast-color-primary);text-decoration:none}.yoast-h1{font-size:24px}.yoast-h2{font-size:20px}.yoast-h3{font-size:16px}.yoast-paragraph{font-size:var(--yoast-font-size-default);margin-top:0}.screen-reader-text{clip:rect(1px,1px,1px,1px);word-wrap:normal!important;border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);margin:-1px;padding:0}.screen-reader-text,.visually-hidden{height:1px;overflow:hidden;position:absolute;width:1px}.visually-hidden{clip:rect(1px,1px,1px,1px);word-wrap:normal;white-space:nowrap}@media (max-width:782px){.yoast-show-on-mobile{display:initial!important}}@media (min-width:782px){.yoast-hide-on-desktop{display:none}}.yoast-field-group__title-separator{display:flex;flex-wrap:wrap}.yoast-field-group__title-separator label{align-items:center;border:var(--yoast-border-default);box-sizing:border-box;cursor:pointer;display:flex;flex-direction:column;height:42px;justify-content:center;margin:0 0 6px 6px;width:42px}.yoast-field-group__title-separator input[type=radio]:checked+label{border:3px solid var(--yoast-color-primary)}.yoast .yoast-button{align-items:center;border:1px solid #0003;border-radius:4px;box-shadow:inset 0 -2px 0 #0000001a;cursor:pointer;display:inline-flex;font-size:14px;justify-content:center;line-height:1.2;padding:10px 12px 12px;position:relative;text-decoration:none;transition:background-color .15s ease-out 0s}.yoast .yoast-button:focus,.yoast-close:focus,.yoast-hide:focus,.yoast-remove:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast .yoast-button::-moz-focus-inner,.yoast-close::-moz-focus-inner,.yoast-hide::-moz-focus-inner,.yoast-remove::-moz-focus-inner{border:0}.yoast .yoast-button:not(:disabled):active{box-shadow:none;top:2px}.yoast .yoast-button:disabled{cursor:default;opacity:.5}.yoast .yoast-button--primary{background-color:var(--yoast-color-primary)}.yoast .yoast-button--primary,.yoast .yoast-button--primary:visited{border:1px solid #0003;color:var(--yoast-color-white)}.yoast .yoast-button--primary:active,.yoast .yoast-button--primary:not(:disabled):hover{background-color:var(--yoast-color-primary-darker);border:1px solid #0003;color:var(--yoast-color-white)}.yoast .yoast-button--primary:focus{background-color:var(--yoast-color-primary);color:var(--yoast-color-white)}.yoast .yoast-button--secondary{background-color:var(--yoast-color-secondary);box-shadow:inset 0 -2px 0 #0000001a;color:var(--yoast-color-dark)}.yoast .yoast-button--secondary:visited{color:var(--yoast-color-dark)}.yoast .yoast-button--secondary:active,.yoast .yoast-button--secondary:not(:disabled):hover{background-color:var(--yoast-color-secondary-darker);border:1px solid #0003;color:var(--yoast-color-dark)}.yoast .yoast-button--buy{background-color:var(--yoast-color-sale)}.yoast .yoast-button--buy,.yoast .yoast-button--buy:visited{color:var(--yoast-color-dark)}.yoast .yoast-button--buy:active,.yoast .yoast-button--buy:not(:disabled):hover{background-color:var(--yoast-color-sale-darker);color:var(--yoast-color-dark)}.yoast .yoast-button--buy__caret{height:16px;margin:0 6px 0 -2px;-webkit-mask-image:var(--yoast-svg-icon-caret-right);mask-image:var(--yoast-svg-icon-caret-right);width:6px}.yoast .yoast-button--buy__caret,.yoast .yoast-button--edit{background-color:currentColor;display:inline-block;flex-shrink:0}.yoast .yoast-button--edit{height:18px;margin-left:8px;-webkit-mask-image:var(--yoast-svg-icon-edit);mask-image:var(--yoast-svg-icon-edit);width:20.25px}html[dir=rtl] .yoast .yoast-button--edit{margin-right:8px;margin-left:0}html[dir=rtl] .yoast .yoast-button--buy{flex-direction:row-reverse}.yoast .yoast-button--small{font-size:13px;padding:5px 8px 8px}.yoast .yoast-button--small .yoast-button--buy__caret{height:10px;width:4px}.yoast-hide,.yoast-remove{background-color:initial;border:none;color:#dc3232;cursor:pointer;font-size:14px;padding:0;text-decoration:underline}.yoast-hide{color:var(--yoast-color-link)}.yoast-field-group__upload .yoast-button{margin-left:24px}.yoast-close{align-items:center;background:none;border:none;box-shadow:none;cursor:pointer;display:flex;height:44px;justify-content:center;padding:0;width:44px}.yoast-close svg{fill:var(--yoast-color-default);width:14px}@media screen and (max-width:782px){.yoast-close svg{width:10px}}.yoast-field-group__checkbox{align-items:center;display:flex}.yoast-field-group__checkbox:not(.yoast-field-group__checkbox--horizontal)+.yoast-field-group__checkbox{margin-top:4px}.yoast-field-group__checkbox label{cursor:pointer}.yoast-field-group__checkbox input[type=checkbox]{-webkit-appearance:none;-moz-appearance:none;border:var(--yoast-border-default);border-radius:2px;box-shadow:inset 0 2px 4px #0000001a;cursor:pointer;height:18px;margin:2px 0 0 8px;overflow:hidden;padding:2px;position:relative;transition:background-color .15s ease-out 0s;width:18px}.yoast-field-group__checkbox input[type=checkbox]:checked:focus,.yoast-field-group__checkbox input[type=checkbox]:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast label+input[type=checkbox]{margin-right:16px}.yoast-field-group__checkbox input[type=checkbox]:checked{background:var(--yoast-checkmark--white) var(--yoast-color-primary) no-repeat center /13px;border:1px solid var(--yoast-color-primary);box-shadow:none}.yoast-field-group__checkbox input[type=checkbox]:checked:before{content:""}.yoast-field-group{border:none;margin:0 0 24px;padding:0;position:relative}.yoast-field-group__title{align-items:center;color:var(--yoast-color-label);display:flex;font-size:var(--yoast-font-size-default);font-weight:var(--yoast-font-weight-bold);line-height:1.5;margin:0 0 8px;padding:0}.yoast-field-group__title.yoast-field-group__title--light{font-weight:var(--yoast-font-weight-default)}.yoast-field-group .field-group-description{margin:0 0 1em}.yoast-field-group__inline{align-items:center;display:flex}.yoast-field-group__inline .yoast-field-group__inputfield{margin-left:8px}.yoast-field-group__inline .yoast-button{flex-shrink:0}.yoast-field-group .components-form-token-field__label{display:none}@media screen and (max-width:782px){.yoast-field-group__inline{display:block}.yoast-field-group__inline .yoast-field-group__inputfield{margin-bottom:8px;margin-left:0}}.yoast-help{margin-right:4px}.yoast-help__icon svg{fill:var(--yoast-color-inactive-text);height:12px;transition:var(--yoast-transition-default);width:12px}.yoast-help:focus svg,.yoast-help:hover svg{fill:var(--yoast-color-link)}.yoast-data-model{list-style:none;padding:0}.yoast-data-model li{font-weight:var(--yoast-font-weight-bold);line-height:1.4;padding:0 8px;position:relative;z-index:2}.yoast-data-model span{float:left;font-weight:var(--yoast-font-weight-default)}.yoast-data-model li+li{margin-top:9px}.yoast-data-model li:after{background:#f5d6e6;content:"";height:20px;right:0;position:absolute;width:var(--yoast-width);z-index:-1}.yoast-image-select__preview{align-items:center;background-color:initial;border:1px solid #0003;display:flex;justify-content:center;max-height:200px;max-width:100%;min-height:165px;overflow:hidden;padding:0;width:300px}.yoast-image-select__preview--no-preview{background:var(--yoast-color-inactive-grey-light) var(--yoast-svg-icon-image) no-repeat center center /64px 64px}.yoast-image-select__preview.yoast-image-select__preview-has-warnings{margin-bottom:16px}.yoast-image-select__preview .yoast-image-select__preview--image{height:100%;max-width:100%;object-fit:contain}.yoast-image-select .yoast-field-group__inputfield{margin-bottom:1em}.yoast-image-select .yoast-button{margin-left:1.5em}.yoast-image-select{margin-bottom:1.7em;margin-top:1.7em}.yoast-image-select .yoast-image-select-buttons button{margin-top:1em}#organization-image-select .yoast-image-select{margin-top:0}:root{--yoast-color-placeholder:#707070}.yoast .yoast-field-group__inputfield,.yoast .yoast-field-group__textarea{background:var(--yoast-color-white);border:var(--yoast-border-default);border-radius:0;box-shadow:inset 0 2px 4px #0000001a;box-sizing:border-box;font-size:var(--yoast-font-size-default);padding:8px;width:100%}.yoast .yoast-field-group__inputfield:focus,.yoast .yoast-field-group__textarea:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast-field-group__upload .yoast-field-group__inputfield{margin-bottom:8px}.yoast-field-group__inputfield{height:40px}.yoast-field-group__textarea{min-height:200px}.yoast input+.description,.yoast-field-group .description+.yoast-field-group__inputfield,.yoast-field-group .description+input,.yoast-field-group__inputfield+.description{margin-bottom:24px;margin-top:8px}.yoast .yoast-field-group__inputfield:disabled,.yoast .yoast-field-group__inputfield:read-only,.yoast .yoast-field-group__inputfield[aria-disabled=true]{background:var(--yoast-color-inactive-grey-light)}.yoast .duration-inputs__wrapper{display:flex;flex-direction:row}.yoast .duration-inputs__input-wrapper{display:flex;flex-direction:column}.yoast .duration-inputs__input{margin:0 0 0 8px;width:4em}::placeholder{color:var(--yoast-color-placeholder);opacity:1}.yoast-insights-row:not(:last-of-type){border-bottom:1px solid #0000001a;margin-bottom:24px;padding-bottom:24px}.yoast-insights-row--columns{grid-gap:24px;display:grid;grid-template-columns:1fr 1fr}@media(min-width:782px){.yoast-modal-content .yoast-insights-row{border-bottom:1px solid #0000001a;margin-bottom:24px;padding-bottom:24px}}.yoast-insights-card__content{display:flex}.yoast-insights-card__score{flex-shrink:0;font-size:16px;margin-left:2em}.yoast-insights-card__amount{display:block;font-size:3.5em;line-height:1}.yoast-field-group__radiobutton{align-items:center;display:flex}.yoast-field-group__radiobutton--vertical:not(:last-of-type){margin-bottom:8px}.yoast-field-group__radiobutton label{cursor:pointer;margin-left:16px}.yoast-field-group__radiobutton input[type=radio]{-webkit-appearance:none;-moz-appearance:none;border:var(--yoast-border-default);border-radius:50%;box-shadow:inset 0 2px 4px #0000001a;cursor:pointer;height:18px;margin:0 0 0 8px;overflow:hidden;padding:2px;position:relative;transition:border-color .15s ease-out 0s;width:18px}.yoast-field-group__radiobutton input[type=radio]:checked:focus,.yoast-field-group__radiobutton input[type=radio]:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast-field-group__radiobutton input[type=radio]:checked{background-color:inherit;border-color:var(--yoast-color-primary)}.yoast-field-group__radiobutton input[type=radio]:checked:before{content:none}.yoast-field-group__radiobutton input[type=radio]:after{background-color:initial;border-radius:50%;content:"";display:block;height:10px;right:3px;position:absolute;top:3px;transition:background-color .15s ease-out 0s;width:10px}.yoast-field-group__radiobutton input[type=radio]:checked:after{background-color:var(--yoast-color-primary)}.yoast-field-group__select{align-items:center;cursor:pointer;display:flex}.yoast-select__indicator-separator{display:none}.yoast-select-container{background-color:#fff;border:var(--yoast-border-default);border-radius:0;box-shadow:inset 0 2px 4px #0000001a;display:block;min-height:2.85em;padding:0;position:relative;width:100%}.yoast-select-container .yoast-select__control--is-focused{box-shadow:var(--yoast-color-focus);outline:none}.yoast-select-container .yoast-select__indicator>svg{color:#212121}.yoast-select-container .yoast-select__menu{margin:0;z-index:2}.yoast-select-container .yoast-select__multi-value__label{align-items:center;box-sizing:border-box;color:inherit;display:flex;font-size:14px;padding:0}.yoast-select-container .yoast-select__multi-value{background-color:var(--yoast-color-primary);border:0;border-radius:12px;color:var(--yoast-color-white);display:flex;flex-direction:row-reverse;font-weight:500;line-height:1.5;margin-bottom:3px;margin-left:8px;margin-top:3px;padding:1px 10px 2px}.yoast-select-container .yoast-select__menu-list{padding:0}.yoast-select-container .yoast-select__multi-value__remove{-webkit-box-align:center;align-items:center;border-radius:2px;box-sizing:border-box;display:flex;margin-left:6px;padding:2px 0 0}.yoast-select-container .yoast-select__multi-value__remove:hover{background-color:inherit;color:var(--yoast-color-white);cursor:pointer}.yoast-select-container .yoast-select__control{background-color:initial;border:none;border-radius:0}.yoast-select-container .yoast-select__option{box-sizing:border-box;color:inherit;cursor:default;display:block;padding:8px 12px;-webkit-user-select:none;user-select:none;width:100%}.yoast-select-container .yoast-select__option--is-focused{background-color:var(--yoast-color-primary-lighter);color:var(--yoast-color-font-default)}.yoast-select-container .yoast-select__option.yoast-select__option--is-selected{background-color:var(--yoast-color-primary);color:var(--yoast-color-white)}.yoast-select-container input[type=text]:focus{box-shadow:none}.yoast-field-group select,.yoast-field-group__select select{-webkit-appearance:none;-moz-appearance:none;background-color:#fff;background-image:url('data:image/svg+xml;charset=utf-8,');background-position:left 15px center;background-repeat:no-repeat;background-size:13px auto;border:var(--yoast-border-default);border-radius:0;box-shadow:inset 0 2px 4px #0000001a;display:block;font-size:var(--yoast-font-size-default);max-width:300px;min-height:2.85em;padding:5px 8px;position:relative;width:100%}.yoast-field-group .yoast-select__value-container{padding:0 8px!important}.yoast-field-group select:focus,.yoast-field-group__select select:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast-field-group select,.yoast-field-group__select select{line-height:1.9;padding-left:40px}.yoast-field-group select.yoast-select--inline{display:inline-block}.yoast-field-group--inline{display:inline-block;margin-left:8px;max-width:300px;width:100%}.yoast-star-rating{display:inline-block;height:12px;width:65px}.yoast-star-rating span{background-repeat:repeat-x;background-size:13px 12px;height:100%;width:100%}.yoast-star-rating__placeholder{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAmCAQAAAAYCMGrAAAA+klEQVR4AcWV4cbtMBBFF0MIVUopoVSrhDDv/3gf/RFRpzdNOty1HiBO99mzeYWgCMZMKCPGrCgrxiSUhCkDeukxJKCXAUMiehkxw6FZhxEzmp0x4kCzByYISqlYdal0supS6WrVpdLEK0YSamJiJOPY0c/uOG4s6CcXfuKJaJcRzyNCQJsNiF1sRTR1hP11NNJ8RCrONOPRf+r7J+TZgQ5CNfMOYvW/2YxDqzqA/57+gVY9eiakrnyZEGXDsaE3p/4JScwPX3rtnZATDxnPWT7X16XAHaH8HWNrlxJD9TyGti5tCM84zpZe+RxNjeX9tZqLaGoMxN/P/wHP5Vw+8ZxnEQAAAABJRU5ErkJggg==);display:inline-block;overflow:hidden;position:relative}.yoast-star-rating__fill{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAmBAMAAABALxQTAAAAFVBMVEVMaXH4twP4twP4twP4twP4twP4twP7w8S/AAAAB3RSTlMAFv5uPpvQloUsTQAAAMFJREFUeAGE0TEOgzAMQFEXoDNiYC6/wFxxAsTADDkB5f6HqNRENXUi8TYiRfnY8lNXkjBOkuBWSeAhsYJOYiW9xO4MEqshkTbCSyIH7GLdgFasHHgmwkikZQD6OROZRG4Hxju8o/TNhbNhCqkOxaZDVKdxNnq/EjUS/A2o0PuXpyVeb9bjDWY9QSWXDQfBbtbjtWY9bM4sqfx+5yYt8wNcAFEzrGGkk5668KsFrKewPtQ3aFqh8WOnYZ+lIBQkgykAWk8rlAqcHfQAAAAASUVORK5CYII=);display:block}.yoast-table{border:var(--yoast-border-default);border-bottom:0;border-spacing:0;color:var(--yoast-color-default);font-size:var(--yoast-font-size-default);line-height:1.2;width:100%}.yoast-table tbody tr:nth-child(odd){background-color:#f9f9f9}.yoast-table th{color:var(--yoast-color-dark);font-weight:var(--yoast-font-weight-bold);text-align:right;white-space:nowrap}.yoast-table td,.yoast-table th{border-bottom:var(--yoast-border-default);padding:18px 12px}.yoast-table td:first-child,.yoast-table th:first-child{padding-right:16px}.yoast-table td:last-child,.yoast-table th:last-child{padding-left:16px}td.yoast-table__button,td.yoast-table__image{padding:10px 18px 9px}.yoast-table.yoast-table--nobreak td,td.yoast-table--nobreak,tr.yoast-table--nobreak td{white-space:nowrap}th.yoast-table--primary{width:100%}td.yoast-table--nopadding{padding:0 12px}.yoast-badge{border-radius:8px;display:inline-block;font-size:10px;font-weight:600;line-height:1.6;min-height:16px;padding:0 8px}.yoast-badge__in-label{margin-right:8px;vertical-align:text-top}.yoast-new-badge{background-color:#cce5ff;color:#004973}.yoast-premium-badge{background-color:#fff3cd;color:#674e00}.yoast-beta-badge{background-color:#cce5ff;color:#004973;margin:0 0 0 2px}.yoast-feature{margin-left:150px;max-width:600px}.yoast-toggle__item{border-bottom:1px solid var(--yoast-color-border);display:flex;justify-content:space-between;margin-bottom:16px;padding-bottom:16px}.yoast-toggle__item-disabled{position:relative}.yoast-toggle__item-disabled .yoast-button.yoast-button--buy{right:100%;margin-right:32px;position:absolute;white-space:nowrap}.yoast-toggle__item-disabled .yoast-toggle,.yoast-toggle__item-disabled .yoast-toggle__item-title{opacity:.5}.yoast-toggle__item-title{align-items:center;display:flex;font-weight:700}input[type=checkbox].yoast-toggle__checkbox{-webkit-appearance:none;-moz-appearance:none;background-color:initial;border:0;box-shadow:none;height:23px;margin-right:8px;overflow:hidden;position:absolute;width:34px;z-index:1}input[type=checkbox].yoast-toggle__checkbox:checked:before{content:none}.yoast-toggle__switch{background-color:var(--yoast-color-inactive-grey);border-radius:8px;display:inline-block;height:14px;margin-right:8px;margin-left:8px;position:relative;width:34px}.yoast-toggle__checkbox:focus~.yoast-toggle__switch:before{box-shadow:var(--yoast-color-focus)}.yoast-toggle__switch:before{background-color:var(--yoast-color-inactive-grey-light);border:.5px solid #0000001a;border-radius:50%;box-shadow:0 1px 2px 0 #0006;box-sizing:border-box;content:"";height:20px;right:0;position:absolute;top:-3px;width:20px}.yoast-toggle,.yoast-toggle--inverse{align-items:center;display:grid;grid-template:1fr/repeat(3,auto);position:relative}.yoast-toggle--inverse>*,.yoast-toggle>*{grid-row:1}.yoast-toggle--inactive,.yoast-toggle--inverse .yoast-toggle--active{grid-column:1}.yoast-toggle__checkbox,.yoast-toggle__switch{grid-column:2}.yoast-toggle--active,.yoast-toggle--inverse .yoast-toggle--inactive{grid-column:3}.yoast-toggle .yoast-toggle__checkbox:checked~.yoast-toggle__switch,.yoast-toggle--inverse .yoast-toggle__checkbox:not(:checked)~.yoast-toggle__switch{background-color:var(--yoast-color-active-light)}.yoast-toggle .yoast-toggle__checkbox:checked~.yoast-toggle__switch:before,.yoast-toggle--inverse .yoast-toggle__checkbox:not(:checked)~.yoast-toggle__switch:before{background-color:var(--yoast-color-active);right:auto;left:0}.yoast-toggle--inverse .yoast-toggle__checkbox:checked~.yoast-toggle__switch:before{right:0;left:auto}.yoast-toggle .yoast-toggle__checkbox~.yoast-toggle--inactive,.yoast-toggle--inverse .yoast-toggle__checkbox~.yoast-toggle--inactive{color:var(--yoast-color-default-darker)}.yoast-toggle .yoast-toggle__checkbox:checked~.yoast-toggle--inactive,.yoast-toggle .yoast-toggle__checkbox~.yoast-toggle--active,.yoast-toggle--inverse .yoast-toggle__checkbox:checked~.yoast-toggle--inactive,.yoast-toggle--inverse .yoast-toggle__checkbox~.yoast-toggle--active{color:var(--yoast-color-inactive-text)}.yoast-toggle .yoast-toggle__checkbox:checked~.yoast-toggle--active,.yoast-toggle--inverse .yoast-toggle__checkbox:checked~.yoast-toggle--active{color:var(--yoast-color-default-darker)}@media(max-width:400px){.yoast-feature{margin-left:0}.yoast-toggle__item-disabled{flex-wrap:wrap}.yoast-toggle__item-disabled .yoast-button.yoast-button--buy{margin-right:0;margin-top:8px;position:static}} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/monorepo-2330.css b/wp-content/plugins/wordpress-seo/css/dist/monorepo-2330.css new file mode 100644 index 00000000..d03eebb3 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/monorepo-2330.css @@ -0,0 +1 @@ +:root{--yoast-border-default:1px solid #0003;--yoast-color-default:#404040;--yoast-color-default-darker:#303030;--yoast-color-primary:#a4286a;--yoast-color-secondary:#f7f7f7;--yoast-color-white:#fff;--yoast-color-green:#6ea029;--yoast-color-primary-darker:#7b1e50;--yoast-color-primary-lighter:#f5d6e6;--yoast-color-secondary-darker:#d9d9d9;--yoast-color-button-upsell:#fec228;--yoast-color-button-upsell-hover:#f2ae01;--yoast-color-dark:#303030;--yoast-color-sale:#fec228;--yoast-color-sale-darker:#feb601;--yoast-color-border:#0003;--yoast-color-label:#303030;--yoast-color-label-help:#707070;--yoast-color-active:#6ea029;--yoast-color-inactive:#dc3232;--yoast-color-inactive-text:#707070;--yoast-color-inactive-grey:#9e9e9e;--yoast-color-inactive-grey-light:#f1f1f1;--yoast-color-active-light:#b6cf94;--yoast-transition-default:all 150ms ease-out;--yoast-color-link:#006dac;--yoast-color-border--default:#0003;--yoast-color-focus:0 0 0 2px #007fff,0 0 0 5px #bfdfff;--yoast-svg-icon-chevron-down:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-chevron-up:url('data:image/svg+xml;charset=utf-8,');--yoast-checkmark--white:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23FFF' viewBox='0 0 512 512'%3E%3Cpath d='m173.898 439.404-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001'/%3E%3C/svg%3E");--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23m-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23m640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' aria-hidden='true' viewBox='0 0 1792 1792'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' aria-hidden='true' viewBox='0 0 192 512'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960M944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34m848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136m0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136m1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5M384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136m1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5m0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5'/%3E%3C/svg%3E");--yoast-svg-icon-key:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-edit:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url('data:image/svg+xml;charset=utf-8,');--yoast-checkmark--green:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%236EA029' viewBox='0 0 512 512'%3E%3Cpath d='m173.898 439.404-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001'/%3E%3C/svg%3E");--yoast-exclamation-mark:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23DC3232' viewBox='0 0 512 512'%3E%3Cpath d='M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248m-248 50c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46m-43.673-165.346 7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654'/%3E%3C/svg%3E");--yoast-svg-icon-schema:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M149.333 56v80c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V56c0-13.255 10.745-24 24-24h101.333c13.255 0 24 10.745 24 24m181.334 240v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24m32-240v80c0 13.255 10.745 24 24 24H488c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24m-32 80V56c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24m-205.334 56H24c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24M0 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24m386.667-56H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24m0 160H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24M181.333 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24'/%3E%3C/svg%3E");--yoast-svg-icon-schema-active:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' aria-hidden='true'%3E%3Cpath fill='D4444' d='M149.333 56v80c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V56c0-13.255 10.745-24 24-24h101.333c13.255 0 24 10.745 24 24m181.334 240v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24m32-240v80c0 13.255 10.745 24 24 24H488c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24m-32 80V56c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24m-205.334 56H24c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24M0 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24m386.667-56H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24m0 160H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24M181.333 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24'/%3E%3C/svg%3E");--yoast-svg-icon-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='%23707070' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m4 16 4.586-4.586a2 2 0 0 1 2.828 0L16 16m-2-2 1.586-1.586a2 2 0 0 1 2.828 0L20 14m-6-6h.01M6 20h12a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2'/%3E%3C/svg%3E");--yoast-font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;--yoast-font-size-default:14px;--yoast-font-weight-default:400;--yoast-font-weight-bold:600;--yoast-color-font-default:#404040;--yoast-shadow-default:0px 3px 6px #00000026}.yoast-h1,.yoast-h2,.yoast-h3{color:var(--yoast-color-primary);font-weight:400;line-height:1.2;margin:0}.yoast-h1 a,.yoast-h2 a,.yoast-h3 a{color:var(--yoast-color-primary);text-decoration:none}.yoast-h1{font-size:24px}.yoast-h2{font-size:20px}.yoast-h3{font-size:16px}.yoast-paragraph{font-size:var(--yoast-font-size-default);margin-top:0}.screen-reader-text{clip:rect(1px,1px,1px,1px);word-wrap:normal!important;border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);margin:-1px;padding:0}.screen-reader-text,.visually-hidden{height:1px;overflow:hidden;position:absolute;width:1px}.visually-hidden{clip:rect(1px,1px,1px,1px);word-wrap:normal;white-space:nowrap}@media (max-width:782px){.yoast-show-on-mobile{display:initial!important}}@media (min-width:782px){.yoast-hide-on-desktop{display:none}}.yoast-field-group__title-separator{display:flex;flex-wrap:wrap}.yoast-field-group__title-separator label{align-items:center;border:var(--yoast-border-default);box-sizing:border-box;cursor:pointer;display:flex;flex-direction:column;height:42px;justify-content:center;margin:0 6px 6px 0;width:42px}.yoast-field-group__title-separator input[type=radio]:checked+label{border:3px solid var(--yoast-color-primary)}.yoast .yoast-button{align-items:center;border:1px solid #0003;border-radius:4px;box-shadow:inset 0 -2px 0 #0000001a;cursor:pointer;display:inline-flex;font-size:14px;justify-content:center;line-height:1.2;padding:10px 12px 12px;position:relative;text-decoration:none;transition:background-color .15s ease-out 0s}.yoast .yoast-button:focus,.yoast-close:focus,.yoast-hide:focus,.yoast-remove:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast .yoast-button::-moz-focus-inner,.yoast-close::-moz-focus-inner,.yoast-hide::-moz-focus-inner,.yoast-remove::-moz-focus-inner{border:0}.yoast .yoast-button:not(:disabled):active{box-shadow:none;top:2px}.yoast .yoast-button:disabled{cursor:default;opacity:.5}.yoast .yoast-button--primary{background-color:var(--yoast-color-primary)}.yoast .yoast-button--primary,.yoast .yoast-button--primary:visited{border:1px solid #0003;color:var(--yoast-color-white)}.yoast .yoast-button--primary:active,.yoast .yoast-button--primary:not(:disabled):hover{background-color:var(--yoast-color-primary-darker);border:1px solid #0003;color:var(--yoast-color-white)}.yoast .yoast-button--primary:focus{background-color:var(--yoast-color-primary);color:var(--yoast-color-white)}.yoast .yoast-button--secondary{background-color:var(--yoast-color-secondary);box-shadow:inset 0 -2px 0 #0000001a;color:var(--yoast-color-dark)}.yoast .yoast-button--secondary:visited{color:var(--yoast-color-dark)}.yoast .yoast-button--secondary:active,.yoast .yoast-button--secondary:not(:disabled):hover{background-color:var(--yoast-color-secondary-darker);border:1px solid #0003;color:var(--yoast-color-dark)}.yoast .yoast-button--buy{background-color:var(--yoast-color-sale)}.yoast .yoast-button--buy,.yoast .yoast-button--buy:visited{color:var(--yoast-color-dark)}.yoast .yoast-button--buy:active,.yoast .yoast-button--buy:not(:disabled):hover{background-color:var(--yoast-color-sale-darker);color:var(--yoast-color-dark)}.yoast .yoast-button--buy__caret{height:16px;margin:0 -2px 0 6px;-webkit-mask-image:var(--yoast-svg-icon-caret-right);mask-image:var(--yoast-svg-icon-caret-right);width:6px}.yoast .yoast-button--buy__caret,.yoast .yoast-button--edit{background-color:currentColor;display:inline-block;flex-shrink:0}.yoast .yoast-button--edit{height:18px;margin-right:8px;-webkit-mask-image:var(--yoast-svg-icon-edit);mask-image:var(--yoast-svg-icon-edit);width:20.25px}html[dir=rtl] .yoast .yoast-button--edit{margin-left:8px;margin-right:0}html[dir=rtl] .yoast .yoast-button--buy{flex-direction:row-reverse}.yoast .yoast-button--small{font-size:13px;padding:5px 8px 8px}.yoast .yoast-button--small .yoast-button--buy__caret{height:10px;width:4px}.yoast-hide,.yoast-remove{background-color:initial;border:none;color:#dc3232;cursor:pointer;font-size:14px;padding:0;text-decoration:underline}.yoast-hide{color:var(--yoast-color-link)}.yoast-field-group__upload .yoast-button{margin-right:24px}.yoast-close{align-items:center;background:none;border:none;box-shadow:none;cursor:pointer;display:flex;height:44px;justify-content:center;padding:0;width:44px}.yoast-close svg{fill:var(--yoast-color-default);width:14px}@media screen and (max-width:782px){.yoast-close svg{width:10px}}.yoast-field-group__checkbox{align-items:center;display:flex}.yoast-field-group__checkbox:not(.yoast-field-group__checkbox--horizontal)+.yoast-field-group__checkbox{margin-top:4px}.yoast-field-group__checkbox label{cursor:pointer}.yoast-field-group__checkbox input[type=checkbox]{-webkit-appearance:none;-moz-appearance:none;border:var(--yoast-border-default);border-radius:2px;box-shadow:inset 0 2px 4px #0000001a;cursor:pointer;height:18px;margin:2px 8px 0 0;overflow:hidden;padding:2px;position:relative;transition:background-color .15s ease-out 0s;width:18px}.yoast-field-group__checkbox input[type=checkbox]:checked:focus,.yoast-field-group__checkbox input[type=checkbox]:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast label+input[type=checkbox]{margin-left:16px}.yoast-field-group__checkbox input[type=checkbox]:checked{background:var(--yoast-checkmark--white) var(--yoast-color-primary) no-repeat center /13px;border:1px solid var(--yoast-color-primary);box-shadow:none}.yoast-field-group__checkbox input[type=checkbox]:checked:before{content:""}.yoast-field-group{border:none;margin:0 0 24px;padding:0;position:relative}.yoast-field-group__title{align-items:center;color:var(--yoast-color-label);display:flex;font-size:var(--yoast-font-size-default);font-weight:var(--yoast-font-weight-bold);line-height:1.5;margin:0 0 8px;padding:0}.yoast-field-group__title.yoast-field-group__title--light{font-weight:var(--yoast-font-weight-default)}.yoast-field-group .field-group-description{margin:0 0 1em}.yoast-field-group__inline{align-items:center;display:flex}.yoast-field-group__inline .yoast-field-group__inputfield{margin-right:8px}.yoast-field-group__inline .yoast-button{flex-shrink:0}.yoast-field-group .components-form-token-field__label{display:none}@media screen and (max-width:782px){.yoast-field-group__inline{display:block}.yoast-field-group__inline .yoast-field-group__inputfield{margin-bottom:8px;margin-right:0}}.yoast-help{margin-left:4px}.yoast-help__icon svg{fill:var(--yoast-color-inactive-text);height:12px;transition:var(--yoast-transition-default);width:12px}.yoast-help:focus svg,.yoast-help:hover svg{fill:var(--yoast-color-link)}.yoast-data-model{list-style:none;padding:0}.yoast-data-model li{font-weight:var(--yoast-font-weight-bold);line-height:1.4;padding:0 8px;position:relative;z-index:2}.yoast-data-model span{float:right;font-weight:var(--yoast-font-weight-default)}.yoast-data-model li+li{margin-top:9px}.yoast-data-model li:after{background:#f5d6e6;content:"";height:20px;left:0;position:absolute;width:var(--yoast-width);z-index:-1}.yoast-image-select__preview{align-items:center;background-color:initial;border:1px solid #0003;display:flex;justify-content:center;max-height:200px;max-width:100%;min-height:165px;overflow:hidden;padding:0;width:300px}.yoast-image-select__preview--no-preview{background:var(--yoast-color-inactive-grey-light) var(--yoast-svg-icon-image) no-repeat center center /64px 64px}.yoast-image-select__preview.yoast-image-select__preview-has-warnings{margin-bottom:16px}.yoast-image-select__preview .yoast-image-select__preview--image{height:100%;max-width:100%;object-fit:contain}.yoast-image-select .yoast-field-group__inputfield{margin-bottom:1em}.yoast-image-select .yoast-button{margin-right:1.5em}.yoast-image-select{margin-bottom:1.7em;margin-top:1.7em}.yoast-image-select .yoast-image-select-buttons button{margin-top:1em}#organization-image-select .yoast-image-select{margin-top:0}:root{--yoast-color-placeholder:#707070}.yoast .yoast-field-group__inputfield,.yoast .yoast-field-group__textarea{background:var(--yoast-color-white);border:var(--yoast-border-default);border-radius:0;box-shadow:inset 0 2px 4px #0000001a;box-sizing:border-box;font-size:var(--yoast-font-size-default);padding:8px;width:100%}.yoast .yoast-field-group__inputfield:focus,.yoast .yoast-field-group__textarea:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast-field-group__upload .yoast-field-group__inputfield{margin-bottom:8px}.yoast-field-group__inputfield{height:40px}.yoast-field-group__textarea{min-height:200px}.yoast input+.description,.yoast-field-group .description+.yoast-field-group__inputfield,.yoast-field-group .description+input,.yoast-field-group__inputfield+.description{margin-bottom:24px;margin-top:8px}.yoast .yoast-field-group__inputfield:disabled,.yoast .yoast-field-group__inputfield:read-only,.yoast .yoast-field-group__inputfield[aria-disabled=true]{background:var(--yoast-color-inactive-grey-light)}.yoast .duration-inputs__wrapper{display:flex;flex-direction:row}.yoast .duration-inputs__input-wrapper{display:flex;flex-direction:column}.yoast .duration-inputs__input{margin:0 8px 0 0;width:4em}::placeholder{color:var(--yoast-color-placeholder);opacity:1}.yoast-insights-row:not(:last-of-type){border-bottom:1px solid #0000001a;margin-bottom:24px;padding-bottom:24px}.yoast-insights-row--columns{grid-gap:24px;display:grid;grid-template-columns:1fr 1fr}@media(min-width:782px){.yoast-modal-content .yoast-insights-row{border-bottom:1px solid #0000001a;margin-bottom:24px;padding-bottom:24px}}.yoast-insights-card__content{display:flex}.yoast-insights-card__score{flex-shrink:0;font-size:16px;margin-right:2em}.yoast-insights-card__amount{display:block;font-size:3.5em;line-height:1}.yoast-field-group__radiobutton{align-items:center;display:flex}.yoast-field-group__radiobutton--vertical:not(:last-of-type){margin-bottom:8px}.yoast-field-group__radiobutton label{cursor:pointer;margin-right:16px}.yoast-field-group__radiobutton input[type=radio]{-webkit-appearance:none;-moz-appearance:none;border:var(--yoast-border-default);border-radius:50%;box-shadow:inset 0 2px 4px #0000001a;cursor:pointer;height:18px;margin:0 8px 0 0;overflow:hidden;padding:2px;position:relative;transition:border-color .15s ease-out 0s;width:18px}.yoast-field-group__radiobutton input[type=radio]:checked:focus,.yoast-field-group__radiobutton input[type=radio]:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast-field-group__radiobutton input[type=radio]:checked{background-color:inherit;border-color:var(--yoast-color-primary)}.yoast-field-group__radiobutton input[type=radio]:checked:before{content:none}.yoast-field-group__radiobutton input[type=radio]:after{background-color:initial;border-radius:50%;content:"";display:block;height:10px;left:3px;position:absolute;top:3px;transition:background-color .15s ease-out 0s;width:10px}.yoast-field-group__radiobutton input[type=radio]:checked:after{background-color:var(--yoast-color-primary)}.yoast-field-group__select{align-items:center;cursor:pointer;display:flex}.yoast-select__indicator-separator{display:none}.yoast-select-container{background-color:#fff;border:var(--yoast-border-default);border-radius:0;box-shadow:inset 0 2px 4px #0000001a;display:block;min-height:2.85em;padding:0;position:relative;width:100%}.yoast-select-container .yoast-select__control--is-focused{box-shadow:var(--yoast-color-focus);outline:none}.yoast-select-container .yoast-select__indicator>svg{color:#212121}.yoast-select-container .yoast-select__menu{margin:0;z-index:2}.yoast-select-container .yoast-select__multi-value__label{align-items:center;box-sizing:border-box;color:inherit;display:flex;font-size:14px;padding:0}.yoast-select-container .yoast-select__multi-value{background-color:var(--yoast-color-primary);border:0;border-radius:12px;color:var(--yoast-color-white);display:flex;flex-direction:row-reverse;font-weight:500;line-height:1.5;margin-bottom:3px;margin-right:8px;margin-top:3px;padding:1px 10px 2px}.yoast-select-container .yoast-select__menu-list{padding:0}.yoast-select-container .yoast-select__multi-value__remove{-webkit-box-align:center;align-items:center;border-radius:2px;box-sizing:border-box;display:flex;margin-right:6px;padding:2px 0 0}.yoast-select-container .yoast-select__multi-value__remove:hover{background-color:inherit;color:var(--yoast-color-white);cursor:pointer}.yoast-select-container .yoast-select__control{background-color:initial;border:none;border-radius:0}.yoast-select-container .yoast-select__option{box-sizing:border-box;color:inherit;cursor:default;display:block;padding:8px 12px;-webkit-user-select:none;user-select:none;width:100%}.yoast-select-container .yoast-select__option--is-focused{background-color:var(--yoast-color-primary-lighter);color:var(--yoast-color-font-default)}.yoast-select-container .yoast-select__option.yoast-select__option--is-selected{background-color:var(--yoast-color-primary);color:var(--yoast-color-white)}.yoast-select-container input[type=text]:focus{box-shadow:none}.yoast-field-group select,.yoast-field-group__select select{-webkit-appearance:none;-moz-appearance:none;background-color:#fff;background-image:url('data:image/svg+xml;charset=utf-8,');background-position:right 15px center;background-repeat:no-repeat;background-size:13px auto;border:var(--yoast-border-default);border-radius:0;box-shadow:inset 0 2px 4px #0000001a;display:block;font-size:var(--yoast-font-size-default);max-width:300px;min-height:2.85em;padding:5px 8px;position:relative;width:100%}.yoast-field-group .yoast-select__value-container{padding:0 8px!important}.yoast-field-group select:focus,.yoast-field-group__select select:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast-field-group select,.yoast-field-group__select select{line-height:1.9;padding-right:40px}.yoast-field-group select.yoast-select--inline{display:inline-block}.yoast-field-group--inline{display:inline-block;margin-right:8px;max-width:300px;width:100%}.yoast-star-rating{display:inline-block;height:12px;width:65px}.yoast-star-rating span{background-repeat:repeat-x;background-size:13px 12px;height:100%;width:100%}.yoast-star-rating__placeholder{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAmCAQAAAAYCMGrAAAA+klEQVR4AcWV4cbtMBBFF0MIVUopoVSrhDDv/3gf/RFRpzdNOty1HiBO99mzeYWgCMZMKCPGrCgrxiSUhCkDeukxJKCXAUMiehkxw6FZhxEzmp0x4kCzByYISqlYdal0supS6WrVpdLEK0YSamJiJOPY0c/uOG4s6CcXfuKJaJcRzyNCQJsNiF1sRTR1hP11NNJ8RCrONOPRf+r7J+TZgQ5CNfMOYvW/2YxDqzqA/57+gVY9eiakrnyZEGXDsaE3p/4JScwPX3rtnZATDxnPWT7X16XAHaH8HWNrlxJD9TyGti5tCM84zpZe+RxNjeX9tZqLaGoMxN/P/wHP5Vw+8ZxnEQAAAABJRU5ErkJggg==);display:inline-block;overflow:hidden;position:relative}.yoast-star-rating__fill{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAmBAMAAABALxQTAAAAFVBMVEVMaXH4twP4twP4twP4twP4twP4twP7w8S/AAAAB3RSTlMAFv5uPpvQloUsTQAAAMFJREFUeAGE0TEOgzAMQFEXoDNiYC6/wFxxAsTADDkB5f6HqNRENXUi8TYiRfnY8lNXkjBOkuBWSeAhsYJOYiW9xO4MEqshkTbCSyIH7GLdgFasHHgmwkikZQD6OROZRG4Hxju8o/TNhbNhCqkOxaZDVKdxNnq/EjUS/A2o0PuXpyVeb9bjDWY9QSWXDQfBbtbjtWY9bM4sqfx+5yYt8wNcAFEzrGGkk5668KsFrKewPtQ3aFqh8WOnYZ+lIBQkgykAWk8rlAqcHfQAAAAASUVORK5CYII=);display:block}.yoast-table{border:var(--yoast-border-default);border-bottom:0;border-spacing:0;color:var(--yoast-color-default);font-size:var(--yoast-font-size-default);line-height:1.2;width:100%}.yoast-table tbody tr:nth-child(odd){background-color:#f9f9f9}.yoast-table th{color:var(--yoast-color-dark);font-weight:var(--yoast-font-weight-bold);text-align:left;white-space:nowrap}.yoast-table td,.yoast-table th{border-bottom:var(--yoast-border-default);padding:18px 12px}.yoast-table td:first-child,.yoast-table th:first-child{padding-left:16px}.yoast-table td:last-child,.yoast-table th:last-child{padding-right:16px}td.yoast-table__button,td.yoast-table__image{padding:10px 18px 9px}.yoast-table.yoast-table--nobreak td,td.yoast-table--nobreak,tr.yoast-table--nobreak td{white-space:nowrap}th.yoast-table--primary{width:100%}td.yoast-table--nopadding{padding:0 12px}.yoast-badge{border-radius:8px;display:inline-block;font-size:10px;font-weight:600;line-height:1.6;min-height:16px;padding:0 8px}.yoast-badge__in-label{margin-left:8px;vertical-align:text-top}.yoast-new-badge{background-color:#cce5ff;color:#004973}.yoast-premium-badge{background-color:#fff3cd;color:#674e00}.yoast-beta-badge{background-color:#cce5ff;color:#004973;margin:0 2px 0 0}.yoast-feature{margin-right:150px;max-width:600px}.yoast-toggle__item{border-bottom:1px solid var(--yoast-color-border);display:flex;justify-content:space-between;margin-bottom:16px;padding-bottom:16px}.yoast-toggle__item-disabled{position:relative}.yoast-toggle__item-disabled .yoast-button.yoast-button--buy{left:100%;margin-left:32px;position:absolute;white-space:nowrap}.yoast-toggle__item-disabled .yoast-toggle,.yoast-toggle__item-disabled .yoast-toggle__item-title{opacity:.5}.yoast-toggle__item-title{align-items:center;display:flex;font-weight:700}input[type=checkbox].yoast-toggle__checkbox{-webkit-appearance:none;-moz-appearance:none;background-color:initial;border:0;box-shadow:none;height:23px;margin-left:8px;overflow:hidden;position:absolute;width:34px;z-index:1}input[type=checkbox].yoast-toggle__checkbox:checked:before{content:none}.yoast-toggle__switch{background-color:var(--yoast-color-inactive-grey);border-radius:8px;display:inline-block;height:14px;margin-left:8px;margin-right:8px;position:relative;width:34px}.yoast-toggle__checkbox:focus~.yoast-toggle__switch:before{box-shadow:var(--yoast-color-focus)}.yoast-toggle__switch:before{background-color:var(--yoast-color-inactive-grey-light);border:.5px solid #0000001a;border-radius:50%;box-shadow:0 1px 2px 0 #0006;box-sizing:border-box;content:"";height:20px;left:0;position:absolute;top:-3px;width:20px}.yoast-toggle,.yoast-toggle--inverse{align-items:center;display:grid;grid-template:1fr/repeat(3,auto);position:relative}.yoast-toggle--inverse>*,.yoast-toggle>*{grid-row:1}.yoast-toggle--inactive,.yoast-toggle--inverse .yoast-toggle--active{grid-column:1}.yoast-toggle__checkbox,.yoast-toggle__switch{grid-column:2}.yoast-toggle--active,.yoast-toggle--inverse .yoast-toggle--inactive{grid-column:3}.yoast-toggle .yoast-toggle__checkbox:checked~.yoast-toggle__switch,.yoast-toggle--inverse .yoast-toggle__checkbox:not(:checked)~.yoast-toggle__switch{background-color:var(--yoast-color-active-light)}.yoast-toggle .yoast-toggle__checkbox:checked~.yoast-toggle__switch:before,.yoast-toggle--inverse .yoast-toggle__checkbox:not(:checked)~.yoast-toggle__switch:before{background-color:var(--yoast-color-active);left:auto;right:0}.yoast-toggle--inverse .yoast-toggle__checkbox:checked~.yoast-toggle__switch:before{left:0;right:auto}.yoast-toggle .yoast-toggle__checkbox~.yoast-toggle--inactive,.yoast-toggle--inverse .yoast-toggle__checkbox~.yoast-toggle--inactive{color:var(--yoast-color-default-darker)}.yoast-toggle .yoast-toggle__checkbox:checked~.yoast-toggle--inactive,.yoast-toggle .yoast-toggle__checkbox~.yoast-toggle--active,.yoast-toggle--inverse .yoast-toggle__checkbox:checked~.yoast-toggle--inactive,.yoast-toggle--inverse .yoast-toggle__checkbox~.yoast-toggle--active{color:var(--yoast-color-inactive-text)}.yoast-toggle .yoast-toggle__checkbox:checked~.yoast-toggle--active,.yoast-toggle--inverse .yoast-toggle__checkbox:checked~.yoast-toggle--active{color:var(--yoast-color-default-darker)}@media(max-width:400px){.yoast-feature{margin-right:0}.yoast-toggle__item-disabled{flex-wrap:wrap}.yoast-toggle__item-disabled .yoast-button.yoast-button--buy{margin-left:0;margin-top:8px;position:static}} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/new-settings-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/new-settings-2330-rtl.css new file mode 100644 index 00000000..013822f3 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/new-settings-2330-rtl.css @@ -0,0 +1 @@ +body.seo_page_wpseo_page_settings{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity));z-index:-1}body.seo_page_wpseo_page_settings #wpcontent{padding-right:0!important}body.seo_page_wpseo_page_settings #wpfooter{padding-left:1rem}@media (min-width:768px){body.seo_page_wpseo_page_settings #wpfooter{padding-right:17rem;padding-left:2rem}}@media screen and (max-width:782px){body.seo_page_wpseo_page_settings .wp-responsive-open #wpbody{left:-190px}}body.seo_page_wpseo_page_settings #modal-search .yst-modal__close{margin-top:-.25rem}@media (min-width:783px) and (max-width:962px){body.seo_page_wpseo_page_settings.sticky-menu .yst-root .yst-notifications--bottom-left{right:calc(160px + 2rem)}}@media (min-width:783px) and (max-width:963px){body.seo_page_wpseo_page_settings.sticky-menu.auto-fold .yst-root .yst-notifications--bottom-left,body.seo_page_wpseo_page_settings.sticky-menu.folded .yst-root .yst-notifications--bottom-left{right:calc(32px + 2rem)}}@media (min-width:962px){body.seo_page_wpseo_page_settings.sticky-menu.folded .yst-root .yst-notifications--bottom-left{right:calc(32px + 2rem)}}@media (max-width:783px){body.seo_page_wpseo_page_settings:not(.sticky-menu) .wp-responsive-open .yst-root .yst-notifications--bottom-left{right:calc(190px + 2rem)}}body.seo_page_wpseo_page_settings .yst-root .yst-notifications{max-height:calc(100% - 4rem - 32px)}@media (max-width:782px){body.seo_page_wpseo_page_settings .yst-root .yst-notifications{max-height:calc(100% - 4rem - 48px)}}body.seo_page_wpseo_page_settings .yst-root .yst-notifications--bottom-left{z-index:9991}@media (min-width:783px){body.seo_page_wpseo_page_settings .yst-root .yst-notifications--bottom-left{right:calc(160px + 2rem)}}@media (min-width:601px) and (max-width:768px){body.seo_page_wpseo_page_settings .yst-root .yst-mobile-navigation__top{top:46px}}@media (min-width:783px){body.seo_page_wpseo_page_settings .yst-root .yst-mobile-navigation__top{display:none}}body.seo_page_wpseo_page_settings .yst-root .yst-mobile-navigation__dialog{z-index:99999}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar{position:relative}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar .emoji-select-popover{right:0;left:auto;z-index:20}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .emoji-select-button,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__editor,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__label{opacity:.5}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .emoji-select-button,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__button-insert,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__editor,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__label{cursor:not-allowed}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .emoji-select-button{pointer-events:none}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__label{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));display:flex;font-size:.8125rem;font-weight:500;margin-bottom:.5rem}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__buttons{display:inline-flex;gap:.375rem}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);align-items:center;border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);cursor:pointer;display:inline-flex;font-size:.8125rem;font-weight:500;line-height:1rem;margin-bottom:.5rem;padding:.5rem .75rem;-webkit-text-decoration-line:none;text-decoration-line:none}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert:disabled{cursor:not-allowed;opacity:.5;pointer-events:none}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;line-height:1.5rem;padding:.5rem .75rem;width:100%}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor::placeholder{--tw-placeholder-opacity:1;color:rgb(100 116 139/var(--tw-placeholder-opacity))}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor:focus-within{--tw-border-opacity:0;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden]{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);padding-bottom:.25rem;padding-top:.25rem;width:14rem;z-index:20}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden]:focus{outline:2px solid #0000;outline-offset:2px}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden] div>div{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));cursor:pointer;display:block;font-size:.8125rem;padding:.5rem 1rem;-webkit-text-decoration-line:none;text-decoration-line:none}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden] div>div:hover,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden] div>div[aria-selected]{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(15 23 42/var(--tw-text-opacity))}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--description .yst-replacevar__editor{min-height:5rem}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__mention{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:9999px;color:rgb(15 23 42/var(--tw-text-opacity));display:inline-block;font-size:.75rem;font-weight:500;line-height:1.25;margin-right:.125rem;margin-left:.125rem;padding:.125rem .5rem}body.seo_page_wpseo_page_settings.rtl .yst-root .yst-replacevar .emoji-select-popover{right:0;left:auto} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/new-settings-2330.css b/wp-content/plugins/wordpress-seo/css/dist/new-settings-2330.css new file mode 100644 index 00000000..36009a8b --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/new-settings-2330.css @@ -0,0 +1 @@ +body.seo_page_wpseo_page_settings{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity));z-index:-1}body.seo_page_wpseo_page_settings #wpcontent{padding-left:0!important}body.seo_page_wpseo_page_settings #wpfooter{padding-right:1rem}@media (min-width:768px){body.seo_page_wpseo_page_settings #wpfooter{padding-left:17rem;padding-right:2rem}}@media screen and (max-width:782px){body.seo_page_wpseo_page_settings .wp-responsive-open #wpbody{right:-190px}}body.seo_page_wpseo_page_settings #modal-search .yst-modal__close{margin-top:-.25rem}@media (min-width:783px) and (max-width:962px){body.seo_page_wpseo_page_settings.sticky-menu .yst-root .yst-notifications--bottom-left{left:calc(160px + 2rem)}}@media (min-width:783px) and (max-width:963px){body.seo_page_wpseo_page_settings.sticky-menu.auto-fold .yst-root .yst-notifications--bottom-left,body.seo_page_wpseo_page_settings.sticky-menu.folded .yst-root .yst-notifications--bottom-left{left:calc(32px + 2rem)}}@media (min-width:962px){body.seo_page_wpseo_page_settings.sticky-menu.folded .yst-root .yst-notifications--bottom-left{left:calc(32px + 2rem)}}@media (max-width:783px){body.seo_page_wpseo_page_settings:not(.sticky-menu) .wp-responsive-open .yst-root .yst-notifications--bottom-left{left:calc(190px + 2rem)}}body.seo_page_wpseo_page_settings .yst-root .yst-notifications{max-height:calc(100% - 4rem - 32px)}@media (max-width:782px){body.seo_page_wpseo_page_settings .yst-root .yst-notifications{max-height:calc(100% - 4rem - 48px)}}body.seo_page_wpseo_page_settings .yst-root .yst-notifications--bottom-left{z-index:9991}@media (min-width:783px){body.seo_page_wpseo_page_settings .yst-root .yst-notifications--bottom-left{left:calc(160px + 2rem)}}@media (min-width:601px) and (max-width:768px){body.seo_page_wpseo_page_settings .yst-root .yst-mobile-navigation__top{top:46px}}@media (min-width:783px){body.seo_page_wpseo_page_settings .yst-root .yst-mobile-navigation__top{display:none}}body.seo_page_wpseo_page_settings .yst-root .yst-mobile-navigation__dialog{z-index:99999}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar{position:relative}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar .emoji-select-popover{left:0;right:auto;z-index:20}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .emoji-select-button,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__editor,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__label{opacity:.5}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .emoji-select-button,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__button-insert,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__editor,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__label{cursor:not-allowed}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .emoji-select-button{pointer-events:none}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__label{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));display:flex;font-size:.8125rem;font-weight:500;margin-bottom:.5rem}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__buttons{display:inline-flex;gap:.375rem}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);align-items:center;border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);cursor:pointer;display:inline-flex;font-size:.8125rem;font-weight:500;line-height:1rem;margin-bottom:.5rem;padding:.5rem .75rem;-webkit-text-decoration-line:none;text-decoration-line:none}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert:disabled{cursor:not-allowed;opacity:.5;pointer-events:none}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;line-height:1.5rem;padding:.5rem .75rem;width:100%}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor::placeholder{--tw-placeholder-opacity:1;color:rgb(100 116 139/var(--tw-placeholder-opacity))}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor:focus-within{--tw-border-opacity:0;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden]{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);padding-bottom:.25rem;padding-top:.25rem;width:14rem;z-index:20}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden]:focus{outline:2px solid #0000;outline-offset:2px}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden] div>div{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));cursor:pointer;display:block;font-size:.8125rem;padding:.5rem 1rem;-webkit-text-decoration-line:none;text-decoration-line:none}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden] div>div:hover,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden] div>div[aria-selected]{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(15 23 42/var(--tw-text-opacity))}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--description .yst-replacevar__editor{min-height:5rem}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__mention{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:9999px;color:rgb(15 23 42/var(--tw-text-opacity));display:inline-block;font-size:.75rem;font-weight:500;line-height:1.25;margin-left:.125rem;margin-right:.125rem;padding:.125rem .5rem}body.seo_page_wpseo_page_settings.rtl .yst-root .yst-replacevar .emoji-select-popover{left:0;right:auto} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/notifications-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/notifications-2330-rtl.css new file mode 100644 index 00000000..64fdf1dc --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/notifications-2330-rtl.css @@ -0,0 +1 @@ +:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.screen-reader-text{clip:rect(1px,1px,1px,1px);word-wrap:normal!important;border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute!important;width:1px}.yoast-notification{background:#fff;border-right:4px solid #fff;box-shadow:0 1px 2px #0003;padding:0 12px}.yoast-container{background-color:#fdfdfd;border:1px solid #e5e5e5;box-shadow:0 1px 1px #0000000a;margin:20px 0 1px;max-width:1280px;padding:20px 20px 0;position:relative}.yoast-notifications>h2:first-child{font-size:23px;font-weight:400;line-height:29px;margin:0;padding:9px 0 4px}.yoast-notifications .yoast-container h3{background-color:#fdfdfd;border-bottom:1px solid #ccc;font-size:1.4em;margin:-20px -20px 0;padding:1em}.yoast-container .container{max-width:980px}.yoast-container .yoast-notification-holder{display:flex;position:relative}.dismiss .dashicons,.restore .dashicons{font-size:20px;height:20px;width:20px}.yoast-bottom-spacing{margin-bottom:20px}.yoast-notifications .button.dismiss,.yoast-notifications .button.restore{background:#0000;border:none;border-radius:0;box-shadow:none;cursor:pointer;height:100%;line-height:inherit;outline:none;padding:0;position:absolute;left:0;width:52px}.yoast-notifications .button.dismiss:focus,.yoast-notifications .button.dismiss:hover,.yoast-notifications .button.restore:focus,.yoast-notifications .button.restore:hover{background:#0000}.yoast-notifications .button.dismiss:focus:before,.yoast-notifications .button.restore:focus:before{border-radius:50%;box-shadow:0 0 0 1px #007cba;content:"";display:block;height:32px;right:50%;outline:2px solid #0000;position:absolute;top:50%;transform:translate(50%,-50%);width:32px}.yoast-container .separator{border-top:1px solid #ddd;margin-bottom:1em;margin-top:1em}.yoast-container .dashicons-yes{color:#77b227}.yoast-container-disabled{background-color:#e8e8e8b3;border-radius:4px;bottom:0;display:table-cell;right:0;position:absolute;left:0;top:0}.yoast-no-issues{color:#666;padding:1em 16px 1em 1em}.yoast-muted-title{font-style:italic;font-weight:600;overflow:hidden}.yoast-muted-title:after{border-top:1px solid #ddd;content:"";display:inline-block;height:.5em;margin-right:10px;margin-left:-100%;vertical-align:bottom;width:100%}.yoast-notifications-active .yoast-notification,.yoast-notifications-dismissed .yoast-notification{flex:1;padding-left:52px}.yoast-notifications-active .yoast-notification-holder{margin-bottom:20px}.yoast-notifications-dismissed.paper.tab-block{margin:20px 0}.yoast-notifications-dismissed.paper.tab-block .paper-container.toggleable-container{padding:0}.yoast-notifications-dismissed.paper.tab-block .paper-container.toggleable-container .yoast-notification-holder:nth-child(odd){background-color:#f7f7f7}.yoast-notifications-dismissed.paper.tab-block .paper-container.toggleable-container .yoast-notification-holder:nth-child(odd) .yoast-notification{background-color:initial}.yoast-notifications-dismissed .yoast-svg-icon-eye{background:#0000 var(--yoast-svg-icon-eye) no-repeat 100% 0;background-size:20px}#yoast-errors-header .dashicons{color:#dc3232}#yoast-errors-active .yoast-notification{border-right-color:#dc3232}#yoast-errors-dismissed .yoast-notification{border-right-color:#d93f69}#yoast-warnings-header .dashicons{color:#5d237a}#yoast-warnings-active .yoast-notification{border-right-color:#5d237a}#yoast-warnings-dismissed .yoast-notification{border-right-color:#0075b3} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/notifications-2330.css b/wp-content/plugins/wordpress-seo/css/dist/notifications-2330.css new file mode 100644 index 00000000..f95e57c4 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/notifications-2330.css @@ -0,0 +1 @@ +:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.screen-reader-text{clip:rect(1px,1px,1px,1px);word-wrap:normal!important;border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute!important;width:1px}.yoast-notification{background:#fff;border-left:4px solid #fff;box-shadow:0 1px 2px #0003;padding:0 12px}.yoast-container{background-color:#fdfdfd;border:1px solid #e5e5e5;box-shadow:0 1px 1px #0000000a;margin:20px 0 1px;max-width:1280px;padding:20px 20px 0;position:relative}.yoast-notifications>h2:first-child{font-size:23px;font-weight:400;line-height:29px;margin:0;padding:9px 0 4px}.yoast-notifications .yoast-container h3{background-color:#fdfdfd;border-bottom:1px solid #ccc;font-size:1.4em;margin:-20px -20px 0;padding:1em}.yoast-container .container{max-width:980px}.yoast-container .yoast-notification-holder{display:flex;position:relative}.dismiss .dashicons,.restore .dashicons{font-size:20px;height:20px;width:20px}.yoast-bottom-spacing{margin-bottom:20px}.yoast-notifications .button.dismiss,.yoast-notifications .button.restore{background:#0000;border:none;border-radius:0;box-shadow:none;cursor:pointer;height:100%;line-height:inherit;outline:none;padding:0;position:absolute;right:0;width:52px}.yoast-notifications .button.dismiss:focus,.yoast-notifications .button.dismiss:hover,.yoast-notifications .button.restore:focus,.yoast-notifications .button.restore:hover{background:#0000}.yoast-notifications .button.dismiss:focus:before,.yoast-notifications .button.restore:focus:before{border-radius:50%;box-shadow:0 0 0 1px #007cba;content:"";display:block;height:32px;left:50%;outline:2px solid #0000;position:absolute;top:50%;transform:translate(-50%,-50%);width:32px}.yoast-container .separator{border-top:1px solid #ddd;margin-bottom:1em;margin-top:1em}.yoast-container .dashicons-yes{color:#77b227}.yoast-container-disabled{background-color:#e8e8e8b3;border-radius:4px;bottom:0;display:table-cell;left:0;position:absolute;right:0;top:0}.yoast-no-issues{color:#666;padding:1em 1em 1em 16px}.yoast-muted-title{font-style:italic;font-weight:600;overflow:hidden}.yoast-muted-title:after{border-top:1px solid #ddd;content:"";display:inline-block;height:.5em;margin-left:10px;margin-right:-100%;vertical-align:bottom;width:100%}.yoast-notifications-active .yoast-notification,.yoast-notifications-dismissed .yoast-notification{flex:1;padding-right:52px}.yoast-notifications-active .yoast-notification-holder{margin-bottom:20px}.yoast-notifications-dismissed.paper.tab-block{margin:20px 0}.yoast-notifications-dismissed.paper.tab-block .paper-container.toggleable-container{padding:0}.yoast-notifications-dismissed.paper.tab-block .paper-container.toggleable-container .yoast-notification-holder:nth-child(odd){background-color:#f7f7f7}.yoast-notifications-dismissed.paper.tab-block .paper-container.toggleable-container .yoast-notification-holder:nth-child(odd) .yoast-notification{background-color:initial}.yoast-notifications-dismissed .yoast-svg-icon-eye{background:#0000 var(--yoast-svg-icon-eye) no-repeat 0 0;background-size:20px}#yoast-errors-header .dashicons{color:#dc3232}#yoast-errors-active .yoast-notification{border-left-color:#dc3232}#yoast-errors-dismissed .yoast-notification{border-left-color:#d93f69}#yoast-warnings-header .dashicons{color:#5d237a}#yoast-warnings-active .yoast-notification{border-left-color:#5d237a}#yoast-warnings-dismissed .yoast-notification{border-left-color:#0075b3} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/score_icon-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/score_icon-2330-rtl.css new file mode 100644 index 00000000..23fa8c61 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/score_icon-2330-rtl.css @@ -0,0 +1 @@ +.wpseo-score-icon{background:#888;border-radius:50%!important;display:inline-block!important;height:12px!important;margin:3px 3px 0 10px;vertical-align:top;width:12px!important}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/score_icon-2330.css b/wp-content/plugins/wordpress-seo/css/dist/score_icon-2330.css new file mode 100644 index 00000000..b6193eec --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/score_icon-2330.css @@ -0,0 +1 @@ +.wpseo-score-icon{background:#888;border-radius:50%!important;display:inline-block!important;height:12px!important;margin:3px 10px 0 3px;vertical-align:top;width:12px!important}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/structured-data-blocks-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/structured-data-blocks-2330-rtl.css new file mode 100644 index 00000000..a5c8cd08 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/structured-data-blocks-2330-rtl.css @@ -0,0 +1 @@ +.schema-faq-section,.schema-how-to-step{border:1px solid #9197a240;list-style-type:none;margin:4px 0;padding:8px 32px 8px 4px;position:relative}.schema-faq-buttons,.schema-how-to-buttons{display:flex;justify-content:center}.schema-faq-buttons button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover,.schema-how-to-buttons button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover{box-shadow:none;color:#007cba}.schema-faq-section-mover,.schema-how-to-step-mover{display:inline-block}.schema-faq-section-mover .editor-block-mover__control,.schema-how-to-step-mover .editor-block-mover__control{display:inline-flex;height:36px;width:36px}.schema-faq-question,.schema-how-to-step-name{font-weight:600}.schema-faq .schema-faq-answer,.schema-faq .schema-faq-question,.schema-how-to .schema-how-to-description,.schema-how-to .schema-how-to-step-name,.schema-how-to .schema-how-to-step-text,.schema-how-to .schema-how-to-steps{line-height:inherit;margin:0}.schema-how-to .schema-how-to-steps{padding-top:0}.schema-faq-section-button-container,.schema-how-to-step-button-container{display:inline-flex;text-align:left}.schema-faq-section-button-container button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover,.schema-how-to-step-button-container button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover{box-shadow:none;color:#007cba}.schema-faq-section-controls-container,.schema-how-to-step-controls-container{margin-right:-28px;text-align:left}.schema-faq-section-controls-container .dashicons-arrow-up-alt2,.schema-how-to-step-controls-container .dashicons-arrow-up-alt2{position:relative;top:-1px}.faq-section-add-media .dashicon,.how-to-step-add-media .dashicon,.schema-faq-add-question .dashicon,.schema-how-to-add-step .dashicon,.schema-how-to-duration-button .dashicon{margin-left:4px}.schema-how-to{padding-top:4px}.schema-how-to-step-number{right:4px;position:absolute;text-align:left;width:24px}.schema-how-to-duration{border:0;margin:0;padding:0}.schema-how-to-duration-flex-container{align-items:center;display:flex}.schema-how-to-duration-time-input{align-items:center;display:inline-flex;flex-wrap:nowrap}legend.schema-how-to-duration-legend{margin-left:4px}#schema-how-to-duration-days{margin-left:8px}.schema-how-to-duration .schema-how-to-duration-input[type=number]{-moz-appearance:textfield;margin:0 2px;padding:6px 4px;text-align:center;width:40px}.schema-how-to-duration .schema-how-to-duration-input[type=number]::-webkit-inner-spin-button,.schema-how-to-duration .schema-how-to-duration-input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.schema-how-to-duration-button.components-icon-button{margin-right:-8px;vertical-align:top}.schema-how-to-duration-button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover{box-shadow:none;color:#007cba}.schema-how-to-description{margin:8px 0}body.is-dark-theme .schema-faq-section-mover button.components-button,body.is-dark-theme .schema-how-to-step-mover button.components-button,body.is-dark-theme button.components-button.schema-faq-add-question,body.is-dark-theme button.components-button.schema-faq-section-button,body.is-dark-theme button.components-button.schema-how-to-add-step,body.is-dark-theme button.components-button.schema-how-to-duration-button,body.is-dark-theme button.components-button.schema-how-to-step-button{color:#e8eaed} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/structured-data-blocks-2330.css b/wp-content/plugins/wordpress-seo/css/dist/structured-data-blocks-2330.css new file mode 100644 index 00000000..23f0f862 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/structured-data-blocks-2330.css @@ -0,0 +1 @@ +.schema-faq-section,.schema-how-to-step{border:1px solid #9197a240;list-style-type:none;margin:4px 0;padding:8px 4px 8px 32px;position:relative}.schema-faq-buttons,.schema-how-to-buttons{display:flex;justify-content:center}.schema-faq-buttons button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover,.schema-how-to-buttons button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover{box-shadow:none;color:#007cba}.schema-faq-section-mover,.schema-how-to-step-mover{display:inline-block}.schema-faq-section-mover .editor-block-mover__control,.schema-how-to-step-mover .editor-block-mover__control{display:inline-flex;height:36px;width:36px}.schema-faq-question,.schema-how-to-step-name{font-weight:600}.schema-faq .schema-faq-answer,.schema-faq .schema-faq-question,.schema-how-to .schema-how-to-description,.schema-how-to .schema-how-to-step-name,.schema-how-to .schema-how-to-step-text,.schema-how-to .schema-how-to-steps{line-height:inherit;margin:0}.schema-how-to .schema-how-to-steps{padding-top:0}.schema-faq-section-button-container,.schema-how-to-step-button-container{display:inline-flex;text-align:right}.schema-faq-section-button-container button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover,.schema-how-to-step-button-container button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover{box-shadow:none;color:#007cba}.schema-faq-section-controls-container,.schema-how-to-step-controls-container{margin-left:-28px;text-align:right}.schema-faq-section-controls-container .dashicons-arrow-up-alt2,.schema-how-to-step-controls-container .dashicons-arrow-up-alt2{position:relative;top:-1px}.faq-section-add-media .dashicon,.how-to-step-add-media .dashicon,.schema-faq-add-question .dashicon,.schema-how-to-add-step .dashicon,.schema-how-to-duration-button .dashicon{margin-right:4px}.schema-how-to{padding-top:4px}.schema-how-to-step-number{left:4px;position:absolute;text-align:right;width:24px}.schema-how-to-duration{border:0;margin:0;padding:0}.schema-how-to-duration-flex-container{align-items:center;display:flex}.schema-how-to-duration-time-input{align-items:center;display:inline-flex;flex-wrap:nowrap}legend.schema-how-to-duration-legend{margin-right:4px}#schema-how-to-duration-days{margin-right:8px}.schema-how-to-duration .schema-how-to-duration-input[type=number]{-moz-appearance:textfield;margin:0 2px;padding:6px 4px;text-align:center;width:40px}.schema-how-to-duration .schema-how-to-duration-input[type=number]::-webkit-inner-spin-button,.schema-how-to-duration .schema-how-to-duration-input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.schema-how-to-duration-button.components-icon-button{margin-left:-8px;vertical-align:top}.schema-how-to-duration-button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover{box-shadow:none;color:#007cba}.schema-how-to-description{margin:8px 0}body.is-dark-theme .schema-faq-section-mover button.components-button,body.is-dark-theme .schema-how-to-step-mover button.components-button,body.is-dark-theme button.components-button.schema-faq-add-question,body.is-dark-theme button.components-button.schema-faq-section-button,body.is-dark-theme button.components-button.schema-how-to-add-step,body.is-dark-theme button.components-button.schema-how-to-duration-button,body.is-dark-theme button.components-button.schema-how-to-step-button{color:#e8eaed} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/support-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/support-2330-rtl.css new file mode 100644 index 00000000..44a1ca14 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/support-2330-rtl.css @@ -0,0 +1 @@ +.seo_page_wpseo_page_support{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity));z-index:-1}.seo_page_wpseo_page_support #wpcontent{padding-right:0!important}.seo_page_wpseo_page_support #wpfooter{padding-left:1rem}@media (min-width:768px){.seo_page_wpseo_page_support #wpfooter{padding-right:17rem;padding-left:2rem}}@media screen and (max-width:782px){.seo_page_wpseo_page_support .wp-responsive-open #wpbody{left:-190px}} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/support-2330.css b/wp-content/plugins/wordpress-seo/css/dist/support-2330.css new file mode 100644 index 00000000..fa1284bb --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/support-2330.css @@ -0,0 +1 @@ +.seo_page_wpseo_page_support{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity));z-index:-1}.seo_page_wpseo_page_support #wpcontent{padding-left:0!important}.seo_page_wpseo_page_support #wpfooter{padding-right:1rem}@media (min-width:768px){.seo_page_wpseo_page_support #wpfooter{padding-left:17rem;padding-right:2rem}}@media screen and (max-width:782px){.seo_page_wpseo_page_support .wp-responsive-open #wpbody{right:-190px}} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/tailwind-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/tailwind-2330-rtl.css new file mode 100644 index 00000000..bfd38599 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/tailwind-2330-rtl.css @@ -0,0 +1 @@ +.yst-root *,.yst-root :after,.yst-root :before{border:0 solid #e5e7eb;box-sizing:border-box}.yst-root :after,.yst-root :before{--tw-content:""}.yst-root{-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5;margin:0;tab-size:4}.yst-root hr{border-top-width:1px;color:inherit;height:0}.yst-root abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.yst-root h1,.yst-root h2,.yst-root h3,.yst-root h4,.yst-root h5,.yst-root h6{font-size:inherit;font-weight:inherit}.yst-root a{color:inherit;text-decoration:inherit}.yst-root b,.yst-root strong{font-weight:bolder}.yst-root code,.yst-root kbd,.yst-root pre,.yst-root samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}.yst-root small{font-size:80%}.yst-root sub,.yst-root sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}.yst-root sub{bottom:-.25em}.yst-root sup{top:-.5em}.yst-root table{border-collapse:collapse;border-color:inherit;text-indent:0}.yst-root button,.yst-root input,.yst-root optgroup,.yst-root select,.yst-root textarea{color:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;margin:0;padding:0}.yst-root button,.yst-root select{text-transform:none}.yst-root [type=button],.yst-root [type=reset],.yst-root [type=submit],.yst-root button{-webkit-appearance:button;background-color:initial;background-image:none}.yst-root :-moz-focusring{outline:auto}.yst-root :-moz-ui-invalid{box-shadow:none}.yst-root progress{vertical-align:initial}.yst-root ::-webkit-inner-spin-button,.yst-root ::-webkit-outer-spin-button{height:auto}.yst-root [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.yst-root ::-webkit-search-decoration{-webkit-appearance:none}.yst-root ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.yst-root summary{display:list-item}.yst-root blockquote,.yst-root dd,.yst-root dl,.yst-root figure,.yst-root h1,.yst-root h2,.yst-root h3,.yst-root h4,.yst-root h5,.yst-root h6,.yst-root hr,.yst-root p,.yst-root pre{margin:0}.yst-root fieldset{margin:0;padding:0}.yst-root legend{padding:0}.yst-root menu,.yst-root ol,.yst-root ul{list-style:none;margin:0;padding:0}.yst-root textarea{resize:vertical}.yst-root input::placeholder,.yst-root textarea::placeholder{color:#6b7280;opacity:1}.yst-root [role=button],.yst-root button{cursor:pointer}.yst-root :disabled{cursor:default}.yst-root audio,.yst-root canvas,.yst-root embed,.yst-root iframe,.yst-root img,.yst-root object,.yst-root svg,.yst-root video{display:block;vertical-align:middle}.yst-root img,.yst-root video{height:auto;max-width:100%}.yst-root [type=date],.yst-root [type=datetime-local],.yst-root [type=email],.yst-root [type=month],.yst-root [type=number],.yst-root [type=password],.yst-root [type=search],.yst-root [type=tel],.yst-root [type=text],.yst-root [type=time],.yst-root [type=url],.yst-root [type=week]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root [type=date]:focus,.yst-root [type=datetime-local]:focus,.yst-root [type=email]:focus,.yst-root [type=month]:focus,.yst-root [type=number]:focus,.yst-root [type=password]:focus,.yst-root [type=search]:focus,.yst-root [type=tel]:focus,.yst-root [type=text]:focus,.yst-root [type=time]:focus,.yst-root [type=url]:focus,.yst-root [type=week]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=date]::placeholder,.yst-root [type=datetime-local]::placeholder,.yst-root [type=email]::placeholder,.yst-root [type=month]::placeholder,.yst-root [type=number]::placeholder,.yst-root [type=password]::placeholder,.yst-root [type=search]::placeholder,.yst-root [type=tel]::placeholder,.yst-root [type=text]::placeholder,.yst-root [type=time]::placeholder,.yst-root [type=url]::placeholder,.yst-root [type=week]::placeholder{color:#6b7280;opacity:1}.yst-root [type=date]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=datetime-local]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=email]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=month]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=number]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=password]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=search]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=tel]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=text]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=time]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=url]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=week]::-webkit-datetime-edit-fields-wrapper{padding:0}.yst-root [type=date]::-webkit-date-and-time-value,.yst-root [type=datetime-local]::-webkit-date-and-time-value,.yst-root [type=email]::-webkit-date-and-time-value,.yst-root [type=month]::-webkit-date-and-time-value,.yst-root [type=number]::-webkit-date-and-time-value,.yst-root [type=password]::-webkit-date-and-time-value,.yst-root [type=search]::-webkit-date-and-time-value,.yst-root [type=tel]::-webkit-date-and-time-value,.yst-root [type=text]::-webkit-date-and-time-value,.yst-root [type=time]::-webkit-date-and-time-value,.yst-root [type=url]::-webkit-date-and-time-value,.yst-root [type=week]::-webkit-date-and-time-value{min-height:1.5em}.yst-root [type=date]::-webkit-datetime-edit,.yst-root [type=date]::-webkit-datetime-edit-day-field,.yst-root [type=date]::-webkit-datetime-edit-hour-field,.yst-root [type=date]::-webkit-datetime-edit-meridiem-field,.yst-root [type=date]::-webkit-datetime-edit-millisecond-field,.yst-root [type=date]::-webkit-datetime-edit-minute-field,.yst-root [type=date]::-webkit-datetime-edit-month-field,.yst-root [type=date]::-webkit-datetime-edit-second-field,.yst-root [type=date]::-webkit-datetime-edit-year-field,.yst-root [type=datetime-local]::-webkit-datetime-edit,.yst-root [type=datetime-local]::-webkit-datetime-edit-day-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-hour-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-meridiem-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-millisecond-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-minute-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-month-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-second-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-year-field,.yst-root [type=email]::-webkit-datetime-edit,.yst-root [type=email]::-webkit-datetime-edit-day-field,.yst-root [type=email]::-webkit-datetime-edit-hour-field,.yst-root [type=email]::-webkit-datetime-edit-meridiem-field,.yst-root [type=email]::-webkit-datetime-edit-millisecond-field,.yst-root [type=email]::-webkit-datetime-edit-minute-field,.yst-root [type=email]::-webkit-datetime-edit-month-field,.yst-root [type=email]::-webkit-datetime-edit-second-field,.yst-root [type=email]::-webkit-datetime-edit-year-field,.yst-root [type=month]::-webkit-datetime-edit,.yst-root [type=month]::-webkit-datetime-edit-day-field,.yst-root [type=month]::-webkit-datetime-edit-hour-field,.yst-root [type=month]::-webkit-datetime-edit-meridiem-field,.yst-root [type=month]::-webkit-datetime-edit-millisecond-field,.yst-root [type=month]::-webkit-datetime-edit-minute-field,.yst-root [type=month]::-webkit-datetime-edit-month-field,.yst-root [type=month]::-webkit-datetime-edit-second-field,.yst-root [type=month]::-webkit-datetime-edit-year-field,.yst-root [type=number]::-webkit-datetime-edit,.yst-root [type=number]::-webkit-datetime-edit-day-field,.yst-root [type=number]::-webkit-datetime-edit-hour-field,.yst-root [type=number]::-webkit-datetime-edit-meridiem-field,.yst-root [type=number]::-webkit-datetime-edit-millisecond-field,.yst-root [type=number]::-webkit-datetime-edit-minute-field,.yst-root [type=number]::-webkit-datetime-edit-month-field,.yst-root [type=number]::-webkit-datetime-edit-second-field,.yst-root [type=number]::-webkit-datetime-edit-year-field,.yst-root [type=password]::-webkit-datetime-edit,.yst-root [type=password]::-webkit-datetime-edit-day-field,.yst-root [type=password]::-webkit-datetime-edit-hour-field,.yst-root [type=password]::-webkit-datetime-edit-meridiem-field,.yst-root [type=password]::-webkit-datetime-edit-millisecond-field,.yst-root [type=password]::-webkit-datetime-edit-minute-field,.yst-root [type=password]::-webkit-datetime-edit-month-field,.yst-root [type=password]::-webkit-datetime-edit-second-field,.yst-root [type=password]::-webkit-datetime-edit-year-field,.yst-root [type=search]::-webkit-datetime-edit,.yst-root [type=search]::-webkit-datetime-edit-day-field,.yst-root [type=search]::-webkit-datetime-edit-hour-field,.yst-root [type=search]::-webkit-datetime-edit-meridiem-field,.yst-root [type=search]::-webkit-datetime-edit-millisecond-field,.yst-root [type=search]::-webkit-datetime-edit-minute-field,.yst-root [type=search]::-webkit-datetime-edit-month-field,.yst-root [type=search]::-webkit-datetime-edit-second-field,.yst-root [type=search]::-webkit-datetime-edit-year-field,.yst-root [type=tel]::-webkit-datetime-edit,.yst-root [type=tel]::-webkit-datetime-edit-day-field,.yst-root [type=tel]::-webkit-datetime-edit-hour-field,.yst-root [type=tel]::-webkit-datetime-edit-meridiem-field,.yst-root [type=tel]::-webkit-datetime-edit-millisecond-field,.yst-root [type=tel]::-webkit-datetime-edit-minute-field,.yst-root [type=tel]::-webkit-datetime-edit-month-field,.yst-root [type=tel]::-webkit-datetime-edit-second-field,.yst-root [type=tel]::-webkit-datetime-edit-year-field,.yst-root [type=text]::-webkit-datetime-edit,.yst-root [type=text]::-webkit-datetime-edit-day-field,.yst-root [type=text]::-webkit-datetime-edit-hour-field,.yst-root [type=text]::-webkit-datetime-edit-meridiem-field,.yst-root [type=text]::-webkit-datetime-edit-millisecond-field,.yst-root [type=text]::-webkit-datetime-edit-minute-field,.yst-root [type=text]::-webkit-datetime-edit-month-field,.yst-root [type=text]::-webkit-datetime-edit-second-field,.yst-root [type=text]::-webkit-datetime-edit-year-field,.yst-root [type=time]::-webkit-datetime-edit,.yst-root [type=time]::-webkit-datetime-edit-day-field,.yst-root [type=time]::-webkit-datetime-edit-hour-field,.yst-root [type=time]::-webkit-datetime-edit-meridiem-field,.yst-root [type=time]::-webkit-datetime-edit-millisecond-field,.yst-root [type=time]::-webkit-datetime-edit-minute-field,.yst-root [type=time]::-webkit-datetime-edit-month-field,.yst-root [type=time]::-webkit-datetime-edit-second-field,.yst-root [type=time]::-webkit-datetime-edit-year-field,.yst-root [type=url]::-webkit-datetime-edit,.yst-root [type=url]::-webkit-datetime-edit-day-field,.yst-root [type=url]::-webkit-datetime-edit-hour-field,.yst-root [type=url]::-webkit-datetime-edit-meridiem-field,.yst-root [type=url]::-webkit-datetime-edit-millisecond-field,.yst-root [type=url]::-webkit-datetime-edit-minute-field,.yst-root [type=url]::-webkit-datetime-edit-month-field,.yst-root [type=url]::-webkit-datetime-edit-second-field,.yst-root [type=url]::-webkit-datetime-edit-year-field,.yst-root [type=week]::-webkit-datetime-edit,.yst-root [type=week]::-webkit-datetime-edit-day-field,.yst-root [type=week]::-webkit-datetime-edit-hour-field,.yst-root [type=week]::-webkit-datetime-edit-meridiem-field,.yst-root [type=week]::-webkit-datetime-edit-millisecond-field,.yst-root [type=week]::-webkit-datetime-edit-minute-field,.yst-root [type=week]::-webkit-datetime-edit-month-field,.yst-root [type=week]::-webkit-datetime-edit-second-field,.yst-root [type=week]::-webkit-datetime-edit-year-field{padding-bottom:0;padding-top:0}.yst-root textarea{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root textarea:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root textarea::placeholder{color:#6b7280;opacity:1}.yst-root select{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root select:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:left .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-left:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}.yst-root select[multiple]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root select[multiple]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=checkbox]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:#6b7280;border-radius:0;border-width:1px;color:#2563eb;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;-webkit-user-select:none;user-select:none;vertical-align:middle;width:1rem}.yst-root [type=checkbox]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=checkbox]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}.yst-root [type=checkbox]:checked,.yst-root [type=checkbox]:checked:focus,.yst-root [type=checkbox]:checked:hover,.yst-root [type=checkbox]:indeterminate{background-color:currentColor;border-color:#0000}.yst-root [type=checkbox]:indeterminate{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}.yst-root [type=checkbox]:indeterminate:focus,.yst-root [type=checkbox]:indeterminate:hover{background-color:currentColor;border-color:#0000}.yst-root [type=radio]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:#6b7280;border-radius:100%;border-width:1px;color:#2563eb;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;-webkit-user-select:none;user-select:none;vertical-align:middle;width:1rem}.yst-root [type=radio]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=radio]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}.yst-root [type=radio]:checked,.yst-root [type=radio]:checked:focus,.yst-root [type=radio]:checked:hover{background-color:currentColor;border-color:#0000}.yst-root{--tw-text-opacity:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:rgb(71 85 105/var(--tw-text-opacity));font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:.8125rem;font-weight:400;line-height:1.5}.yst-root a{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity));-webkit-text-decoration-line:underline;text-decoration-line:underline}.yst-root a:visited{color:#a61e69}.yst-root a:hover{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.yst-root a:hover:visited{color:#b94986}.yst-root a:focus{--tw-text-opacity:1;border-radius:.125rem;color:rgb(99 102 241/var(--tw-text-opacity));outline-color:#4f46e5;outline-offset:1px;outline-style:solid}.yst-root [type=date]::placeholder,.yst-root [type=datetime-local]::placeholder,.yst-root [type=email]::placeholder,.yst-root [type=month]::placeholder,.yst-root [type=number]::placeholder,.yst-root [type=password]::placeholder,.yst-root [type=search]::placeholder,.yst-root [type=tel]::placeholder,.yst-root [type=text]::placeholder,.yst-root [type=time]::placeholder,.yst-root [type=url]::placeholder,.yst-root [type=week]::placeholder,.yst-root textarea::placeholder{--tw-placeholder-opacity:1;color:rgb(100 116 139/var(--tw-placeholder-opacity))}.yst-root svg path{stroke-width:inherit}.yst-root .yst-radio__input,.yst-root a:focus{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.yst-root .yst-radio__input{transition-property:none}.yst-root .yst-radio__input:checked:before{content:var(--tw-content);display:none}.yst-root .yst-modal{z-index:100000!important}.yst-root dd,.yst-root li{margin-bottom:0}.yst-root input[type=date],.yst-root input[type=datetime-local],.yst-root input[type=datetime],.yst-root input[type=email],.yst-root input[type=month],.yst-root input[type=number],.yst-root input[type=password],.yst-root input[type=search],.yst-root input[type=tel],.yst-root input[type=text],.yst-root input[type=time],.yst-root input[type=url],.yst-root input[type=week]{min-height:0}.yst-root input[type=checkbox]{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);min-height:0;min-width:0;transition-property:none}.yst-root input[type=checkbox]:before{--tw-content:none;content:var(--tw-content)}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.yst-root .yst-alert{border-radius:.375rem;display:flex;gap:.75rem;padding:1rem}.yst-root .yst-alert--info{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.yst-root .yst-alert--info .yst-alert__message{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}.yst-root .yst-alert--warning{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}.yst-root .yst-alert--warning .yst-alert__message{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}.yst-root .yst-alert--success{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}.yst-root .yst-alert--success .yst-alert__message{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}.yst-root .yst-alert--error{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.yst-root .yst-alert--error .yst-alert__message{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}.yst-root .yst-alert__icon{flex-grow:0;flex-shrink:0;height:1.25rem;width:1.25rem}.yst-root .yst-autocomplete{position:relative}.yst-root .yst-autocomplete--error .yst-autocomplete__button{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}.yst-root .yst-autocomplete--error .yst-autocomplete__button:focus{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity));border-color:rgb(239 68 68/var(--tw-border-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete--error .yst-autocomplete__input::placeholder{--tw-placeholder-opacity:1;color:rgb(252 165 165/var(--tw-placeholder-opacity))}.yst-root .yst-autocomplete--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-autocomplete--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-autocomplete--disabled .yst-autocomplete__input{cursor:not-allowed}.yst-root .yst-autocomplete--disabled .yst-autocomplete__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-autocomplete--disabled .yst-autocomplete__button{cursor:not-allowed}.yst-root .yst-autocomplete--disabled .yst-autocomplete__button:focus-within{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity));border-color:rgb(226 232 240/var(--tw-border-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete__button{--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);display:flex;padding-right:.75rem;padding-left:.75rem;width:100%}.yst-root .yst-autocomplete__button:focus-within{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete__button-icon{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:1.25rem;pointer-events:none;position:absolute;left:.625rem;top:.6875rem;width:1.25rem}.yst-root .yst-autocomplete__input{--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;padding:.5rem 0 .5rem 2.5rem;width:100%}.yst-root .yst-autocomplete__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-autocomplete__options{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);font-size:.8125rem;margin-top:.25rem;max-height:15rem;overflow:auto;position:absolute;width:100%;z-index:20}.yst-root .yst-autocomplete__options:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete__option{--tw-text-opacity:1;align-items:center;color:rgb(51 65 85/var(--tw-text-opacity));cursor:default;display:flex;justify-content:space-between;padding:.5rem .75rem;position:relative;-webkit-user-select:none;user-select:none}.yst-root .yst-autocomplete__option--active{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.yst-root .yst-autocomplete__option--selected{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-select__option-label{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yst-root .yst-autocomplete__option-check{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));flex-shrink:0;height:1.25rem;width:1.25rem}.yst-root .yst-badge{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(219 234 254/var(--tw-bg-opacity));border-radius:9999px;color:rgb(30 64 175/var(--tw-text-opacity));display:inline-flex;font-size:.75rem;font-weight:500;line-height:1.25;padding:.125rem .5rem;vertical-align:middle;white-space:nowrap}.yst-root .yst-badge--info{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity));color:rgb(30 58 138/var(--tw-text-opacity))}.yst-root .yst-badge--upsell{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity));color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-badge--plain{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(15 23 42/var(--tw-text-opacity))}.yst-root .yst-badge--small{font-size:.675rem}.yst-root .yst-badge--large{font-size:1rem;padding-right:.75rem;padding-left:.75rem}.yst-root .yst-button{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-color:#0000;align-items:center;border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);cursor:pointer;display:inline-flex;font-size:.8125rem;font-weight:500;justify-content:center;line-height:1.25rem;padding:.5rem .75rem;text-align:center;-webkit-text-decoration-line:none;text-decoration-line:none}.yst-root .yst-button:focus{outline-color:#a61e69;outline-offset:2px;outline-style:solid;outline-width:2px}.yst-root a.yst-button:focus{border-radius:.375rem}.yst-root .yst-button--primary{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-color:#0000;background-color:rgb(166 30 105/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--primary:visited{color:#fff}.yst-root .yst-button--primary:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(143 15 87/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--primary:hover:visited{color:#fff}.yst-root .yst-button--primary:focus{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));outline-color:#8f0f57}.yst-root .yst-button--secondary{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));background-color:rgb(255 255 255/var(--tw-bg-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}.yst-root .yst-button--secondary:visited{color:#1e293b}.yst-root .yst-button--secondary:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}.yst-root .yst-button--secondary:hover:visited{color:#1e293b}.yst-root .yst-button--secondary:focus{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));outline-color:#8f0f57}.yst-root .yst-button--tertiary{--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);background-color:initial;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(166 30 105/var(--tw-text-opacity))}.yst-root .yst-button--tertiary:visited{color:#83084e}.yst-root .yst-button--tertiary:hover{--tw-text-opacity:1;color:rgb(131 8 78/var(--tw-text-opacity))}.yst-root .yst-button--tertiary:hover:visited{color:#83084e}.yst-root .yst-button--tertiary:focus{--tw-text-opacity:1;color:rgb(131 8 78/var(--tw-text-opacity));outline-color:#8f0f57}.yst-root .yst-button--error{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity));border-color:#0000;color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--error:visited{color:#fff}.yst-root .yst-button--error:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--error:hover:visited{color:#fff}.yst-root .yst-button--error:focus{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));outline-color:#dc2626}.yst-root .yst-button--upsell{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity));border-color:#0000;color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-button--upsell:visited{color:#78350f}.yst-root .yst-button--upsell:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity));color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-button--upsell:hover:visited{color:#78350f}.yst-root .yst-button--upsell:focus{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity));outline-color:#fbbf24}.yst-root .yst-button--large{font-size:.875rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root .yst-button--extra-large{font-size:1rem;line-height:1.5rem;padding:.625rem .875rem}.yst-root .yst-button--small{font-size:.75rem;line-height:1rem;padding:.375rem .625rem}.yst-root .yst-button--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-button--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-checkbox{align-items:center;display:flex}.yst-root .yst-checkbox--disabled .yst-checkbox__input,.yst-root .yst-checkbox--disabled .yst-checkbox__label{cursor:not-allowed;opacity:.5}.yst-root .yst-checkbox__input{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.25rem;color:rgb(166 30 105/var(--tw-text-opacity));height:1rem;width:1rem}.yst-root .yst-checkbox__input:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))}.yst-root .yst-checkbox__label{margin-right:.75rem}.yst-root .yst-code{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:.25rem;color:rgb(15 23 42/var(--tw-text-opacity));display:inline-block;font-size:.75rem;line-height:1.25;margin:0;padding:.25rem}.yst-root .yst-code--block{display:block;margin-bottom:.5rem;margin-top:.5rem;max-width:100%;overflow-x:auto;padding:.25rem .5rem;white-space:nowrap}.yst-root .yst-file-input{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border:2px dashed rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;padding:1.25rem 1.5rem 1.5rem;text-align:center;transition-duration:.3s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:100%}.yst-root .yst-file-input.yst-is-drag-over{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(250 243 247/var(--tw-bg-opacity));border-color:rgb(205 130 171/var(--tw-border-opacity))}.yst-root .yst-file-input.yst-is-drag-over .yst-file-input__content{pointer-events:none}.yst-root .yst-file-input.yst-is-drag-over .yst-file-input__icon{--tw-translate-y:-0.5rem;--tw-text-opacity:1;color:rgb(185 73 134/var(--tw-text-opacity));transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-file-input.yst-is-disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-file-input.yst-is-disabled .yst-file-input__select-label{cursor:not-allowed}.yst-root .yst-file-input__content{align-items:center;display:inline-flex;flex-direction:column;max-width:20rem}.yst-root .yst-file-input__content>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-file-input__content{text-align:center}.yst-root .yst-file-input__icon{stroke-width:1;--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:3rem;margin-right:auto;margin-left:auto;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.3s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:3rem}.yst-root .yst-file-input__icon>path{stroke-width:1}.yst-root .yst-file-input__input{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.yst-root .yst-file-input__input:focus+.yst-file-input__select-label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-file-input__labels{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));display:inline-block;font-weight:400}.yst-root .yst-file-input__select-label{border-radius:.375rem;font-weight:500}[dir=rtl] .yst-root .yst-file-input__labels{flex-direction:row-reverse}.yst-root .yst-label{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;font-weight:500}.yst-root .yst-link{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity));cursor:pointer;-webkit-text-decoration-line:underline;text-decoration-line:underline}.yst-root .yst-link:visited{color:#a61e69}.yst-root .yst-link:hover{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.yst-root .yst-link:hover:visited{color:#b94986}.yst-root .yst-link:focus{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(79 70 229/var(--tw-ring-opacity));--tw-ring-offset-width:1px;--tw-ring-offset-color:#0000;border-radius:.125rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(99 102 241/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-link--primary{--tw-text-opacity:1;color:rgb(154 22 96/var(--tw-text-opacity))}.yst-root .yst-link--primary:focus,.yst-root .yst-link--primary:hover{--tw-text-opacity:1;color:rgb(166 30 105/var(--tw-text-opacity))}.yst-root .yst-link--primary:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(154 22 96/var(--tw-ring-opacity))}.yst-root .yst-link--error{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.yst-root .yst-link--error:focus,.yst-root .yst-link--error:hover{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.yst-root .yst-link--error:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(220 38 38/var(--tw-ring-opacity))}.yst-root .yst-paper{--tw-bg-opacity:1;--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);display:flex;flex-direction:column}.yst-root .yst-paper__header{border-bottom-width:1px;padding:2rem}.yst-root .yst-paper__content{flex-grow:1;padding:2rem}.yst-root .yst-progress-bar{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:9999px;display:block;overflow:hidden;width:100%}.yst-root .yst-progress-bar__progress{--tw-bg-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));border-radius:9999px;display:block;height:.375rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.2s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:linear}.yst-root .yst-radio{align-items:center;display:flex}.yst-root .yst-radio--disabled .yst-radio__check,.yst-root .yst-radio--disabled .yst-radio__input,.yst-root .yst-radio--disabled .yst-radio__label{cursor:not-allowed;opacity:.5}.yst-root .yst-radio--disabled .yst-radio__check:focus,.yst-root .yst-radio--disabled .yst-radio__input:focus,.yst-root .yst-radio--disabled .yst-radio__label:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block{display:inline-flex}.yst-root .yst-radio--inline-block .yst-radio__input{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.yst-root .yst-radio--inline-block .yst-radio__input:checked+.yst-radio__content .yst-radio__label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:#0000;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block .yst-radio__input:checked+.yst-radio__content .yst-radio__check{visibility:visible}.yst-root .yst-radio--inline-block .yst-radio__input:focus+.yst-radio__content .yst-radio__label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block .yst-radio__input:checked:focus+.yst-radio__content .yst-radio__label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-offset-width:1px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block .yst-radio__content{position:relative}.yst-root .yst-radio--inline-block .yst-radio__label{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.5rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);cursor:pointer;display:flex;font-size:1rem;height:3.5rem;justify-content:center;margin-right:0;width:3.5rem}.yst-root .yst-radio--inline-block .yst-radio__label:hover{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity))}.yst-root .yst-radio--inline-block .yst-radio__label:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-radio--inline-block .yst-radio__check{--tw-text-opacity:1;color:rgb(154 22 96/var(--tw-text-opacity));height:1.25rem;position:absolute;left:.125rem;top:.125rem;visibility:hidden;width:1.25rem}.yst-root .yst-radio__input{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity));color:rgb(166 30 105/var(--tw-text-opacity));height:1rem;width:1rem}.yst-root .yst-radio__input:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))}.yst-root .yst-radio__label{margin-right:.75rem}.yst-root .yst-select{position:relative}.yst-root .yst-select--disabled .yst-select__button,.yst-root .yst-select--disabled .yst-select__label{cursor:not-allowed;opacity:.5}.yst-root .yst-select__button{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(30 41 59/var(--tw-text-opacity));cursor:default;display:flex;justify-content:space-between;line-height:1.5rem;padding:.5rem .75rem;position:relative;text-align:right;width:100%}.yst-root .yst-select__button:focus{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-select__button-icon{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:1.25rem;pointer-events:none;position:absolute;left:.625rem;top:.625rem;width:1.25rem}.yst-root .yst-select__options{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);font-size:.8125rem;margin-top:.25rem;max-height:15rem;overflow:auto;position:absolute;width:100%;z-index:10}.yst-root .yst-select__options:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-select__option{--tw-text-opacity:1;align-items:center;color:rgb(51 65 85/var(--tw-text-opacity));cursor:default;display:flex;justify-content:space-between;padding:.5rem .75rem;position:relative;-webkit-user-select:none;user-select:none}.yst-root .yst-select__option--active{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.yst-root .yst-select__option--selected{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(154 22 96/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-select__button-label,.yst-root .yst-select__option-label{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yst-root .yst-select__option-check{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));flex-shrink:0;height:1.25rem;width:1.25rem}.yst-root .yst-skeleton-loader{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:.25rem;display:block;height:auto;overflow:hidden;position:relative;width:-moz-fit-content;width:fit-content}.yst-root .yst-skeleton-loader:after{--tw-translate-x:-100%;animation:wave 2.5s linear .5s infinite;background:linear-gradient(-90deg,#0000,#00000012,#0000);bottom:0;content:"";right:0;position:absolute;left:0;top:0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes wave{0%{transform:translateX(100%)}50%,to{transform:translateX(-100%)}}.yst-root .yst-tag-input{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;color:rgb(30 41 59/var(--tw-text-opacity));display:flex;flex-wrap:wrap;font-size:.8125rem;gap:.375rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root .yst-tag-input::placeholder{--tw-placeholder-opacity:1;color:rgb(100 116 139/var(--tw-placeholder-opacity))}.yst-root .yst-tag-input{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.yst-root .yst-tag-input,.yst-root .yst-tag-input:focus-within{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))}.yst-root .yst-tag-input--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-tag-input--disabled:focus-within{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:rgb(203 213 225/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input--disabled .yst-tag-input__tag{cursor:not-allowed}.yst-root .yst-tag-input--disabled .yst-tag-input__tag:hover{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input--disabled .yst-tag-input__tag:focus,.yst-root .yst-tag-input--disabled .yst-tag-input__tag:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input--disabled .yst-tag-input__remove-tag{cursor:not-allowed}.yst-root .yst-tag-input--disabled .yst-tag-input__remove-tag:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(148 163 184/var(--tw-text-opacity))}.yst-root .yst-tag-input--disabled .yst-tag-input__remove-tag:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input--disabled .yst-tag-input__input{cursor:not-allowed}.yst-root .yst-tag-input__tag{cursor:pointer;gap:.125rem;min-height:20px;padding-inline-end:.125rem}.yst-root .yst-tag-input__tag:hover{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input__tag:focus,.yst-root .yst-tag-input__tag:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input__remove-tag{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:9999px;color:rgb(148 163 184/var(--tw-text-opacity));display:inline-flex;flex-shrink:0;height:1rem;justify-content:center;width:1rem}.yst-root .yst-tag-input__remove-tag:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));color:rgb(100 116 139/var(--tw-text-opacity))}.yst-root .yst-tag-input__remove-tag:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input__input{border-style:none;display:inline-flex;flex:1 1 0%;font-size:.8125rem;margin:0;padding:0}.yst-root .yst-tag-input__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-text-input{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;padding:.5rem .75rem;width:100%}.yst-root .yst-text-input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-text-input--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-text-input--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-text-input--read-only{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;background-color:rgb(248 250 252/var(--tw-bg-opacity));border-color:rgb(226 232 240/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(100 116 139/var(--tw-text-opacity));cursor:default}.yst-root .yst-textarea{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;padding:.5rem .75rem;width:100%}.yst-root .yst-textarea:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-textarea--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-textarea--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-title{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity));font-weight:500;line-height:1.25}.yst-root .yst-title--1{font-size:1.5rem}.yst-root .yst-title--2{font-size:1.125rem}.yst-root .yst-title--3{font-size:.875rem}.yst-root .yst-title--4{font-size:1rem}.yst-root .yst-title--5{font-size:.8125rem}.yst-root .yst-toast{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);max-width:100%;overflow-y:auto;padding:1rem;pointer-events:auto;width:20rem;z-index:20}.yst-root .yst-toast--large{width:24rem}.yst-root .yst-toggle{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));border-color:#0000;border-radius:9999px;border-width:2px;cursor:pointer;display:inline-flex;flex-shrink:0;height:1.5rem;position:relative;transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,-webkit-text-decoration-color;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,-webkit-text-decoration-color;transition-timing-function:cubic-bezier(.4,0,.2,1);width:2.75rem}.yst-root .yst-toggle:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-toggle--checked{--tw-bg-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity))}.yst-root .yst-toggle--checked .yst-toggle__handle{--tw-translate-x:1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-toggle--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-toggle--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-toggle__handle{--tw-translate-x:0px;--tw-bg-opacity:1;--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:9999px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);display:flex;height:1.25rem;justify-content:center;pointer-events:none;position:relative;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:1.25rem}.yst-root .yst-toggle__icon{stroke:currentColor;stroke-width:2;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));flex-grow:0;flex-shrink:0;height:.625rem;transition-duration:.1s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:.625rem}.yst-root .yst-toggle__icon--check{--tw-text-opacity:1;color:rgb(166 30 105/var(--tw-text-opacity))}.yst-root .yst-toggle__icon--x{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}[dir=rtl] .yst-root .yst-toggle--checked .yst-toggle__handle{--tw-translate-x:-1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity));border-radius:.5rem;color:rgb(255 255 255/var(--tw-text-opacity));display:inline-block;font-size:.75rem;max-width:24rem;padding:.5rem .625rem;position:absolute;white-space:normal;width:max-content;z-index:10}.yst-root .yst-tooltip--top{--tw-translate-x:-50%;--tw-translate-y:-100%;right:50%;margin-top:-.75rem;top:0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip--top:before{--tw-translate-x:-50%;--tw-translate-y:0px;--tw-border-opacity:1;--tw-content:"";border-bottom-color:#0000;border-right-color:#0000;border-left-color:#0000;border-top-color:rgb(31 41 55/var(--tw-border-opacity));border-width:8px;content:var(--tw-content);position:absolute}.yst-root .yst-tooltip--bottom,.yst-root .yst-tooltip--top:before{right:50%;top:100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip--bottom{--tw-translate-x:-50%;--tw-translate-y:-0px;margin-top:.75rem}.yst-root .yst-tooltip--bottom:before{--tw-translate-x:-50%;--tw-border-opacity:1;--tw-content:"";border-bottom-color:rgb(31 41 55/var(--tw-border-opacity));border-right-color:#0000;border-left-color:#0000;border-top-color:#0000;border-width:8px;bottom:100%;content:var(--tw-content);right:50%;position:absolute;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip--right{--tw-translate-x:-0px;right:100%;margin-right:.75rem}.yst-root .yst-tooltip--right,.yst-root .yst-tooltip--right:before{--tw-translate-y:-50%;top:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip--right:before{--tw-border-opacity:1;--tw-content:"";border-bottom-color:#0000;border-right-color:#0000;border-left-color:rgb(31 41 55/var(--tw-border-opacity));border-top-color:#0000;border-width:8px;content:var(--tw-content);position:absolute;left:100%}.yst-root .yst-tooltip--left{margin-left:.75rem;left:100%}.yst-root .yst-tooltip--left,.yst-root .yst-tooltip--left:before{--tw-translate-y:-50%;top:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip--left:before{--tw-border-opacity:1;--tw-content:"";border-bottom-color:#0000;border-right-color:rgb(31 41 55/var(--tw-border-opacity));border-left-color:#0000;border-top-color:#0000;border-width:8px;content:var(--tw-content);right:100%;position:absolute}.yst-root .yst-validation-icon{pointer-events:none}.yst-root .yst-validation-icon--success{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.yst-root .yst-validation-icon--info{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.yst-root .yst-validation-icon--warning{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}.yst-root .yst-validation-icon--error{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.yst-root .yst-validation-input{position:relative}.yst-root .yst-validation-input--success .yst-validation-input__input{--tw-ring-opacity:1;--tw-ring-color:rgb(134 239 172/var(--tw-ring-opacity));padding-left:2.5rem}.yst-root .yst-validation-input--success .yst-validation-input__input:focus,.yst-root .yst-validation-input--success .yst-validation-input__input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgb(34 197 94/var(--tw-ring-opacity))}.yst-root .yst-validation-input--info .yst-validation-input__input{--tw-ring-opacity:1;--tw-ring-color:rgb(147 197 253/var(--tw-ring-opacity));padding-left:2.5rem}.yst-root .yst-validation-input--info .yst-validation-input__input:focus,.yst-root .yst-validation-input--info .yst-validation-input__input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity))}.yst-root .yst-validation-input--warning .yst-validation-input__input{--tw-ring-opacity:1;--tw-ring-color:rgb(252 211 77/var(--tw-ring-opacity));padding-left:2.5rem}.yst-root .yst-validation-input--warning .yst-validation-input__input:focus,.yst-root .yst-validation-input--warning .yst-validation-input__input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgb(245 158 11/var(--tw-ring-opacity))}.yst-root .yst-validation-input--error .yst-validation-input__input{--tw-ring-opacity:1;--tw-ring-color:rgb(252 165 165/var(--tw-ring-opacity));padding-left:2.5rem}.yst-root .yst-validation-input--error .yst-validation-input__input:focus,.yst-root .yst-validation-input--error .yst-validation-input__input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity))}.yst-root .yst-validation-input__input:focus,.yst-root .yst-validation-input__input:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-validation-input__icon{height:1.25rem;position:absolute;left:.625rem;top:.6875rem;width:1.25rem}.yst-root .yst-validation-message a{color:inherit;font-weight:500}.yst-root .yst-validation-message a:visited:hover{color:inherit}.yst-root .yst-validation-message a:focus{--tw-ring-color:currentColor}.yst-root .yst-validation-message--success{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.yst-root .yst-validation-message--info{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.yst-root .yst-validation-message--warning{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}.yst-root .yst-validation-message--error{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.yst-root .yst-autocomplete-field__description,.yst-root .yst-autocomplete-field__validation{margin-top:.5rem}.yst-root .yst-card{display:flex;flex-direction:column;position:relative}.yst-root .yst-card>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-card{--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);overflow:hidden;padding:1.5rem;transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.yst-root .yst-card__header{--tw-bg-opacity:1;align-items:center;background-color:rgb(243 244 246/var(--tw-bg-opacity));display:flex;height:6rem;justify-content:center;margin-right:-1.5rem;margin-left:-1.5rem;margin-top:-1.5rem;padding:1.5rem;position:relative}.yst-root .yst-card__content{flex-grow:1}.yst-root .yst-card__footer{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity));border-top-width:1px;padding-top:1.5rem}.yst-root .yst-checkbox-group--disabled .yst-checkbox-group__description,.yst-root .yst-checkbox-group--disabled .yst-checkbox-group__label{cursor:not-allowed;opacity:.5}.yst-root .yst-checkbox-group__label{margin-bottom:.5rem}.yst-root .yst-checkbox-group__options{display:flex;flex-direction:column;gap:.75rem}.yst-root .yst-checkbox-group__description{margin-bottom:1rem;margin-top:-.5rem}.yst-root .yst-feature-upsell{position:relative}.yst-root .yst-feature-upsell--default{--tw-grayscale:grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.yst-root .yst-feature-upsell--card{padding:1.5rem}.yst-root .yst-file-import>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2rem*var(--tw-space-y-reverse));margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-file-import__feedback{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);padding:1rem}.yst-root .yst-file-import__feedback-header{align-items:flex-start;display:flex}.yst-root .yst-file-import__feedback-header>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-left:calc(1rem*var(--tw-space-x-reverse))}.yst-root .yst-file-import__feedback-figure{--tw-bg-opacity:1;align-items:center;background-color:rgb(243 229 237/var(--tw-bg-opacity));border-radius:9999px;display:flex;height:2rem;justify-content:center;width:2rem}.yst-root .yst-file-import__feedback-figure>svg{--tw-text-opacity:1;color:rgb(166 30 105/var(--tw-text-opacity));height:1.25rem;width:1.25rem}.yst-root .yst-file-import__feedback-title{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));display:block;font-weight:500;margin-bottom:.125rem;overflow-wrap:break-word}.yst-root .yst-file-import__feedback-description{display:block;font-size:.75rem;font-weight:500}.yst-root .yst-file-import__abort-button{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(241 245 249/var(--tw-bg-opacity));border-radius:9999px;color:rgb(100 116 139/var(--tw-text-opacity));display:inline-flex;flex-shrink:0;height:1.25rem;justify-content:center;width:1.25rem}.yst-root .yst-file-import__abort-button:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(71 85 105/var(--tw-text-opacity))}.yst-root .yst-file-import__abort-button:focus{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-file-import__abort-button>svg{height:.75rem;width:.75rem}.yst-root .yst-file-import__abort-button>svg>path{stroke-width:3}.yst-root .yst-modal{bottom:0;right:0;padding:1rem;position:fixed;left:0;top:0;z-index:10}@media (min-width:640px){.yst-root .yst-modal{padding:2rem}}@media (min-width:768px){.yst-root .yst-modal{padding:5rem}}.yst-root .yst-modal__layout{display:flex;min-height:100%}.yst-root .yst-modal--center .yst-modal__layout{align-items:center;justify-content:center}.yst-root .yst-modal--top-center .yst-modal__layout{align-items:flex-start;justify-content:center}.yst-root .yst-modal__overlay{--tw-bg-opacity:0.75;background-color:rgb(100 116 139/var(--tw-bg-opacity));bottom:0;right:0;position:fixed;left:0;top:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.yst-root .yst-modal__panel{--tw-bg-opacity:1;--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);max-width:36rem;overflow:hidden;padding:1.5rem;position:relative;width:100%}.yst-root .yst-modal__close{display:block;position:absolute;left:1rem;top:1rem}.yst-root .yst-modal__close-button{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;color:rgb(148 163 184/var(--tw-text-opacity));position:relative;z-index:10}.yst-root .yst-modal__close-button:hover{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.yst-root .yst-modal__close-button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-modal__container{display:flex;flex-direction:column;max-height:calc(100vh - 2rem)}@media (min-width:640px){.yst-root .yst-modal__container{max-height:calc(100vh - 4rem)}}@media (min-width:768px){.yst-root .yst-modal__container{max-height:calc(100vh - 10rem)}}.yst-root .yst-modal__panel .yst-modal__container{max-height:calc(100vh - 5rem)}@media (min-width:640px){.yst-root .yst-modal__panel .yst-modal__container{max-height:calc(100vh - 7rem)}}@media (min-width:768px){.yst-root .yst-modal__panel .yst-modal__container{max-height:calc(100vh - 13rem)}}.yst-root .yst-modal__container-footer,.yst-root .yst-modal__container-header{flex-shrink:0}.yst-root .yst-modal__container-content{overflow:auto}.yst-root .yst-modal__panel .yst-modal__container-content{margin-right:-1.5rem;margin-left:-1.5rem;padding-right:1.5rem;padding-left:1.5rem}.yst-root .yst-notifications{display:flex;flex-direction:column;max-height:calc(100vh - 4rem);max-width:calc(100vw - 4rem);pointer-events:none;position:fixed;width:100%;z-index:20}.yst-root .yst-notifications>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-notifications--bottom-center{align-items:center;bottom:2rem}.yst-root .yst-notifications--bottom-left{bottom:2rem;right:2rem}.yst-root .yst-notifications--top-center{align-items:center;top:2rem}.yst-root .yst-notification--large{width:24rem}.yst-root .yst-notification__icon{height:1.25rem;width:1.25rem}.yst-root .yst-pagination{display:inline-flex;isolation:isolate}.yst-root .yst-pagination>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1px*(1 - var(--tw-space-x-reverse)));margin-left:calc(-1px*var(--tw-space-x-reverse))}.yst-root .yst-pagination{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.yst-root .yst-pagination-display__text{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(100 116 139/var(--tw-text-opacity));font-weight:400;padding:.5rem .75rem}.yst-root .yst-pagination-display__current-text{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity));font-weight:600}.yst-root .yst-pagination-display__truncated{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity));align-self:center;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(100 116 139/var(--tw-text-opacity));display:inline-flex;font-size:.8125rem;font-weight:600;padding:.5rem 1rem}.yst-root .yst-pagination__button{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));align-items:center;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(148 163 184/var(--tw-text-opacity));display:inline-flex;padding:.5rem;position:relative}.yst-root .yst-pagination__button:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.yst-root .yst-pagination__button:focus{outline-color:#a61e69;outline-offset:0;z-index:20}.yst-root .yst-pagination__button--active{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);background-color:rgb(166 30 105/var(--tw-bg-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(255 255 255/var(--tw-text-opacity));font-size:.8125rem;font-weight:600;z-index:10}.yst-root .yst-pagination__button--active:hover{--tw-bg-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity))}.yst-root .yst-pagination__button--active:focus{z-index:20}.yst-root .yst-pagination__button--active:focus-visible{border-radius:.125rem;outline-color:#a61e69;outline-offset:2px;outline-style:solid;outline-width:2px}.yst-root .yst-pagination__button--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-pagination__button--disabled:hover{background-color:initial}.yst-root .yst-pagination__button--disabled:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-radio-group--inline-block .yst-radio-group__options{display:flex;flex-direction:row;flex-wrap:wrap;gap:.5rem}.yst-root .yst-radio-group--disabled .yst-radio-group__description,.yst-root .yst-radio-group--disabled .yst-radio-group__label{opacity:.5}.yst-root .yst-radio-group--disabled .yst-radio-group__label{cursor:not-allowed}.yst-root .yst-radio-group__label{margin-bottom:.5rem}.yst-root .yst-radio-group__options{display:flex;flex-direction:column;gap:.5rem}.yst-root .yst-radio-group__description{margin-bottom:1rem;margin-top:-.5rem}.yst-root .yst-select-field--disabled .yst-select-field__description,.yst-root .yst-select-field--disabled .yst-select-field__label{cursor:not-allowed;opacity:.5}.yst-root .yst-select-field__options{display:flex;flex-direction:column;gap:.75rem}.yst-root .yst-select-field__description,.yst-root .yst-select-field__validation{margin-top:.5rem}.yst-root .yst-mobile-navigation__top{position:sticky;top:0;width:100%;z-index:50}.yst-root .yst-mobile-navigation__dialog{bottom:0;display:flex;right:0;position:fixed;left:0;top:0;z-index:50}.yst-root .yst-tag-field--disabled .yst-tag-field__description,.yst-root .yst-tag-field--disabled .yst-tag-field__label{cursor:not-allowed;opacity:.5}.yst-root .yst-tag-field__description,.yst-root .yst-tag-field__validation{margin-top:.5rem}.yst-root .yst-text-field--disabled .yst-text-field__description,.yst-root .yst-text-field--disabled .yst-text-field__label{opacity:.5}.yst-root .yst-text-field--disabled .yst-text-field__label{cursor:not-allowed}.yst-root .yst-text-field--read-only .yst-text-field__label{cursor:default}.yst-root .yst-text-field__description,.yst-root .yst-text-field__validation{margin-top:.5rem}.yst-root .yst-textarea-field--disabled .yst-textarea-field__description,.yst-root .yst-textarea-field--disabled .yst-textarea-field__label{opacity:.5}.yst-root .yst-textarea-field--disabled .yst-textarea-field__label{cursor:not-allowed}.yst-root .yst-text-field--read-only .yst-textarea-field__label{cursor:default}.yst-root .yst-textarea-field__description,.yst-root .yst-textarea-field__validation{margin-top:.5rem}.yst-root .yst-toggle-field{display:flex;flex-direction:column;gap:.25rem}.yst-root .yst-toggle-field--disabled .yst-toggle-field__description,.yst-root .yst-toggle-field--disabled .yst-toggle-field__label-wrapper{opacity:.5}.yst-root .yst-toggle-field--disabled .yst-toggle-field__description,.yst-root .yst-toggle-field--disabled .yst-toggle-field__label,.yst-root .yst-toggle-field--disabled .yst-toggle-field__label-wrapper{cursor:not-allowed}.yst-root .yst-toggle-field__header{align-items:center;display:flex;flex-direction:row;gap:1.5rem;justify-content:space-between}.yst-root .yst-toggle-field__label-wrapper{align-items:center;display:flex;gap:.25rem}.yst-root .yst-toggle-field__description{margin-left:4.25rem}.yst-sr-only{clip:rect(0,0,0,0)!important;border-width:0!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.yst-pointer-events-none{pointer-events:none!important}.yst-invisible{visibility:hidden!important}.yst-fixed{position:fixed!important}.yst-absolute{position:absolute!important}.yst-relative{position:relative!important}.yst-sticky{position:sticky!important}.yst-inset-0{bottom:0!important;top:0!important}.yst-inset-0,.yst-inset-x-0{right:0!important;left:0!important}.yst-inset-y-0{bottom:0!important;top:0!important}.yst--left-3{right:-.75rem!important}.yst-top-0{top:0!important}.yst-right-0{left:0!important}.yst-bottom-12{bottom:3rem!important}.yst-top-2{top:.5rem!important}.yst-right-2{left:.5rem!important}.yst-bottom-0{bottom:0!important}.yst-top-1\/2{top:50%!important}.yst--right-\[6\.5px\]{left:-6.5px!important}.yst--top-\[6\.5px\]{top:-6.5px!important}.yst-left-4{right:1rem!important}.yst--bottom-6{bottom:-1.5rem!important}.yst-top-8{top:2rem!important}.yst-top-3\.5{top:.875rem!important}.yst-top-3{top:.75rem!important}.yst-left-0{right:0!important}.yst-z-30{z-index:30!important}.yst-z-40{z-index:40!important}.yst-z-10{z-index:10!important}.yst-z-20{z-index:20!important}.yst-order-last{order:9999!important}.yst-col-span-1{grid-column:span 1/span 1!important}.yst-m-0{margin:0!important}.yst--m-\[16px\]{margin:-16px!important}.yst--m-6{margin:-1.5rem!important}.yst-my-auto{margin-bottom:auto!important;margin-top:auto!important}.yst-mx-auto{margin-right:auto!important;margin-left:auto!important}.yst-my-4{margin-bottom:1rem!important;margin-top:1rem!important}.yst-my-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.yst-my-6{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.yst-my-12{margin-bottom:3rem!important;margin-top:3rem!important}.yst-my-3{margin-bottom:.75rem!important;margin-top:.75rem!important}.yst-my-8{margin-bottom:2rem!important;margin-top:2rem!important}.yst--mx-6{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.yst-mx-1\.5{margin-right:.375rem!important;margin-left:.375rem!important}.yst-mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.yst-mx-0{margin-right:0!important;margin-left:0!important}.yst-mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.yst-my-0{margin-bottom:0!important;margin-top:0!important}.yst-my-16{margin-bottom:4rem!important;margin-top:4rem!important}.yst--ml-1{margin-right:-.25rem!important}.yst-mt-6{margin-top:1.5rem!important}.yst-mt-1\.5{margin-top:.375rem!important}.yst-mt-1{margin-top:.25rem!important}.yst-ml-8{margin-right:2rem!important}.yst--mr-14{margin-left:-3.5rem!important}.yst-mb-2{margin-bottom:.5rem!important}.yst-mr-4{margin-left:1rem!important}.yst-mr-2{margin-left:.5rem!important}.yst-mb-px{margin-bottom:1px!important}.yst-ml-4{margin-right:1rem!important}.yst-mb-16{margin-bottom:4rem!important}.yst-mt-auto{margin-top:auto!important}.yst-ml-3{margin-right:.75rem!important}.yst-mr-1{margin-left:.25rem!important}.yst-mr-5{margin-left:1.25rem!important}.yst-mb-8{margin-bottom:2rem!important}.yst-mt-3{margin-top:.75rem!important}.yst-ml-1{margin-right:.25rem!important}.yst--mr-1{margin-left:-.25rem!important}.yst--mb-\[1em\]{margin-bottom:-1em!important}.yst--ml-0\.5{margin-right:-.125rem!important}.yst--ml-0{margin-right:0!important}.yst-ml-auto{margin-right:auto!important}.yst-mt-2{margin-top:.5rem!important}.yst-mt-4{margin-top:1rem!important}.yst-mb-5{margin-bottom:1.25rem!important}.yst-mb-6{margin-bottom:1.5rem!important}.yst-mt-8{margin-top:2rem!important}.yst-mt-12{margin-top:3rem!important}.yst-mb-3{margin-bottom:.75rem!important}.yst-ml-1\.5{margin-right:.375rem!important}.yst-mr-6{margin-left:1.5rem!important}.yst--ml-px{margin-right:-1px!important}.yst-ml-12{margin-right:3rem!important}.yst-mb-0{margin-bottom:0!important}.yst--mt-6{margin-top:-1.5rem!important}.yst-mb-4{margin-bottom:1rem!important}.yst-ml-2{margin-right:.5rem!important}.yst-mr-3{margin-left:.75rem!important}.yst-mt-7{margin-top:1.75rem!important}.yst-mt-10{margin-top:2.5rem!important}.yst-mt-\[-2\.6rem\]{margin-top:-2.6rem!important}.yst-mt-\[18px\]{margin-top:18px!important}.yst-mb-1{margin-bottom:.25rem!important}.yst-mr-8{margin-left:2rem!important}.yst--mt-4{margin-top:-1rem!important}.yst-mb-24{margin-bottom:6rem!important}.yst-mt-\[27\.5px\]{margin-top:27.5px!important}.yst-mt-5{margin-top:1.25rem!important}.yst-mt-0{margin-top:0!important}.yst-block{display:block!important}.yst-inline-block{display:inline-block!important}.yst-inline{display:inline!important}.yst-flex{display:flex!important}.yst-inline-flex{display:inline-flex!important}.yst-grid{display:grid!important}.yst-hidden{display:none!important}.yst-h-5{height:1.25rem!important}.yst-h-6{height:1.5rem!important}.yst-h-4{height:1rem!important}.yst-h-12{height:3rem!important}.yst-h-0{height:0!important}.yst-h-full{height:100%!important}.yst-h-16{height:4rem!important}.yst-h-7{height:1.75rem!important}.yst-h-3{height:.75rem!important}.yst-h-8{height:2rem!important}.yst-h-\[90vh\]{height:90vh!important}.yst-h-4\/5{height:80%!important}.yst-h-20{height:5rem!important}.yst-h-\[120px\]{height:120px!important}.yst-h-auto{height:auto!important}.yst-h-9{height:2.25rem!important}.yst-h-2\.5{height:.625rem!important}.yst-h-2{height:.5rem!important}.yst-h-24{height:6rem!important}.yst-h-48{height:12rem!important}.yst-h-96{height:24rem!important}.yst-h-\[45px\]{height:45px!important}.yst-h-14{height:3.5rem!important}.yst-h-28{height:7rem!important}.yst-max-h-\[calc\(90vh-10rem\)\]{max-height:calc(90vh - 10rem)!important}.yst-max-h-60{max-height:15rem!important}.yst-min-h-full{min-height:100%!important}.yst-w-5{width:1.25rem!important}.yst-w-6{width:1.5rem!important}.yst-w-0{width:0!important}.yst-w-full{width:100%!important}.yst-w-4{width:1rem!important}.yst-w-12{width:3rem!important}.yst-w-2{width:.5rem!important}.yst-w-3{width:.75rem!important}.yst-w-8{width:2rem!important}.yst-w-\[350px\]{width:350px!important}.yst-w-20{width:5rem!important}.yst-w-\[150px\]{width:150px!important}.yst-w-\[3px\]{width:3px!important}.yst-w-40{width:10rem!important}.yst-w-56{width:14rem!important}.yst-w-2\.5{width:.625rem!important}.yst-w-0\.5{width:.125rem!important}.yst-w-48{width:12rem!important}.yst-w-96{width:24rem!important}.yst-w-3\/5{width:60%!important}.yst-w-16{width:4rem!important}.yst-w-14{width:3.5rem!important}.yst-w-\[463px\]{width:463px!important}.yst-w-24{width:6rem!important}.yst-min-w-full{min-width:100%!important}.yst-min-w-0{min-width:0!important}.yst-max-w-xs{max-width:20rem!important}.yst-max-w-sm{max-width:24rem!important}.yst-max-w-screen-sm{max-width:640px!important}.yst-max-w-6xl{max-width:72rem!important}.yst-max-w-lg{max-width:32rem!important}.yst-max-w-\[715px\]{max-width:715px!important}.yst-max-w-none{max-width:none!important}.yst-max-w-full{max-width:100%!important}.yst-max-w-5xl{max-width:64rem!important}.yst-max-w-2xl{max-width:42rem!important}.yst-max-w-\[500px\]{max-width:500px!important}.yst-flex-1{flex:1 1 0%!important}.yst-flex-none{flex:none!important}.yst-flex-shrink-0,.yst-shrink-0{flex-shrink:0!important}.yst-flex-grow,.yst-grow{flex-grow:1!important}.yst-origin-top{transform-origin:top!important}.yst-translate-y-4{--tw-translate-y:1rem!important}.yst-translate-y-0,.yst-translate-y-4{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst-translate-y-0{--tw-translate-y:0px!important}.yst-translate-y-full{--tw-translate-y:100%!important}.yst--translate-y-full,.yst-translate-y-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst--translate-y-full{--tw-translate-y:-100%!important}.yst-scale-95{--tw-scale-x:.95!important;--tw-scale-y:.95!important}.yst-scale-100,.yst-scale-95{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst-scale-100{--tw-scale-x:1!important;--tw-scale-y:1!important}.yst-scale-y-0{--tw-scale-y:0!important}.yst-scale-y-0,.yst-transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}@keyframes yst-spin{to{transform:rotate(-1turn)}}.yst-animate-spin{animation:yst-spin 1s linear infinite!important}.yst-cursor-wait{cursor:wait!important}.yst-cursor-not-allowed{cursor:not-allowed!important}.yst-cursor-default{cursor:default!important}.yst-select-none{-webkit-user-select:none!important;user-select:none!important}.yst-scroll-pt-11{scroll-padding-top:2.75rem!important}.yst-scroll-pb-2{scroll-padding-bottom:.5rem!important}.yst-list-outside{list-style-position:outside!important}.yst-list-disc{list-style-type:disc!important}.yst-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}.yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.yst-flex-row{flex-direction:row!important}.yst-flex-col{flex-direction:column!important}.yst-flex-wrap{flex-wrap:wrap!important}.yst-content-between{align-content:space-between!important}.yst-items-start{align-items:flex-start!important}.yst-items-center{align-items:center!important}.yst-justify-center{justify-content:center!important}.yst-justify-between{justify-content:space-between!important}.yst-gap-2{gap:.5rem!important}.yst-gap-3{gap:.75rem!important}.yst-gap-8{gap:2rem!important}.yst-gap-6{gap:1.5rem!important}.yst-gap-1\.5{gap:.375rem!important}.yst-gap-1{gap:.25rem!important}.yst-gap-4{gap:1rem!important}.yst-gap-x-6{column-gap:1.5rem!important}.yst-gap-y-2{row-gap:.5rem!important}.yst-gap-x-4{column-gap:1rem!important}.yst-space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-right:calc(2rem*(1 - var(--tw-space-x-reverse)))!important;margin-left:calc(2rem*var(--tw-space-x-reverse))!important}.yst-space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))!important;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(2rem*var(--tw-space-y-reverse))!important;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.25rem*var(--tw-space-y-reverse))!important;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-right:calc(.5rem*(1 - var(--tw-space-x-reverse)))!important;margin-left:calc(.5rem*var(--tw-space-x-reverse))!important}.yst-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.75rem*var(--tw-space-y-reverse))!important;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-right:calc(.75rem*(1 - var(--tw-space-x-reverse)))!important;margin-left:calc(.75rem*var(--tw-space-x-reverse))!important}.yst-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.5rem*var(--tw-space-y-reverse))!important;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(1rem*var(--tw-space-y-reverse))!important;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))!important}.yst-divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0!important;border-bottom-width:calc(1px*var(--tw-divide-y-reverse))!important;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))!important}.yst-divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1!important;border-color:rgb(229 231 235/var(--tw-divide-opacity))!important}.yst-divide-slate-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1!important;border-color:rgb(203 213 225/var(--tw-divide-opacity))!important}.yst-self-start{align-self:flex-start!important}.yst-self-end{align-self:flex-end!important}.yst-self-center{align-self:center!important}.yst-overflow-auto{overflow:auto!important}.yst-overflow-hidden{overflow:hidden!important}.yst-overflow-y-auto{overflow-y:auto!important}.yst-overflow-x-scroll{overflow-x:scroll!important}.yst-truncate{overflow:hidden!important;white-space:nowrap!important}.yst-overflow-ellipsis,.yst-text-ellipsis,.yst-truncate{text-overflow:ellipsis!important}.yst-whitespace-nowrap{white-space:nowrap!important}.yst-whitespace-pre-line{white-space:pre-line!important}.yst-rounded-md{border-radius:.375rem!important}.yst-rounded-full{border-radius:9999px!important}.yst-rounded-lg{border-radius:.5rem!important}.yst-rounded-3xl{border-radius:1.5rem!important}.yst-rounded-none{border-radius:0!important}.yst-rounded-xl{border-radius:.75rem!important}.yst-rounded-l-md{border-bottom-right-radius:.375rem!important;border-top-right-radius:.375rem!important}.yst-rounded-r-md{border-bottom-left-radius:.375rem!important;border-top-left-radius:.375rem!important}.yst-rounded-t-lg{border-top-right-radius:.5rem!important;border-top-left-radius:.5rem!important}.yst-rounded-b-lg{border-bottom-right-radius:.5rem!important;border-bottom-left-radius:.5rem!important}.yst-rounded-br-none{border-bottom-left-radius:0!important}.yst-border{border-width:1px!important}.yst-border-2{border-width:2px!important}.yst-border-0{border-width:0!important}.yst-border-y{border-bottom-width:1px!important;border-top-width:1px!important}.yst-border-x-0{border-right-width:0!important;border-left-width:0!important}.yst-border-l{border-right-width:1px!important}.yst-border-b{border-bottom-width:1px!important}.yst-border-r{border-left-width:1px!important}.yst-border-t,.yst-border-t-\[1px\]{border-top-width:1px!important}.yst-border-solid{border-style:solid!important}.yst-border-dashed{border-style:dashed!important}.yst-border-none{border-style:none!important}.yst-border-slate-200{--tw-border-opacity:1!important;border-color:rgb(226 232 240/var(--tw-border-opacity))!important}.yst-border-transparent{border-color:#0000!important}.yst-border-white{--tw-border-opacity:1!important;border-color:rgb(255 255 255/var(--tw-border-opacity))!important}.yst-border-amber-300{--tw-border-opacity:1!important;border-color:rgb(252 211 77/var(--tw-border-opacity))!important}.yst-border-slate-300{--tw-border-opacity:1!important;border-color:rgb(203 213 225/var(--tw-border-opacity))!important}.yst-border-primary-500{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important}.yst-border-slate-100{--tw-border-opacity:1!important;border-color:rgb(241 245 249/var(--tw-border-opacity))!important}.yst-border-primary-300{--tw-border-opacity:1!important;border-color:rgb(205 130 171/var(--tw-border-opacity))!important}.yst-border-red-300{--tw-border-opacity:1!important;border-color:rgb(252 165 165/var(--tw-border-opacity))!important}.yst-border-red-500{--tw-border-opacity:1!important;border-color:rgb(239 68 68/var(--tw-border-opacity))!important}.yst-border-emerald-600{--tw-border-opacity:1!important;border-color:rgb(5 150 105/var(--tw-border-opacity))!important}.yst-border-r-slate-200{--tw-border-opacity:1!important;border-left-color:rgb(226 232 240/var(--tw-border-opacity))!important}.yst-border-t-\[rgb\(0\,0\,0\,0\.2\)\]{border-top-color:#0003!important}.yst-bg-slate-600{--tw-bg-opacity:1!important;background-color:rgb(71 85 105/var(--tw-bg-opacity))!important}.yst-bg-slate-100{--tw-bg-opacity:1!important;background-color:rgb(241 245 249/var(--tw-bg-opacity))!important}.yst-bg-white{--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.yst-bg-slate-200{--tw-bg-opacity:1!important;background-color:rgb(226 232 240/var(--tw-bg-opacity))!important}.yst-bg-slate-50{--tw-bg-opacity:1!important;background-color:rgb(248 250 252/var(--tw-bg-opacity))!important}.yst-bg-transparent{background-color:initial!important}.yst-bg-green-100{--tw-bg-opacity:1!important;background-color:rgb(220 252 231/var(--tw-bg-opacity))!important}.yst-bg-primary-500{--tw-bg-opacity:1!important;background-color:rgb(166 30 105/var(--tw-bg-opacity))!important}.yst-bg-black{--tw-bg-opacity:1!important;background-color:rgb(0 0 0/var(--tw-bg-opacity))!important}.yst-bg-slate-300{--tw-bg-opacity:1!important;background-color:rgb(203 213 225/var(--tw-bg-opacity))!important}.yst-bg-red-100{--tw-bg-opacity:1!important;background-color:rgb(254 226 226/var(--tw-bg-opacity))!important}.yst-bg-primary-600{--tw-bg-opacity:1!important;background-color:rgb(154 22 96/var(--tw-bg-opacity))!important}.yst-bg-blue-100{--tw-bg-opacity:1!important;background-color:rgb(219 234 254/var(--tw-bg-opacity))!important}.yst-bg-yellow-100{--tw-bg-opacity:1!important;background-color:rgb(254 249 195/var(--tw-bg-opacity))!important}.yst-bg-primary-200{--tw-bg-opacity:1!important;background-color:rgb(224 179 204/var(--tw-bg-opacity))!important}.yst-bg-opacity-75{--tw-bg-opacity:0.75!important}.yst-stroke-3{stroke-width:3px!important}.yst-stroke-1{stroke-width:1!important}.yst-object-contain{object-fit:contain!important}.yst-object-cover{object-fit:cover!important}.yst-object-center{object-position:center!important}.yst-p-1{padding:.25rem!important}.yst-p-6{padding:1.5rem!important}.yst-p-4{padding:1rem!important}.yst-p-8{padding:2rem!important}.yst-p-0{padding:0!important}.yst-p-2\.5{padding:.625rem!important}.yst-p-2{padding:.5rem!important}.yst-p-3{padding:.75rem!important}.yst-px-4{padding-right:1rem!important;padding-left:1rem!important}.yst-px-3{padding-right:.75rem!important;padding-left:.75rem!important}.yst-py-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.yst-py-6{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.yst-px-2{padding-right:.5rem!important;padding-left:.5rem!important}.yst-py-4{padding-bottom:1rem!important;padding-top:1rem!important}.yst-px-6{padding-right:1.5rem!important;padding-left:1.5rem!important}.yst-py-3{padding-bottom:.75rem!important;padding-top:.75rem!important}.yst-px-2\.5{padding-right:.625rem!important;padding-left:.625rem!important}.yst-py-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.yst-px-0\.5{padding-right:.125rem!important;padding-left:.125rem!important}.yst-px-0{padding-right:0!important;padding-left:0!important}.yst-px-\[3px\]{padding-right:3px!important;padding-left:3px!important}.yst-py-\[3px\]{padding-bottom:3px!important;padding-top:3px!important}.yst-px-8{padding-right:2rem!important;padding-left:2rem!important}.yst-py-12{padding-bottom:3rem!important;padding-top:3rem!important}.yst-py-1\.5{padding-bottom:.375rem!important;padding-top:.375rem!important}.yst-px-11{padding-right:2.75rem!important;padding-left:2.75rem!important}.yst-px-10{padding-right:2.5rem!important;padding-left:2.5rem!important}.yst-pb-10{padding-bottom:2.5rem!important}.yst-pb-1{padding-bottom:.25rem!important}.yst-pt-1{padding-top:.25rem!important}.yst-pt-4{padding-top:1rem!important}.yst-pb-4{padding-bottom:1rem!important}.yst-pr-4{padding-left:1rem!important}.yst-pl-6{padding-right:1.5rem!important}.yst-pt-2{padding-top:.5rem!important}.yst-pl-\[1em\]{padding-right:1em!important}.yst-pb-6{padding-bottom:1.5rem!important}.yst-pb-8{padding-bottom:2rem!important}.yst-pt-6{padding-top:1.5rem!important}.yst-pl-2{padding-right:.5rem!important}.yst-pr-3{padding-left:.75rem!important}.yst-pb-2{padding-bottom:.5rem!important}.yst-pt-10{padding-top:2.5rem!important}.yst-pt-\[56\.25\%\]{padding-top:56.25%!important}.yst-pl-3{padding-right:.75rem!important}.yst-pr-2{padding-left:.5rem!important}.yst-pl-0{padding-right:0!important}.yst-pr-10{padding-left:2.5rem!important}.yst-pr-9{padding-left:2.25rem!important}.yst-text-left{text-align:right!important}.yst-text-center{text-align:center!important}.yst-align-middle{vertical-align:middle!important}.yst-font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.yst-font-wp{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important}.yst-text-sm{font-size:.8125rem!important}.yst-text-4xl{font-size:2.25rem!important}.yst-text-2xl{font-size:1.5rem!important}.yst-text-base{font-size:1rem!important}.yst-text-tiny{font-size:.875rem!important}.yst-text-lg{font-size:1.125rem!important}.yst-text-xs{font-size:.75rem!important}.yst-text-xl{font-size:1.25rem!important}.yst-text-\[10px\]{font-size:10px!important}.yst-text-xxs{font-size:.675rem!important}.yst-font-medium{font-weight:500!important}.yst-font-semibold{font-weight:600!important}.yst-font-extrabold{font-weight:800!important}.yst-font-bold{font-weight:700!important}.yst-font-\[650\]{font-weight:650!important}.yst-font-light{font-weight:300!important}.yst-font-normal{font-weight:400!important}.yst-uppercase{text-transform:uppercase!important}.yst-italic{font-style:italic!important}.yst-leading-10{line-height:2.5rem!important}.yst-leading-6{line-height:1.5rem!important}.yst-leading-8{line-height:2rem!important}.yst-leading-5{line-height:1.25rem!important}.yst-leading-normal{line-height:1.5!important}.yst-leading-\[normal\]{line-height:normal!important}.yst-leading-tight{line-height:1.25!important}.yst-leading-4{line-height:1rem!important}.yst-tracking-tight{letter-spacing:-.025em!important}.yst-tracking-wide{letter-spacing:.025em!important}.yst-text-slate-800{--tw-text-opacity:1!important;color:rgb(30 41 59/var(--tw-text-opacity))!important}.yst-text-slate-400{--tw-text-opacity:1!important;color:rgb(148 163 184/var(--tw-text-opacity))!important}.yst-text-white{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.yst-text-slate-500{--tw-text-opacity:1!important;color:rgb(100 116 139/var(--tw-text-opacity))!important}.yst-text-slate-900{--tw-text-opacity:1!important;color:rgb(15 23 42/var(--tw-text-opacity))!important}.yst-text-slate-600{--tw-text-opacity:1!important;color:rgb(71 85 105/var(--tw-text-opacity))!important}.yst-text-primary-500{--tw-text-opacity:1!important;color:rgb(166 30 105/var(--tw-text-opacity))!important}.yst-text-gray-900{--tw-text-opacity:1!important;color:rgb(17 24 39/var(--tw-text-opacity))!important}.yst-text-gray-500{--tw-text-opacity:1!important;color:rgb(107 114 128/var(--tw-text-opacity))!important}.yst-text-green-600{--tw-text-opacity:1!important;color:rgb(22 163 74/var(--tw-text-opacity))!important}.yst-text-gray-400{--tw-text-opacity:1!important;color:rgb(156 163 175/var(--tw-text-opacity))!important}.yst-text-indigo-600{--tw-text-opacity:1!important;color:rgb(79 70 229/var(--tw-text-opacity))!important}.yst-text-\[\#555\]{--tw-text-opacity:1!important;color:rgb(85 85 85/var(--tw-text-opacity))!important}.yst-text-amber-300{--tw-text-opacity:1!important;color:rgb(252 211 77/var(--tw-text-opacity))!important}.yst-text-slate-700{--tw-text-opacity:1!important;color:rgb(51 65 85/var(--tw-text-opacity))!important}.yst-text-red-500{--tw-text-opacity:1!important;color:rgb(239 68 68/var(--tw-text-opacity))!important}.yst-text-green-400{--tw-text-opacity:1!important;color:rgb(74 222 128/var(--tw-text-opacity))!important}.yst-text-\[\#111827\]{--tw-text-opacity:1!important;color:rgb(17 24 39/var(--tw-text-opacity))!important}.yst-text-yellow-900{--tw-text-opacity:1!important;color:rgb(113 63 18/var(--tw-text-opacity))!important}.yst-text-amber-500{--tw-text-opacity:1!important;color:rgb(245 158 11/var(--tw-text-opacity))!important}.yst-text-amber-900{--tw-text-opacity:1!important;color:rgb(120 53 15/var(--tw-text-opacity))!important}.yst-text-red-600{--tw-text-opacity:1!important;color:rgb(220 38 38/var(--tw-text-opacity))!important}.yst-text-blue-500{--tw-text-opacity:1!important;color:rgb(59 130 246/var(--tw-text-opacity))!important}.yst-text-blue-800{--tw-text-opacity:1!important;color:rgb(30 64 175/var(--tw-text-opacity))!important}.yst-text-yellow-500{--tw-text-opacity:1!important;color:rgb(234 179 8/var(--tw-text-opacity))!important}.yst-text-yellow-800{--tw-text-opacity:1!important;color:rgb(133 77 14/var(--tw-text-opacity))!important}.yst-text-red-800{--tw-text-opacity:1!important;color:rgb(153 27 27/var(--tw-text-opacity))!important}.yst-text-emerald-600{--tw-text-opacity:1!important;color:rgb(5 150 105/var(--tw-text-opacity))!important}.yst-text-green-800{--tw-text-opacity:1!important;color:rgb(22 101 52/var(--tw-text-opacity))!important}.yst-text-red-900{--tw-text-opacity:1!important;color:rgb(127 29 29/var(--tw-text-opacity))!important}.yst-underline{-webkit-text-decoration-line:underline!important;text-decoration-line:underline!important}.yst-line-through{-webkit-text-decoration-line:line-through!important;text-decoration-line:line-through!important}.yst-no-underline{-webkit-text-decoration-line:none!important;text-decoration-line:none!important}.yst-subpixel-antialiased{-webkit-font-smoothing:auto!important;-moz-osx-font-smoothing:auto!important}.yst-placeholder-slate-500::placeholder{--tw-placeholder-opacity:1!important;color:rgb(100 116 139/var(--tw-placeholder-opacity))!important}.yst-opacity-0{opacity:0!important}.yst-opacity-100{opacity:1!important}.yst-opacity-25{opacity:.25!important}.yst-opacity-75{opacity:.75!important}.yst-opacity-50{opacity:.5!important}.yst-shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a!important;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)!important}.yst-shadow,.yst-shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.yst-shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a!important;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)!important}.yst-shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a!important;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)!important}.yst-shadow-md,.yst-shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.yst-shadow-xl{--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a!important;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)!important}.yst-shadow-none{--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important}.yst-shadow-none,.yst-shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.yst-shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d!important;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)!important}.yst-shadow-amber-700\/30{--tw-shadow-color:#b453094d!important;--tw-shadow:var(--tw-shadow-colored)!important}.yst-outline-none{outline:2px solid #0000!important;outline-offset:2px!important}.yst-ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.yst-ring-gray-200{--tw-ring-opacity:1!important;--tw-ring-color:rgb(229 231 235/var(--tw-ring-opacity))!important}.yst-ring-black{--tw-ring-opacity:1!important;--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity))!important}.yst-ring-opacity-5{--tw-ring-opacity:0.05!important}.yst-ring-offset-2{--tw-ring-offset-width:2px!important}.yst-ring-offset-primary-500{--tw-ring-offset-color:#a61e69!important}.yst-drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px #00000012) drop-shadow(0 2px 2px #0000000f)!important}.yst-drop-shadow-md,.yst-grayscale{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.yst-grayscale{--tw-grayscale:grayscale(100%)!important}.yst-filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.yst-transition-opacity{transition-duration:.15s!important;transition-property:opacity!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition{transition-duration:.15s!important;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-all{transition-duration:.15s!important;transition-property:all!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-colors{transition-duration:.15s!important;transition-property:color,background-color,border-color,fill,stroke,-webkit-text-decoration-color!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,-webkit-text-decoration-color!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-transform{transition-duration:.15s!important;transition-property:transform!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-\[width\]{transition-duration:.15s!important;transition-property:width!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-delay-200{transition-delay:.2s!important}.yst-delay-\[900ms\]{transition-delay:.9s!important}.yst-delay-100{transition-delay:.1s!important}.yst-duration-1000{transition-duration:1s!important}.yst-duration-200{transition-duration:.2s!important}.yst-duration-300{transition-duration:.3s!important}.yst-duration-100{transition-duration:.1s!important}.yst-duration-75{transition-duration:75ms!important}.yst-duration-150{transition-duration:.15s!important}.yst-duration-500{transition-duration:.5s!important}.yst-ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)!important}.yst-ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)!important}.yst-ease-linear{transition-timing-function:linear!important}.odd\:yst-bg-white:nth-child(odd){--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.even\:yst-bg-slate-50:nth-child(2n){--tw-bg-opacity:1!important;background-color:rgb(248 250 252/var(--tw-bg-opacity))!important}.focus-within\:yst-border-primary-500:focus-within{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important}.focus-within\:yst-outline-none:focus-within{outline:2px solid #0000!important;outline-offset:2px!important}.focus-within\:yst-ring-1:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.focus-within\:yst-ring-primary-500:focus-within{--tw-ring-opacity:1!important;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))!important}.hover\:yst-bg-slate-50:hover{--tw-bg-opacity:1!important;background-color:rgb(248 250 252/var(--tw-bg-opacity))!important}.hover\:yst-bg-gray-50:hover{--tw-bg-opacity:1!important;background-color:rgb(249 250 251/var(--tw-bg-opacity))!important}.hover\:yst-bg-\[\#f0f0f0\]:hover{--tw-bg-opacity:1!important;background-color:rgb(240 240 240/var(--tw-bg-opacity))!important}.hover\:yst-bg-white:hover{--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.hover\:yst-bg-primary-600:hover{--tw-bg-opacity:1!important;background-color:rgb(154 22 96/var(--tw-bg-opacity))!important}.hover\:yst-text-slate-900:hover{--tw-text-opacity:1!important;color:rgb(15 23 42/var(--tw-text-opacity))!important}.hover\:yst-text-slate-500:hover{--tw-text-opacity:1!important;color:rgb(100 116 139/var(--tw-text-opacity))!important}.hover\:yst-text-slate-800:hover{--tw-text-opacity:1!important;color:rgb(30 41 59/var(--tw-text-opacity))!important}.hover\:yst-text-white:hover{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.hover\:yst-text-primary-500:hover{--tw-text-opacity:1!important;color:rgb(166 30 105/var(--tw-text-opacity))!important}.hover\:yst-underline:hover{-webkit-text-decoration-line:underline!important;text-decoration-line:underline!important}.focus\:yst-border-primary-500:focus{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important}.focus\:yst-border-red-500:focus{--tw-border-opacity:1!important;border-color:rgb(239 68 68/var(--tw-border-opacity))!important}.focus\:yst-border-emerald-600:focus{--tw-border-opacity:1!important;border-color:rgb(5 150 105/var(--tw-border-opacity))!important}.focus\:yst-bg-primary-600:focus{--tw-bg-opacity:1!important;background-color:rgb(154 22 96/var(--tw-bg-opacity))!important}.focus\:yst-text-white:focus{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.focus\:yst-text-primary-500:focus{--tw-text-opacity:1!important;color:rgb(166 30 105/var(--tw-text-opacity))!important}.focus\:yst-shadow-\[0_0_3px_rgba\(8\2c 74\2c 103\2c 0\.8\)\]:focus{--tw-shadow:0 0 3px #084a67cc!important;--tw-shadow-colored:0 0 3px var(--tw-shadow-color)!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.focus\:yst-outline-none:focus{outline:2px solid #0000!important;outline-offset:2px!important}.focus\:yst-outline:focus{outline-style:solid!important}.focus\:yst-outline-\[1px\]:focus{outline-width:1px!important}.focus\:-yst-outline-offset-1:focus{outline-offset:-1px!important}.focus\:yst-outline-\[color\:\#0066cd\]:focus{outline-color:#0066cd!important}.focus\:yst-ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important}.focus\:yst-ring-1:focus,.focus\:yst-ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.focus\:yst-ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important}.focus\:yst-ring-inset:focus{--tw-ring-inset:inset!important}.focus\:yst-ring-primary-500:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))!important}.focus\:yst-ring-white:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity))!important}.focus\:yst-ring-red-500:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity))!important}.focus\:yst-ring-emerald-600:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(5 150 105/var(--tw-ring-opacity))!important}.focus\:yst-ring-offset-1:focus{--tw-ring-offset-width:1px!important}.focus\:yst-ring-offset-2:focus{--tw-ring-offset-width:2px!important}.focus\:yst-ring-offset-transparent:focus{--tw-ring-offset-color:#0000!important}.focus\:yst-ring-offset-primary-500:focus{--tw-ring-offset-color:#a61e69!important}.yst-group:hover .group-hover\:yst-bg-primary-500{--tw-bg-opacity:1!important;background-color:rgb(166 30 105/var(--tw-bg-opacity))!important}.yst-group:hover .group-hover\:yst-bg-primary-200{--tw-bg-opacity:1!important;background-color:rgb(224 179 204/var(--tw-bg-opacity))!important}.yst-group:hover .group-hover\:yst-text-slate-500{--tw-text-opacity:1!important;color:rgb(100 116 139/var(--tw-text-opacity))!important}.yst-group:hover .group-hover\:yst-text-white{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.yst-group:hover .group-hover\:yst-text-primary-800{--tw-text-opacity:1!important;color:rgb(131 8 78/var(--tw-text-opacity))!important}[dir=rtl] .rtl\:yst-rotate-180{--tw-rotate:180deg!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}@media not all and (min-width:640px){.max-sm\:yst-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}}@media (min-width:640px){.sm\:yst-mx-0{margin-right:0!important;margin-left:0!important}.sm\:yst-mb-0{margin-bottom:0!important}.sm\:yst-ml-3{margin-right:.75rem!important}.sm\:yst-mt-0{margin-top:0!important}.sm\:yst-ml-4{margin-right:1rem!important}.sm\:yst-flex{display:flex!important}.sm\:yst-h-10{height:2.5rem!important}.sm\:yst-w-auto{width:auto!important}.sm\:yst-w-10{width:2.5rem!important}.sm\:yst-translate-y-0{--tw-translate-y:0px!important}.sm\:yst-scale-95,.sm\:yst-translate-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.sm\:yst-scale-95{--tw-scale-x:.95!important;--tw-scale-y:.95!important}.sm\:yst-scale-100{--tw-scale-x:1!important;--tw-scale-y:1!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.sm\:yst-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.sm\:yst-flex-row-reverse{flex-direction:row-reverse!important}.sm\:yst-items-start{align-items:flex-start!important}.sm\:yst-text-left{text-align:right!important}.sm\:yst-text-sm{font-size:.8125rem!important}}@media (min-width:768px){.md\:yst-absolute{position:absolute!important}.md\:yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.md\:yst-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.md\:yst-flex-row{flex-direction:row!important}}@media (min-width:783px){.min-\[783px\]\:yst-block{display:block!important}.min-\[783px\]\:yst-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}.min-\[783px\]\:yst-p-8{padding:2rem!important}}@media (min-width:1024px){.lg\:yst-col-span-2{grid-column:span 2/span 2!important}.lg\:yst-mt-0{margin-top:0!important}.lg\:yst-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.lg\:yst-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.lg\:yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.lg\:yst-gap-12{gap:3rem!important}}@media (min-width:1280px){.xl\:yst-fixed{position:fixed!important}.xl\:yst-right-8{left:2rem!important}.xl\:yst-col-span-2{grid-column:span 2/span 2!important}.xl\:yst-mb-0{margin-bottom:0!important}.xl\:yst-mt-0{margin-top:0!important}.xl\:yst-w-\[16rem\]{width:16rem!important}.xl\:yst-max-w-3xl{max-width:48rem!important}.xl\:yst-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.xl\:yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.xl\:yst-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}.xl\:yst-gap-12{gap:3rem!important}.xl\:yst-pr-\[17\.5rem\]{padding-left:17.5rem!important}}@media (min-width:1536px){.\32xl\:yst-col-span-2{grid-column:span 2/span 2!important}.\32xl\:yst-mt-0{margin-top:0!important}.\32xl\:yst-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.\32xl\:yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.\32xl\:yst-gap-12{gap:3rem!important}}@media (min-width:1800px){.min-\[1800px\]\:yst-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/tailwind-2330.css b/wp-content/plugins/wordpress-seo/css/dist/tailwind-2330.css new file mode 100644 index 00000000..5eb2cf82 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/tailwind-2330.css @@ -0,0 +1 @@ +.yst-root *,.yst-root :after,.yst-root :before{border:0 solid #e5e7eb;box-sizing:border-box}.yst-root :after,.yst-root :before{--tw-content:""}.yst-root{-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5;margin:0;tab-size:4}.yst-root hr{border-top-width:1px;color:inherit;height:0}.yst-root abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.yst-root h1,.yst-root h2,.yst-root h3,.yst-root h4,.yst-root h5,.yst-root h6{font-size:inherit;font-weight:inherit}.yst-root a{color:inherit;text-decoration:inherit}.yst-root b,.yst-root strong{font-weight:bolder}.yst-root code,.yst-root kbd,.yst-root pre,.yst-root samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}.yst-root small{font-size:80%}.yst-root sub,.yst-root sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}.yst-root sub{bottom:-.25em}.yst-root sup{top:-.5em}.yst-root table{border-collapse:collapse;border-color:inherit;text-indent:0}.yst-root button,.yst-root input,.yst-root optgroup,.yst-root select,.yst-root textarea{color:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;margin:0;padding:0}.yst-root button,.yst-root select{text-transform:none}.yst-root [type=button],.yst-root [type=reset],.yst-root [type=submit],.yst-root button{-webkit-appearance:button;background-color:initial;background-image:none}.yst-root :-moz-focusring{outline:auto}.yst-root :-moz-ui-invalid{box-shadow:none}.yst-root progress{vertical-align:initial}.yst-root ::-webkit-inner-spin-button,.yst-root ::-webkit-outer-spin-button{height:auto}.yst-root [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.yst-root ::-webkit-search-decoration{-webkit-appearance:none}.yst-root ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.yst-root summary{display:list-item}.yst-root blockquote,.yst-root dd,.yst-root dl,.yst-root figure,.yst-root h1,.yst-root h2,.yst-root h3,.yst-root h4,.yst-root h5,.yst-root h6,.yst-root hr,.yst-root p,.yst-root pre{margin:0}.yst-root fieldset{margin:0;padding:0}.yst-root legend{padding:0}.yst-root menu,.yst-root ol,.yst-root ul{list-style:none;margin:0;padding:0}.yst-root textarea{resize:vertical}.yst-root input::placeholder,.yst-root textarea::placeholder{color:#6b7280;opacity:1}.yst-root [role=button],.yst-root button{cursor:pointer}.yst-root :disabled{cursor:default}.yst-root audio,.yst-root canvas,.yst-root embed,.yst-root iframe,.yst-root img,.yst-root object,.yst-root svg,.yst-root video{display:block;vertical-align:middle}.yst-root img,.yst-root video{height:auto;max-width:100%}.yst-root [type=date],.yst-root [type=datetime-local],.yst-root [type=email],.yst-root [type=month],.yst-root [type=number],.yst-root [type=password],.yst-root [type=search],.yst-root [type=tel],.yst-root [type=text],.yst-root [type=time],.yst-root [type=url],.yst-root [type=week]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root [type=date]:focus,.yst-root [type=datetime-local]:focus,.yst-root [type=email]:focus,.yst-root [type=month]:focus,.yst-root [type=number]:focus,.yst-root [type=password]:focus,.yst-root [type=search]:focus,.yst-root [type=tel]:focus,.yst-root [type=text]:focus,.yst-root [type=time]:focus,.yst-root [type=url]:focus,.yst-root [type=week]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=date]::placeholder,.yst-root [type=datetime-local]::placeholder,.yst-root [type=email]::placeholder,.yst-root [type=month]::placeholder,.yst-root [type=number]::placeholder,.yst-root [type=password]::placeholder,.yst-root [type=search]::placeholder,.yst-root [type=tel]::placeholder,.yst-root [type=text]::placeholder,.yst-root [type=time]::placeholder,.yst-root [type=url]::placeholder,.yst-root [type=week]::placeholder{color:#6b7280;opacity:1}.yst-root [type=date]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=datetime-local]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=email]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=month]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=number]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=password]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=search]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=tel]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=text]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=time]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=url]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=week]::-webkit-datetime-edit-fields-wrapper{padding:0}.yst-root [type=date]::-webkit-date-and-time-value,.yst-root [type=datetime-local]::-webkit-date-and-time-value,.yst-root [type=email]::-webkit-date-and-time-value,.yst-root [type=month]::-webkit-date-and-time-value,.yst-root [type=number]::-webkit-date-and-time-value,.yst-root [type=password]::-webkit-date-and-time-value,.yst-root [type=search]::-webkit-date-and-time-value,.yst-root [type=tel]::-webkit-date-and-time-value,.yst-root [type=text]::-webkit-date-and-time-value,.yst-root [type=time]::-webkit-date-and-time-value,.yst-root [type=url]::-webkit-date-and-time-value,.yst-root [type=week]::-webkit-date-and-time-value{min-height:1.5em}.yst-root [type=date]::-webkit-datetime-edit,.yst-root [type=date]::-webkit-datetime-edit-day-field,.yst-root [type=date]::-webkit-datetime-edit-hour-field,.yst-root [type=date]::-webkit-datetime-edit-meridiem-field,.yst-root [type=date]::-webkit-datetime-edit-millisecond-field,.yst-root [type=date]::-webkit-datetime-edit-minute-field,.yst-root [type=date]::-webkit-datetime-edit-month-field,.yst-root [type=date]::-webkit-datetime-edit-second-field,.yst-root [type=date]::-webkit-datetime-edit-year-field,.yst-root [type=datetime-local]::-webkit-datetime-edit,.yst-root [type=datetime-local]::-webkit-datetime-edit-day-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-hour-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-meridiem-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-millisecond-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-minute-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-month-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-second-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-year-field,.yst-root [type=email]::-webkit-datetime-edit,.yst-root [type=email]::-webkit-datetime-edit-day-field,.yst-root [type=email]::-webkit-datetime-edit-hour-field,.yst-root [type=email]::-webkit-datetime-edit-meridiem-field,.yst-root [type=email]::-webkit-datetime-edit-millisecond-field,.yst-root [type=email]::-webkit-datetime-edit-minute-field,.yst-root [type=email]::-webkit-datetime-edit-month-field,.yst-root [type=email]::-webkit-datetime-edit-second-field,.yst-root [type=email]::-webkit-datetime-edit-year-field,.yst-root [type=month]::-webkit-datetime-edit,.yst-root [type=month]::-webkit-datetime-edit-day-field,.yst-root [type=month]::-webkit-datetime-edit-hour-field,.yst-root [type=month]::-webkit-datetime-edit-meridiem-field,.yst-root [type=month]::-webkit-datetime-edit-millisecond-field,.yst-root [type=month]::-webkit-datetime-edit-minute-field,.yst-root [type=month]::-webkit-datetime-edit-month-field,.yst-root [type=month]::-webkit-datetime-edit-second-field,.yst-root [type=month]::-webkit-datetime-edit-year-field,.yst-root [type=number]::-webkit-datetime-edit,.yst-root [type=number]::-webkit-datetime-edit-day-field,.yst-root [type=number]::-webkit-datetime-edit-hour-field,.yst-root [type=number]::-webkit-datetime-edit-meridiem-field,.yst-root [type=number]::-webkit-datetime-edit-millisecond-field,.yst-root [type=number]::-webkit-datetime-edit-minute-field,.yst-root [type=number]::-webkit-datetime-edit-month-field,.yst-root [type=number]::-webkit-datetime-edit-second-field,.yst-root [type=number]::-webkit-datetime-edit-year-field,.yst-root [type=password]::-webkit-datetime-edit,.yst-root [type=password]::-webkit-datetime-edit-day-field,.yst-root [type=password]::-webkit-datetime-edit-hour-field,.yst-root [type=password]::-webkit-datetime-edit-meridiem-field,.yst-root [type=password]::-webkit-datetime-edit-millisecond-field,.yst-root [type=password]::-webkit-datetime-edit-minute-field,.yst-root [type=password]::-webkit-datetime-edit-month-field,.yst-root [type=password]::-webkit-datetime-edit-second-field,.yst-root [type=password]::-webkit-datetime-edit-year-field,.yst-root [type=search]::-webkit-datetime-edit,.yst-root [type=search]::-webkit-datetime-edit-day-field,.yst-root [type=search]::-webkit-datetime-edit-hour-field,.yst-root [type=search]::-webkit-datetime-edit-meridiem-field,.yst-root [type=search]::-webkit-datetime-edit-millisecond-field,.yst-root [type=search]::-webkit-datetime-edit-minute-field,.yst-root [type=search]::-webkit-datetime-edit-month-field,.yst-root [type=search]::-webkit-datetime-edit-second-field,.yst-root [type=search]::-webkit-datetime-edit-year-field,.yst-root [type=tel]::-webkit-datetime-edit,.yst-root [type=tel]::-webkit-datetime-edit-day-field,.yst-root [type=tel]::-webkit-datetime-edit-hour-field,.yst-root [type=tel]::-webkit-datetime-edit-meridiem-field,.yst-root [type=tel]::-webkit-datetime-edit-millisecond-field,.yst-root [type=tel]::-webkit-datetime-edit-minute-field,.yst-root [type=tel]::-webkit-datetime-edit-month-field,.yst-root [type=tel]::-webkit-datetime-edit-second-field,.yst-root [type=tel]::-webkit-datetime-edit-year-field,.yst-root [type=text]::-webkit-datetime-edit,.yst-root [type=text]::-webkit-datetime-edit-day-field,.yst-root [type=text]::-webkit-datetime-edit-hour-field,.yst-root [type=text]::-webkit-datetime-edit-meridiem-field,.yst-root [type=text]::-webkit-datetime-edit-millisecond-field,.yst-root [type=text]::-webkit-datetime-edit-minute-field,.yst-root [type=text]::-webkit-datetime-edit-month-field,.yst-root [type=text]::-webkit-datetime-edit-second-field,.yst-root [type=text]::-webkit-datetime-edit-year-field,.yst-root [type=time]::-webkit-datetime-edit,.yst-root [type=time]::-webkit-datetime-edit-day-field,.yst-root [type=time]::-webkit-datetime-edit-hour-field,.yst-root [type=time]::-webkit-datetime-edit-meridiem-field,.yst-root [type=time]::-webkit-datetime-edit-millisecond-field,.yst-root [type=time]::-webkit-datetime-edit-minute-field,.yst-root [type=time]::-webkit-datetime-edit-month-field,.yst-root [type=time]::-webkit-datetime-edit-second-field,.yst-root [type=time]::-webkit-datetime-edit-year-field,.yst-root [type=url]::-webkit-datetime-edit,.yst-root [type=url]::-webkit-datetime-edit-day-field,.yst-root [type=url]::-webkit-datetime-edit-hour-field,.yst-root [type=url]::-webkit-datetime-edit-meridiem-field,.yst-root [type=url]::-webkit-datetime-edit-millisecond-field,.yst-root [type=url]::-webkit-datetime-edit-minute-field,.yst-root [type=url]::-webkit-datetime-edit-month-field,.yst-root [type=url]::-webkit-datetime-edit-second-field,.yst-root [type=url]::-webkit-datetime-edit-year-field,.yst-root [type=week]::-webkit-datetime-edit,.yst-root [type=week]::-webkit-datetime-edit-day-field,.yst-root [type=week]::-webkit-datetime-edit-hour-field,.yst-root [type=week]::-webkit-datetime-edit-meridiem-field,.yst-root [type=week]::-webkit-datetime-edit-millisecond-field,.yst-root [type=week]::-webkit-datetime-edit-minute-field,.yst-root [type=week]::-webkit-datetime-edit-month-field,.yst-root [type=week]::-webkit-datetime-edit-second-field,.yst-root [type=week]::-webkit-datetime-edit-year-field{padding-bottom:0;padding-top:0}.yst-root textarea{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root textarea:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root textarea::placeholder{color:#6b7280;opacity:1}.yst-root select{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root select:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}.yst-root select[multiple]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root select[multiple]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=checkbox]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:#6b7280;border-radius:0;border-width:1px;color:#2563eb;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;-webkit-user-select:none;user-select:none;vertical-align:middle;width:1rem}.yst-root [type=checkbox]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=checkbox]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}.yst-root [type=checkbox]:checked,.yst-root [type=checkbox]:checked:focus,.yst-root [type=checkbox]:checked:hover,.yst-root [type=checkbox]:indeterminate{background-color:currentColor;border-color:#0000}.yst-root [type=checkbox]:indeterminate{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}.yst-root [type=checkbox]:indeterminate:focus,.yst-root [type=checkbox]:indeterminate:hover{background-color:currentColor;border-color:#0000}.yst-root [type=radio]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:#6b7280;border-radius:100%;border-width:1px;color:#2563eb;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;-webkit-user-select:none;user-select:none;vertical-align:middle;width:1rem}.yst-root [type=radio]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=radio]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}.yst-root [type=radio]:checked,.yst-root [type=radio]:checked:focus,.yst-root [type=radio]:checked:hover{background-color:currentColor;border-color:#0000}.yst-root{--tw-text-opacity:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:rgb(71 85 105/var(--tw-text-opacity));font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:.8125rem;font-weight:400;line-height:1.5}.yst-root a{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity));-webkit-text-decoration-line:underline;text-decoration-line:underline}.yst-root a:visited{color:#a61e69}.yst-root a:hover{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.yst-root a:hover:visited{color:#b94986}.yst-root a:focus{--tw-text-opacity:1;border-radius:.125rem;color:rgb(99 102 241/var(--tw-text-opacity));outline-color:#4f46e5;outline-offset:1px;outline-style:solid}.yst-root [type=date]::placeholder,.yst-root [type=datetime-local]::placeholder,.yst-root [type=email]::placeholder,.yst-root [type=month]::placeholder,.yst-root [type=number]::placeholder,.yst-root [type=password]::placeholder,.yst-root [type=search]::placeholder,.yst-root [type=tel]::placeholder,.yst-root [type=text]::placeholder,.yst-root [type=time]::placeholder,.yst-root [type=url]::placeholder,.yst-root [type=week]::placeholder,.yst-root textarea::placeholder{--tw-placeholder-opacity:1;color:rgb(100 116 139/var(--tw-placeholder-opacity))}.yst-root svg path{stroke-width:inherit}.yst-root .yst-radio__input,.yst-root a:focus{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.yst-root .yst-radio__input{transition-property:none}.yst-root .yst-radio__input:checked:before{content:var(--tw-content);display:none}.yst-root .yst-modal{z-index:100000!important}.yst-root dd,.yst-root li{margin-bottom:0}.yst-root input[type=date],.yst-root input[type=datetime-local],.yst-root input[type=datetime],.yst-root input[type=email],.yst-root input[type=month],.yst-root input[type=number],.yst-root input[type=password],.yst-root input[type=search],.yst-root input[type=tel],.yst-root input[type=text],.yst-root input[type=time],.yst-root input[type=url],.yst-root input[type=week]{min-height:0}.yst-root input[type=checkbox]{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);min-height:0;min-width:0;transition-property:none}.yst-root input[type=checkbox]:before{--tw-content:none;content:var(--tw-content)}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.yst-root .yst-alert{border-radius:.375rem;display:flex;gap:.75rem;padding:1rem}.yst-root .yst-alert--info{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.yst-root .yst-alert--info .yst-alert__message{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}.yst-root .yst-alert--warning{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}.yst-root .yst-alert--warning .yst-alert__message{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}.yst-root .yst-alert--success{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}.yst-root .yst-alert--success .yst-alert__message{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}.yst-root .yst-alert--error{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.yst-root .yst-alert--error .yst-alert__message{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}.yst-root .yst-alert__icon{flex-grow:0;flex-shrink:0;height:1.25rem;width:1.25rem}.yst-root .yst-autocomplete{position:relative}.yst-root .yst-autocomplete--error .yst-autocomplete__button{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}.yst-root .yst-autocomplete--error .yst-autocomplete__button:focus{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity));border-color:rgb(239 68 68/var(--tw-border-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete--error .yst-autocomplete__input::placeholder{--tw-placeholder-opacity:1;color:rgb(252 165 165/var(--tw-placeholder-opacity))}.yst-root .yst-autocomplete--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-autocomplete--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-autocomplete--disabled .yst-autocomplete__input{cursor:not-allowed}.yst-root .yst-autocomplete--disabled .yst-autocomplete__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-autocomplete--disabled .yst-autocomplete__button{cursor:not-allowed}.yst-root .yst-autocomplete--disabled .yst-autocomplete__button:focus-within{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity));border-color:rgb(226 232 240/var(--tw-border-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete__button{--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);display:flex;padding-left:.75rem;padding-right:.75rem;width:100%}.yst-root .yst-autocomplete__button:focus-within{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete__button-icon{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:1.25rem;pointer-events:none;position:absolute;right:.625rem;top:.6875rem;width:1.25rem}.yst-root .yst-autocomplete__input{--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;padding:.5rem 2.5rem .5rem 0;width:100%}.yst-root .yst-autocomplete__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-autocomplete__options{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);font-size:.8125rem;margin-top:.25rem;max-height:15rem;overflow:auto;position:absolute;width:100%;z-index:20}.yst-root .yst-autocomplete__options:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete__option{--tw-text-opacity:1;align-items:center;color:rgb(51 65 85/var(--tw-text-opacity));cursor:default;display:flex;justify-content:space-between;padding:.5rem .75rem;position:relative;-webkit-user-select:none;user-select:none}.yst-root .yst-autocomplete__option--active{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.yst-root .yst-autocomplete__option--selected{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-select__option-label{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yst-root .yst-autocomplete__option-check{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));flex-shrink:0;height:1.25rem;width:1.25rem}.yst-root .yst-badge{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(219 234 254/var(--tw-bg-opacity));border-radius:9999px;color:rgb(30 64 175/var(--tw-text-opacity));display:inline-flex;font-size:.75rem;font-weight:500;line-height:1.25;padding:.125rem .5rem;vertical-align:middle;white-space:nowrap}.yst-root .yst-badge--info{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity));color:rgb(30 58 138/var(--tw-text-opacity))}.yst-root .yst-badge--upsell{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity));color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-badge--plain{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(15 23 42/var(--tw-text-opacity))}.yst-root .yst-badge--small{font-size:.675rem}.yst-root .yst-badge--large{font-size:1rem;padding-left:.75rem;padding-right:.75rem}.yst-root .yst-button{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-color:#0000;align-items:center;border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);cursor:pointer;display:inline-flex;font-size:.8125rem;font-weight:500;justify-content:center;line-height:1.25rem;padding:.5rem .75rem;text-align:center;-webkit-text-decoration-line:none;text-decoration-line:none}.yst-root .yst-button:focus{outline-color:#a61e69;outline-offset:2px;outline-style:solid;outline-width:2px}.yst-root a.yst-button:focus{border-radius:.375rem}.yst-root .yst-button--primary{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-color:#0000;background-color:rgb(166 30 105/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--primary:visited{color:#fff}.yst-root .yst-button--primary:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(143 15 87/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--primary:hover:visited{color:#fff}.yst-root .yst-button--primary:focus{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));outline-color:#8f0f57}.yst-root .yst-button--secondary{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));background-color:rgb(255 255 255/var(--tw-bg-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}.yst-root .yst-button--secondary:visited{color:#1e293b}.yst-root .yst-button--secondary:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}.yst-root .yst-button--secondary:hover:visited{color:#1e293b}.yst-root .yst-button--secondary:focus{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));outline-color:#8f0f57}.yst-root .yst-button--tertiary{--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);background-color:initial;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(166 30 105/var(--tw-text-opacity))}.yst-root .yst-button--tertiary:visited{color:#83084e}.yst-root .yst-button--tertiary:hover{--tw-text-opacity:1;color:rgb(131 8 78/var(--tw-text-opacity))}.yst-root .yst-button--tertiary:hover:visited{color:#83084e}.yst-root .yst-button--tertiary:focus{--tw-text-opacity:1;color:rgb(131 8 78/var(--tw-text-opacity));outline-color:#8f0f57}.yst-root .yst-button--error{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity));border-color:#0000;color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--error:visited{color:#fff}.yst-root .yst-button--error:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--error:hover:visited{color:#fff}.yst-root .yst-button--error:focus{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));outline-color:#dc2626}.yst-root .yst-button--upsell{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity));border-color:#0000;color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-button--upsell:visited{color:#78350f}.yst-root .yst-button--upsell:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity));color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-button--upsell:hover:visited{color:#78350f}.yst-root .yst-button--upsell:focus{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity));outline-color:#fbbf24}.yst-root .yst-button--large{font-size:.875rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root .yst-button--extra-large{font-size:1rem;line-height:1.5rem;padding:.625rem .875rem}.yst-root .yst-button--small{font-size:.75rem;line-height:1rem;padding:.375rem .625rem}.yst-root .yst-button--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-button--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-checkbox{align-items:center;display:flex}.yst-root .yst-checkbox--disabled .yst-checkbox__input,.yst-root .yst-checkbox--disabled .yst-checkbox__label{cursor:not-allowed;opacity:.5}.yst-root .yst-checkbox__input{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.25rem;color:rgb(166 30 105/var(--tw-text-opacity));height:1rem;width:1rem}.yst-root .yst-checkbox__input:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))}.yst-root .yst-checkbox__label{margin-left:.75rem}.yst-root .yst-code{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:.25rem;color:rgb(15 23 42/var(--tw-text-opacity));display:inline-block;font-size:.75rem;line-height:1.25;margin:0;padding:.25rem}.yst-root .yst-code--block{display:block;margin-bottom:.5rem;margin-top:.5rem;max-width:100%;overflow-x:auto;padding:.25rem .5rem;white-space:nowrap}.yst-root .yst-file-input{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border:2px dashed rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;padding:1.25rem 1.5rem 1.5rem;text-align:center;transition-duration:.3s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:100%}.yst-root .yst-file-input.yst-is-drag-over{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(250 243 247/var(--tw-bg-opacity));border-color:rgb(205 130 171/var(--tw-border-opacity))}.yst-root .yst-file-input.yst-is-drag-over .yst-file-input__content{pointer-events:none}.yst-root .yst-file-input.yst-is-drag-over .yst-file-input__icon{--tw-translate-y:-0.5rem;--tw-text-opacity:1;color:rgb(185 73 134/var(--tw-text-opacity));transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-file-input.yst-is-disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-file-input.yst-is-disabled .yst-file-input__select-label{cursor:not-allowed}.yst-root .yst-file-input__content{align-items:center;display:inline-flex;flex-direction:column;max-width:20rem}.yst-root .yst-file-input__content>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-file-input__content{text-align:center}.yst-root .yst-file-input__icon{stroke-width:1;--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:3rem;margin-left:auto;margin-right:auto;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.3s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:3rem}.yst-root .yst-file-input__icon>path{stroke-width:1}.yst-root .yst-file-input__input{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.yst-root .yst-file-input__input:focus+.yst-file-input__select-label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-file-input__labels{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));display:inline-block;font-weight:400}.yst-root .yst-file-input__select-label{border-radius:.375rem;font-weight:500}[dir=rtl] .yst-root .yst-file-input__labels{flex-direction:row-reverse}.yst-root .yst-label{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;font-weight:500}.yst-root .yst-link{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity));cursor:pointer;-webkit-text-decoration-line:underline;text-decoration-line:underline}.yst-root .yst-link:visited{color:#a61e69}.yst-root .yst-link:hover{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.yst-root .yst-link:hover:visited{color:#b94986}.yst-root .yst-link:focus{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(79 70 229/var(--tw-ring-opacity));--tw-ring-offset-width:1px;--tw-ring-offset-color:#0000;border-radius:.125rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(99 102 241/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-link--primary{--tw-text-opacity:1;color:rgb(154 22 96/var(--tw-text-opacity))}.yst-root .yst-link--primary:focus,.yst-root .yst-link--primary:hover{--tw-text-opacity:1;color:rgb(166 30 105/var(--tw-text-opacity))}.yst-root .yst-link--primary:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(154 22 96/var(--tw-ring-opacity))}.yst-root .yst-link--error{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.yst-root .yst-link--error:focus,.yst-root .yst-link--error:hover{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.yst-root .yst-link--error:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(220 38 38/var(--tw-ring-opacity))}.yst-root .yst-paper{--tw-bg-opacity:1;--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);display:flex;flex-direction:column}.yst-root .yst-paper__header{border-bottom-width:1px;padding:2rem}.yst-root .yst-paper__content{flex-grow:1;padding:2rem}.yst-root .yst-progress-bar{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:9999px;display:block;overflow:hidden;width:100%}.yst-root .yst-progress-bar__progress{--tw-bg-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));border-radius:9999px;display:block;height:.375rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.2s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:linear}.yst-root .yst-radio{align-items:center;display:flex}.yst-root .yst-radio--disabled .yst-radio__check,.yst-root .yst-radio--disabled .yst-radio__input,.yst-root .yst-radio--disabled .yst-radio__label{cursor:not-allowed;opacity:.5}.yst-root .yst-radio--disabled .yst-radio__check:focus,.yst-root .yst-radio--disabled .yst-radio__input:focus,.yst-root .yst-radio--disabled .yst-radio__label:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block{display:inline-flex}.yst-root .yst-radio--inline-block .yst-radio__input{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.yst-root .yst-radio--inline-block .yst-radio__input:checked+.yst-radio__content .yst-radio__label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:#0000;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block .yst-radio__input:checked+.yst-radio__content .yst-radio__check{visibility:visible}.yst-root .yst-radio--inline-block .yst-radio__input:focus+.yst-radio__content .yst-radio__label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block .yst-radio__input:checked:focus+.yst-radio__content .yst-radio__label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-offset-width:1px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block .yst-radio__content{position:relative}.yst-root .yst-radio--inline-block .yst-radio__label{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.5rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);cursor:pointer;display:flex;font-size:1rem;height:3.5rem;justify-content:center;margin-left:0;width:3.5rem}.yst-root .yst-radio--inline-block .yst-radio__label:hover{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity))}.yst-root .yst-radio--inline-block .yst-radio__label:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-radio--inline-block .yst-radio__check{--tw-text-opacity:1;color:rgb(154 22 96/var(--tw-text-opacity));height:1.25rem;position:absolute;right:.125rem;top:.125rem;visibility:hidden;width:1.25rem}.yst-root .yst-radio__input{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity));color:rgb(166 30 105/var(--tw-text-opacity));height:1rem;width:1rem}.yst-root .yst-radio__input:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))}.yst-root .yst-radio__label{margin-left:.75rem}.yst-root .yst-select{position:relative}.yst-root .yst-select--disabled .yst-select__button,.yst-root .yst-select--disabled .yst-select__label{cursor:not-allowed;opacity:.5}.yst-root .yst-select__button{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(30 41 59/var(--tw-text-opacity));cursor:default;display:flex;justify-content:space-between;line-height:1.5rem;padding:.5rem .75rem;position:relative;text-align:left;width:100%}.yst-root .yst-select__button:focus{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-select__button-icon{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:1.25rem;pointer-events:none;position:absolute;right:.625rem;top:.625rem;width:1.25rem}.yst-root .yst-select__options{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);font-size:.8125rem;margin-top:.25rem;max-height:15rem;overflow:auto;position:absolute;width:100%;z-index:10}.yst-root .yst-select__options:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-select__option{--tw-text-opacity:1;align-items:center;color:rgb(51 65 85/var(--tw-text-opacity));cursor:default;display:flex;justify-content:space-between;padding:.5rem .75rem;position:relative;-webkit-user-select:none;user-select:none}.yst-root .yst-select__option--active{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.yst-root .yst-select__option--selected{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(154 22 96/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-select__button-label,.yst-root .yst-select__option-label{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yst-root .yst-select__option-check{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));flex-shrink:0;height:1.25rem;width:1.25rem}.yst-root .yst-skeleton-loader{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:.25rem;display:block;height:auto;overflow:hidden;position:relative;width:-moz-fit-content;width:fit-content}.yst-root .yst-skeleton-loader:after{--tw-translate-x:-100%;animation:wave 2.5s linear .5s infinite;background:linear-gradient(90deg,#0000,#00000012,#0000);bottom:0;content:"";left:0;position:absolute;right:0;top:0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes wave{0%{transform:translateX(-100%)}50%,to{transform:translateX(100%)}}.yst-root .yst-tag-input{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;color:rgb(30 41 59/var(--tw-text-opacity));display:flex;flex-wrap:wrap;font-size:.8125rem;gap:.375rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root .yst-tag-input::placeholder{--tw-placeholder-opacity:1;color:rgb(100 116 139/var(--tw-placeholder-opacity))}.yst-root .yst-tag-input{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.yst-root .yst-tag-input,.yst-root .yst-tag-input:focus-within{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))}.yst-root .yst-tag-input--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-tag-input--disabled:focus-within{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:rgb(203 213 225/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input--disabled .yst-tag-input__tag{cursor:not-allowed}.yst-root .yst-tag-input--disabled .yst-tag-input__tag:hover{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input--disabled .yst-tag-input__tag:focus,.yst-root .yst-tag-input--disabled .yst-tag-input__tag:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input--disabled .yst-tag-input__remove-tag{cursor:not-allowed}.yst-root .yst-tag-input--disabled .yst-tag-input__remove-tag:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(148 163 184/var(--tw-text-opacity))}.yst-root .yst-tag-input--disabled .yst-tag-input__remove-tag:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input--disabled .yst-tag-input__input{cursor:not-allowed}.yst-root .yst-tag-input__tag{cursor:pointer;gap:.125rem;min-height:20px;padding-inline-end:.125rem}.yst-root .yst-tag-input__tag:hover{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input__tag:focus,.yst-root .yst-tag-input__tag:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input__remove-tag{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:9999px;color:rgb(148 163 184/var(--tw-text-opacity));display:inline-flex;flex-shrink:0;height:1rem;justify-content:center;width:1rem}.yst-root .yst-tag-input__remove-tag:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));color:rgb(100 116 139/var(--tw-text-opacity))}.yst-root .yst-tag-input__remove-tag:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input__input{border-style:none;display:inline-flex;flex:1 1 0%;font-size:.8125rem;margin:0;padding:0}.yst-root .yst-tag-input__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-text-input{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;padding:.5rem .75rem;width:100%}.yst-root .yst-text-input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-text-input--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-text-input--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-text-input--read-only{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;background-color:rgb(248 250 252/var(--tw-bg-opacity));border-color:rgb(226 232 240/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(100 116 139/var(--tw-text-opacity));cursor:default}.yst-root .yst-textarea{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;padding:.5rem .75rem;width:100%}.yst-root .yst-textarea:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-textarea--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-textarea--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-title{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity));font-weight:500;line-height:1.25}.yst-root .yst-title--1{font-size:1.5rem}.yst-root .yst-title--2{font-size:1.125rem}.yst-root .yst-title--3{font-size:.875rem}.yst-root .yst-title--4{font-size:1rem}.yst-root .yst-title--5{font-size:.8125rem}.yst-root .yst-toast{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);max-width:100%;overflow-y:auto;padding:1rem;pointer-events:auto;width:20rem;z-index:20}.yst-root .yst-toast--large{width:24rem}.yst-root .yst-toggle{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));border-color:#0000;border-radius:9999px;border-width:2px;cursor:pointer;display:inline-flex;flex-shrink:0;height:1.5rem;position:relative;transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,-webkit-text-decoration-color;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,-webkit-text-decoration-color;transition-timing-function:cubic-bezier(.4,0,.2,1);width:2.75rem}.yst-root .yst-toggle:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-toggle--checked{--tw-bg-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity))}.yst-root .yst-toggle--checked .yst-toggle__handle{--tw-translate-x:1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-toggle--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-toggle--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-toggle__handle{--tw-translate-x:0px;--tw-bg-opacity:1;--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:9999px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);display:flex;height:1.25rem;justify-content:center;pointer-events:none;position:relative;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:1.25rem}.yst-root .yst-toggle__icon{stroke:currentColor;stroke-width:2;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));flex-grow:0;flex-shrink:0;height:.625rem;transition-duration:.1s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:.625rem}.yst-root .yst-toggle__icon--check{--tw-text-opacity:1;color:rgb(166 30 105/var(--tw-text-opacity))}.yst-root .yst-toggle__icon--x{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}[dir=rtl] .yst-root .yst-toggle--checked .yst-toggle__handle{--tw-translate-x:-1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity));border-radius:.5rem;color:rgb(255 255 255/var(--tw-text-opacity));display:inline-block;font-size:.75rem;max-width:24rem;padding:.5rem .625rem;position:absolute;white-space:normal;width:max-content;z-index:10}.yst-root .yst-tooltip--top{--tw-translate-x:-50%;--tw-translate-y:-100%;left:50%;margin-top:-.75rem;top:0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip--top:before{--tw-translate-x:-50%;--tw-translate-y:0px;--tw-border-opacity:1;--tw-content:"";border-bottom-color:#0000;border-left-color:#0000;border-right-color:#0000;border-top-color:rgb(31 41 55/var(--tw-border-opacity));border-width:8px;content:var(--tw-content);position:absolute}.yst-root .yst-tooltip--bottom,.yst-root .yst-tooltip--top:before{left:50%;top:100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip--bottom{--tw-translate-x:-50%;--tw-translate-y:-0px;margin-top:.75rem}.yst-root .yst-tooltip--bottom:before{--tw-translate-x:-50%;--tw-border-opacity:1;--tw-content:"";border-bottom-color:rgb(31 41 55/var(--tw-border-opacity));border-left-color:#0000;border-right-color:#0000;border-top-color:#0000;border-width:8px;bottom:100%;content:var(--tw-content);left:50%;position:absolute;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip--right{--tw-translate-x:-0px;left:100%;margin-left:.75rem}.yst-root .yst-tooltip--right,.yst-root .yst-tooltip--right:before{--tw-translate-y:-50%;top:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip--right:before{--tw-border-opacity:1;--tw-content:"";border-bottom-color:#0000;border-left-color:#0000;border-right-color:rgb(31 41 55/var(--tw-border-opacity));border-top-color:#0000;border-width:8px;content:var(--tw-content);position:absolute;right:100%}.yst-root .yst-tooltip--left{margin-right:.75rem;right:100%}.yst-root .yst-tooltip--left,.yst-root .yst-tooltip--left:before{--tw-translate-y:-50%;top:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip--left:before{--tw-border-opacity:1;--tw-content:"";border-bottom-color:#0000;border-left-color:rgb(31 41 55/var(--tw-border-opacity));border-right-color:#0000;border-top-color:#0000;border-width:8px;content:var(--tw-content);left:100%;position:absolute}.yst-root .yst-validation-icon{pointer-events:none}.yst-root .yst-validation-icon--success{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.yst-root .yst-validation-icon--info{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.yst-root .yst-validation-icon--warning{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}.yst-root .yst-validation-icon--error{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.yst-root .yst-validation-input{position:relative}.yst-root .yst-validation-input--success .yst-validation-input__input{--tw-ring-opacity:1;--tw-ring-color:rgb(134 239 172/var(--tw-ring-opacity));padding-right:2.5rem}.yst-root .yst-validation-input--success .yst-validation-input__input:focus,.yst-root .yst-validation-input--success .yst-validation-input__input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgb(34 197 94/var(--tw-ring-opacity))}.yst-root .yst-validation-input--info .yst-validation-input__input{--tw-ring-opacity:1;--tw-ring-color:rgb(147 197 253/var(--tw-ring-opacity));padding-right:2.5rem}.yst-root .yst-validation-input--info .yst-validation-input__input:focus,.yst-root .yst-validation-input--info .yst-validation-input__input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity))}.yst-root .yst-validation-input--warning .yst-validation-input__input{--tw-ring-opacity:1;--tw-ring-color:rgb(252 211 77/var(--tw-ring-opacity));padding-right:2.5rem}.yst-root .yst-validation-input--warning .yst-validation-input__input:focus,.yst-root .yst-validation-input--warning .yst-validation-input__input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgb(245 158 11/var(--tw-ring-opacity))}.yst-root .yst-validation-input--error .yst-validation-input__input{--tw-ring-opacity:1;--tw-ring-color:rgb(252 165 165/var(--tw-ring-opacity));padding-right:2.5rem}.yst-root .yst-validation-input--error .yst-validation-input__input:focus,.yst-root .yst-validation-input--error .yst-validation-input__input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity))}.yst-root .yst-validation-input__input:focus,.yst-root .yst-validation-input__input:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-validation-input__icon{height:1.25rem;position:absolute;right:.625rem;top:.6875rem;width:1.25rem}.yst-root .yst-validation-message a{color:inherit;font-weight:500}.yst-root .yst-validation-message a:visited:hover{color:inherit}.yst-root .yst-validation-message a:focus{--tw-ring-color:currentColor}.yst-root .yst-validation-message--success{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.yst-root .yst-validation-message--info{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.yst-root .yst-validation-message--warning{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}.yst-root .yst-validation-message--error{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.yst-root .yst-autocomplete-field__description,.yst-root .yst-autocomplete-field__validation{margin-top:.5rem}.yst-root .yst-card{display:flex;flex-direction:column;position:relative}.yst-root .yst-card>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-card{--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);overflow:hidden;padding:1.5rem;transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.yst-root .yst-card__header{--tw-bg-opacity:1;align-items:center;background-color:rgb(243 244 246/var(--tw-bg-opacity));display:flex;height:6rem;justify-content:center;margin-left:-1.5rem;margin-right:-1.5rem;margin-top:-1.5rem;padding:1.5rem;position:relative}.yst-root .yst-card__content{flex-grow:1}.yst-root .yst-card__footer{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity));border-top-width:1px;padding-top:1.5rem}.yst-root .yst-checkbox-group--disabled .yst-checkbox-group__description,.yst-root .yst-checkbox-group--disabled .yst-checkbox-group__label{cursor:not-allowed;opacity:.5}.yst-root .yst-checkbox-group__label{margin-bottom:.5rem}.yst-root .yst-checkbox-group__options{display:flex;flex-direction:column;gap:.75rem}.yst-root .yst-checkbox-group__description{margin-bottom:1rem;margin-top:-.5rem}.yst-root .yst-feature-upsell{position:relative}.yst-root .yst-feature-upsell--default{--tw-grayscale:grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.yst-root .yst-feature-upsell--card{padding:1.5rem}.yst-root .yst-file-import>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2rem*var(--tw-space-y-reverse));margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-file-import__feedback{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);padding:1rem}.yst-root .yst-file-import__feedback-header{align-items:flex-start;display:flex}.yst-root .yst-file-import__feedback-header>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.yst-root .yst-file-import__feedback-figure{--tw-bg-opacity:1;align-items:center;background-color:rgb(243 229 237/var(--tw-bg-opacity));border-radius:9999px;display:flex;height:2rem;justify-content:center;width:2rem}.yst-root .yst-file-import__feedback-figure>svg{--tw-text-opacity:1;color:rgb(166 30 105/var(--tw-text-opacity));height:1.25rem;width:1.25rem}.yst-root .yst-file-import__feedback-title{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));display:block;font-weight:500;margin-bottom:.125rem;overflow-wrap:break-word}.yst-root .yst-file-import__feedback-description{display:block;font-size:.75rem;font-weight:500}.yst-root .yst-file-import__abort-button{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(241 245 249/var(--tw-bg-opacity));border-radius:9999px;color:rgb(100 116 139/var(--tw-text-opacity));display:inline-flex;flex-shrink:0;height:1.25rem;justify-content:center;width:1.25rem}.yst-root .yst-file-import__abort-button:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(71 85 105/var(--tw-text-opacity))}.yst-root .yst-file-import__abort-button:focus{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-file-import__abort-button>svg{height:.75rem;width:.75rem}.yst-root .yst-file-import__abort-button>svg>path{stroke-width:3}.yst-root .yst-modal{bottom:0;left:0;padding:1rem;position:fixed;right:0;top:0;z-index:10}@media (min-width:640px){.yst-root .yst-modal{padding:2rem}}@media (min-width:768px){.yst-root .yst-modal{padding:5rem}}.yst-root .yst-modal__layout{display:flex;min-height:100%}.yst-root .yst-modal--center .yst-modal__layout{align-items:center;justify-content:center}.yst-root .yst-modal--top-center .yst-modal__layout{align-items:flex-start;justify-content:center}.yst-root .yst-modal__overlay{--tw-bg-opacity:0.75;background-color:rgb(100 116 139/var(--tw-bg-opacity));bottom:0;left:0;position:fixed;right:0;top:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.yst-root .yst-modal__panel{--tw-bg-opacity:1;--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);max-width:36rem;overflow:hidden;padding:1.5rem;position:relative;width:100%}.yst-root .yst-modal__close{display:block;position:absolute;right:1rem;top:1rem}.yst-root .yst-modal__close-button{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;color:rgb(148 163 184/var(--tw-text-opacity));position:relative;z-index:10}.yst-root .yst-modal__close-button:hover{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.yst-root .yst-modal__close-button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-modal__container{display:flex;flex-direction:column;max-height:calc(100vh - 2rem)}@media (min-width:640px){.yst-root .yst-modal__container{max-height:calc(100vh - 4rem)}}@media (min-width:768px){.yst-root .yst-modal__container{max-height:calc(100vh - 10rem)}}.yst-root .yst-modal__panel .yst-modal__container{max-height:calc(100vh - 5rem)}@media (min-width:640px){.yst-root .yst-modal__panel .yst-modal__container{max-height:calc(100vh - 7rem)}}@media (min-width:768px){.yst-root .yst-modal__panel .yst-modal__container{max-height:calc(100vh - 13rem)}}.yst-root .yst-modal__container-footer,.yst-root .yst-modal__container-header{flex-shrink:0}.yst-root .yst-modal__container-content{overflow:auto}.yst-root .yst-modal__panel .yst-modal__container-content{margin-left:-1.5rem;margin-right:-1.5rem;padding-left:1.5rem;padding-right:1.5rem}.yst-root .yst-notifications{display:flex;flex-direction:column;max-height:calc(100vh - 4rem);max-width:calc(100vw - 4rem);pointer-events:none;position:fixed;width:100%;z-index:20}.yst-root .yst-notifications>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-notifications--bottom-center{align-items:center;bottom:2rem}.yst-root .yst-notifications--bottom-left{bottom:2rem;left:2rem}.yst-root .yst-notifications--top-center{align-items:center;top:2rem}.yst-root .yst-notification--large{width:24rem}.yst-root .yst-notification__icon{height:1.25rem;width:1.25rem}.yst-root .yst-pagination{display:inline-flex;isolation:isolate}.yst-root .yst-pagination>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-1px*(1 - var(--tw-space-x-reverse)));margin-right:calc(-1px*var(--tw-space-x-reverse))}.yst-root .yst-pagination{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.yst-root .yst-pagination-display__text{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(100 116 139/var(--tw-text-opacity));font-weight:400;padding:.5rem .75rem}.yst-root .yst-pagination-display__current-text{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity));font-weight:600}.yst-root .yst-pagination-display__truncated{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity));align-self:center;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(100 116 139/var(--tw-text-opacity));display:inline-flex;font-size:.8125rem;font-weight:600;padding:.5rem 1rem}.yst-root .yst-pagination__button{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));align-items:center;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(148 163 184/var(--tw-text-opacity));display:inline-flex;padding:.5rem;position:relative}.yst-root .yst-pagination__button:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.yst-root .yst-pagination__button:focus{outline-color:#a61e69;outline-offset:0;z-index:20}.yst-root .yst-pagination__button--active{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);background-color:rgb(166 30 105/var(--tw-bg-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(255 255 255/var(--tw-text-opacity));font-size:.8125rem;font-weight:600;z-index:10}.yst-root .yst-pagination__button--active:hover{--tw-bg-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity))}.yst-root .yst-pagination__button--active:focus{z-index:20}.yst-root .yst-pagination__button--active:focus-visible{border-radius:.125rem;outline-color:#a61e69;outline-offset:2px;outline-style:solid;outline-width:2px}.yst-root .yst-pagination__button--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-pagination__button--disabled:hover{background-color:initial}.yst-root .yst-pagination__button--disabled:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-radio-group--inline-block .yst-radio-group__options{display:flex;flex-direction:row;flex-wrap:wrap;gap:.5rem}.yst-root .yst-radio-group--disabled .yst-radio-group__description,.yst-root .yst-radio-group--disabled .yst-radio-group__label{opacity:.5}.yst-root .yst-radio-group--disabled .yst-radio-group__label{cursor:not-allowed}.yst-root .yst-radio-group__label{margin-bottom:.5rem}.yst-root .yst-radio-group__options{display:flex;flex-direction:column;gap:.5rem}.yst-root .yst-radio-group__description{margin-bottom:1rem;margin-top:-.5rem}.yst-root .yst-select-field--disabled .yst-select-field__description,.yst-root .yst-select-field--disabled .yst-select-field__label{cursor:not-allowed;opacity:.5}.yst-root .yst-select-field__options{display:flex;flex-direction:column;gap:.75rem}.yst-root .yst-select-field__description,.yst-root .yst-select-field__validation{margin-top:.5rem}.yst-root .yst-mobile-navigation__top{position:sticky;top:0;width:100%;z-index:50}.yst-root .yst-mobile-navigation__dialog{bottom:0;display:flex;left:0;position:fixed;right:0;top:0;z-index:50}.yst-root .yst-tag-field--disabled .yst-tag-field__description,.yst-root .yst-tag-field--disabled .yst-tag-field__label{cursor:not-allowed;opacity:.5}.yst-root .yst-tag-field__description,.yst-root .yst-tag-field__validation{margin-top:.5rem}.yst-root .yst-text-field--disabled .yst-text-field__description,.yst-root .yst-text-field--disabled .yst-text-field__label{opacity:.5}.yst-root .yst-text-field--disabled .yst-text-field__label{cursor:not-allowed}.yst-root .yst-text-field--read-only .yst-text-field__label{cursor:default}.yst-root .yst-text-field__description,.yst-root .yst-text-field__validation{margin-top:.5rem}.yst-root .yst-textarea-field--disabled .yst-textarea-field__description,.yst-root .yst-textarea-field--disabled .yst-textarea-field__label{opacity:.5}.yst-root .yst-textarea-field--disabled .yst-textarea-field__label{cursor:not-allowed}.yst-root .yst-text-field--read-only .yst-textarea-field__label{cursor:default}.yst-root .yst-textarea-field__description,.yst-root .yst-textarea-field__validation{margin-top:.5rem}.yst-root .yst-toggle-field{display:flex;flex-direction:column;gap:.25rem}.yst-root .yst-toggle-field--disabled .yst-toggle-field__description,.yst-root .yst-toggle-field--disabled .yst-toggle-field__label-wrapper{opacity:.5}.yst-root .yst-toggle-field--disabled .yst-toggle-field__description,.yst-root .yst-toggle-field--disabled .yst-toggle-field__label,.yst-root .yst-toggle-field--disabled .yst-toggle-field__label-wrapper{cursor:not-allowed}.yst-root .yst-toggle-field__header{align-items:center;display:flex;flex-direction:row;gap:1.5rem;justify-content:space-between}.yst-root .yst-toggle-field__label-wrapper{align-items:center;display:flex;gap:.25rem}.yst-root .yst-toggle-field__description{margin-right:4.25rem}.yst-sr-only{clip:rect(0,0,0,0)!important;border-width:0!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.yst-pointer-events-none{pointer-events:none!important}.yst-invisible{visibility:hidden!important}.yst-fixed{position:fixed!important}.yst-absolute{position:absolute!important}.yst-relative{position:relative!important}.yst-sticky{position:sticky!important}.yst-inset-0{bottom:0!important;top:0!important}.yst-inset-0,.yst-inset-x-0{left:0!important;right:0!important}.yst-inset-y-0{bottom:0!important;top:0!important}.yst--left-3{left:-.75rem!important}.yst-top-0{top:0!important}.yst-right-0{right:0!important}.yst-bottom-12{bottom:3rem!important}.yst-top-2{top:.5rem!important}.yst-right-2{right:.5rem!important}.yst-bottom-0{bottom:0!important}.yst-top-1\/2{top:50%!important}.yst--right-\[6\.5px\]{right:-6.5px!important}.yst--top-\[6\.5px\]{top:-6.5px!important}.yst-left-4{left:1rem!important}.yst--bottom-6{bottom:-1.5rem!important}.yst-top-8{top:2rem!important}.yst-top-3\.5{top:.875rem!important}.yst-top-3{top:.75rem!important}.yst-left-0{left:0!important}.yst-z-30{z-index:30!important}.yst-z-40{z-index:40!important}.yst-z-10{z-index:10!important}.yst-z-20{z-index:20!important}.yst-order-last{order:9999!important}.yst-col-span-1{grid-column:span 1/span 1!important}.yst-m-0{margin:0!important}.yst--m-\[16px\]{margin:-16px!important}.yst--m-6{margin:-1.5rem!important}.yst-my-auto{margin-bottom:auto!important;margin-top:auto!important}.yst-mx-auto{margin-left:auto!important;margin-right:auto!important}.yst-my-4{margin-bottom:1rem!important;margin-top:1rem!important}.yst-my-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.yst-my-6{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.yst-my-12{margin-bottom:3rem!important;margin-top:3rem!important}.yst-my-3{margin-bottom:.75rem!important;margin-top:.75rem!important}.yst-my-8{margin-bottom:2rem!important;margin-top:2rem!important}.yst--mx-6{margin-left:-1.5rem!important;margin-right:-1.5rem!important}.yst-mx-1\.5{margin-left:.375rem!important;margin-right:.375rem!important}.yst-mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.yst-mx-0{margin-left:0!important;margin-right:0!important}.yst-mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.yst-my-0{margin-bottom:0!important;margin-top:0!important}.yst-my-16{margin-bottom:4rem!important;margin-top:4rem!important}.yst--ml-1{margin-left:-.25rem!important}.yst-mt-6{margin-top:1.5rem!important}.yst-mt-1\.5{margin-top:.375rem!important}.yst-mt-1{margin-top:.25rem!important}.yst-ml-8{margin-left:2rem!important}.yst--mr-14{margin-right:-3.5rem!important}.yst-mb-2{margin-bottom:.5rem!important}.yst-mr-4{margin-right:1rem!important}.yst-mr-2{margin-right:.5rem!important}.yst-mb-px{margin-bottom:1px!important}.yst-ml-4{margin-left:1rem!important}.yst-mb-16{margin-bottom:4rem!important}.yst-mt-auto{margin-top:auto!important}.yst-ml-3{margin-left:.75rem!important}.yst-mr-1{margin-right:.25rem!important}.yst-mr-5{margin-right:1.25rem!important}.yst-mb-8{margin-bottom:2rem!important}.yst-mt-3{margin-top:.75rem!important}.yst-ml-1{margin-left:.25rem!important}.yst--mr-1{margin-right:-.25rem!important}.yst--mb-\[1em\]{margin-bottom:-1em!important}.yst--ml-0\.5{margin-left:-.125rem!important}.yst--ml-0{margin-left:0!important}.yst-ml-auto{margin-left:auto!important}.yst-mt-2{margin-top:.5rem!important}.yst-mt-4{margin-top:1rem!important}.yst-mb-5{margin-bottom:1.25rem!important}.yst-mb-6{margin-bottom:1.5rem!important}.yst-mt-8{margin-top:2rem!important}.yst-mt-12{margin-top:3rem!important}.yst-mb-3{margin-bottom:.75rem!important}.yst-ml-1\.5{margin-left:.375rem!important}.yst-mr-6{margin-right:1.5rem!important}.yst--ml-px{margin-left:-1px!important}.yst-ml-12{margin-left:3rem!important}.yst-mb-0{margin-bottom:0!important}.yst--mt-6{margin-top:-1.5rem!important}.yst-mb-4{margin-bottom:1rem!important}.yst-ml-2{margin-left:.5rem!important}.yst-mr-3{margin-right:.75rem!important}.yst-mt-7{margin-top:1.75rem!important}.yst-mt-10{margin-top:2.5rem!important}.yst-mt-\[-2\.6rem\]{margin-top:-2.6rem!important}.yst-mt-\[18px\]{margin-top:18px!important}.yst-mb-1{margin-bottom:.25rem!important}.yst-mr-8{margin-right:2rem!important}.yst--mt-4{margin-top:-1rem!important}.yst-mb-24{margin-bottom:6rem!important}.yst-mt-\[27\.5px\]{margin-top:27.5px!important}.yst-mt-5{margin-top:1.25rem!important}.yst-mt-0{margin-top:0!important}.yst-block{display:block!important}.yst-inline-block{display:inline-block!important}.yst-inline{display:inline!important}.yst-flex{display:flex!important}.yst-inline-flex{display:inline-flex!important}.yst-grid{display:grid!important}.yst-hidden{display:none!important}.yst-h-5{height:1.25rem!important}.yst-h-6{height:1.5rem!important}.yst-h-4{height:1rem!important}.yst-h-12{height:3rem!important}.yst-h-0{height:0!important}.yst-h-full{height:100%!important}.yst-h-16{height:4rem!important}.yst-h-7{height:1.75rem!important}.yst-h-3{height:.75rem!important}.yst-h-8{height:2rem!important}.yst-h-\[90vh\]{height:90vh!important}.yst-h-4\/5{height:80%!important}.yst-h-20{height:5rem!important}.yst-h-\[120px\]{height:120px!important}.yst-h-auto{height:auto!important}.yst-h-9{height:2.25rem!important}.yst-h-2\.5{height:.625rem!important}.yst-h-2{height:.5rem!important}.yst-h-24{height:6rem!important}.yst-h-48{height:12rem!important}.yst-h-96{height:24rem!important}.yst-h-\[45px\]{height:45px!important}.yst-h-14{height:3.5rem!important}.yst-h-28{height:7rem!important}.yst-max-h-\[calc\(90vh-10rem\)\]{max-height:calc(90vh - 10rem)!important}.yst-max-h-60{max-height:15rem!important}.yst-min-h-full{min-height:100%!important}.yst-w-5{width:1.25rem!important}.yst-w-6{width:1.5rem!important}.yst-w-0{width:0!important}.yst-w-full{width:100%!important}.yst-w-4{width:1rem!important}.yst-w-12{width:3rem!important}.yst-w-2{width:.5rem!important}.yst-w-3{width:.75rem!important}.yst-w-8{width:2rem!important}.yst-w-\[350px\]{width:350px!important}.yst-w-20{width:5rem!important}.yst-w-\[150px\]{width:150px!important}.yst-w-\[3px\]{width:3px!important}.yst-w-40{width:10rem!important}.yst-w-56{width:14rem!important}.yst-w-2\.5{width:.625rem!important}.yst-w-0\.5{width:.125rem!important}.yst-w-48{width:12rem!important}.yst-w-96{width:24rem!important}.yst-w-3\/5{width:60%!important}.yst-w-16{width:4rem!important}.yst-w-14{width:3.5rem!important}.yst-w-\[463px\]{width:463px!important}.yst-w-24{width:6rem!important}.yst-min-w-full{min-width:100%!important}.yst-min-w-0{min-width:0!important}.yst-max-w-xs{max-width:20rem!important}.yst-max-w-sm{max-width:24rem!important}.yst-max-w-screen-sm{max-width:640px!important}.yst-max-w-6xl{max-width:72rem!important}.yst-max-w-lg{max-width:32rem!important}.yst-max-w-\[715px\]{max-width:715px!important}.yst-max-w-none{max-width:none!important}.yst-max-w-full{max-width:100%!important}.yst-max-w-5xl{max-width:64rem!important}.yst-max-w-2xl{max-width:42rem!important}.yst-max-w-\[500px\]{max-width:500px!important}.yst-flex-1{flex:1 1 0%!important}.yst-flex-none{flex:none!important}.yst-flex-shrink-0,.yst-shrink-0{flex-shrink:0!important}.yst-flex-grow,.yst-grow{flex-grow:1!important}.yst-origin-top{transform-origin:top!important}.yst-translate-y-4{--tw-translate-y:1rem!important}.yst-translate-y-0,.yst-translate-y-4{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst-translate-y-0{--tw-translate-y:0px!important}.yst-translate-y-full{--tw-translate-y:100%!important}.yst--translate-y-full,.yst-translate-y-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst--translate-y-full{--tw-translate-y:-100%!important}.yst-scale-95{--tw-scale-x:.95!important;--tw-scale-y:.95!important}.yst-scale-100,.yst-scale-95{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst-scale-100{--tw-scale-x:1!important;--tw-scale-y:1!important}.yst-scale-y-0{--tw-scale-y:0!important}.yst-scale-y-0,.yst-transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}@keyframes yst-spin{to{transform:rotate(1turn)}}.yst-animate-spin{animation:yst-spin 1s linear infinite!important}.yst-cursor-wait{cursor:wait!important}.yst-cursor-not-allowed{cursor:not-allowed!important}.yst-cursor-default{cursor:default!important}.yst-select-none{-webkit-user-select:none!important;user-select:none!important}.yst-scroll-pt-11{scroll-padding-top:2.75rem!important}.yst-scroll-pb-2{scroll-padding-bottom:.5rem!important}.yst-list-outside{list-style-position:outside!important}.yst-list-disc{list-style-type:disc!important}.yst-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}.yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.yst-flex-row{flex-direction:row!important}.yst-flex-col{flex-direction:column!important}.yst-flex-wrap{flex-wrap:wrap!important}.yst-content-between{align-content:space-between!important}.yst-items-start{align-items:flex-start!important}.yst-items-center{align-items:center!important}.yst-justify-center{justify-content:center!important}.yst-justify-between{justify-content:space-between!important}.yst-gap-2{gap:.5rem!important}.yst-gap-3{gap:.75rem!important}.yst-gap-8{gap:2rem!important}.yst-gap-6{gap:1.5rem!important}.yst-gap-1\.5{gap:.375rem!important}.yst-gap-1{gap:.25rem!important}.yst-gap-4{gap:1rem!important}.yst-gap-x-6{column-gap:1.5rem!important}.yst-gap-y-2{row-gap:.5rem!important}.yst-gap-x-4{column-gap:1rem!important}.yst-space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(2rem*var(--tw-space-x-reverse))!important}.yst-space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))!important;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(2rem*var(--tw-space-y-reverse))!important;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.25rem*var(--tw-space-y-reverse))!important;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(.5rem*var(--tw-space-x-reverse))!important}.yst-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.75rem*var(--tw-space-y-reverse))!important;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(.75rem*var(--tw-space-x-reverse))!important}.yst-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.5rem*var(--tw-space-y-reverse))!important;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(1rem*var(--tw-space-y-reverse))!important;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))!important}.yst-divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0!important;border-bottom-width:calc(1px*var(--tw-divide-y-reverse))!important;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))!important}.yst-divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1!important;border-color:rgb(229 231 235/var(--tw-divide-opacity))!important}.yst-divide-slate-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1!important;border-color:rgb(203 213 225/var(--tw-divide-opacity))!important}.yst-self-start{align-self:flex-start!important}.yst-self-end{align-self:flex-end!important}.yst-self-center{align-self:center!important}.yst-overflow-auto{overflow:auto!important}.yst-overflow-hidden{overflow:hidden!important}.yst-overflow-y-auto{overflow-y:auto!important}.yst-overflow-x-scroll{overflow-x:scroll!important}.yst-truncate{overflow:hidden!important;white-space:nowrap!important}.yst-overflow-ellipsis,.yst-text-ellipsis,.yst-truncate{text-overflow:ellipsis!important}.yst-whitespace-nowrap{white-space:nowrap!important}.yst-whitespace-pre-line{white-space:pre-line!important}.yst-rounded-md{border-radius:.375rem!important}.yst-rounded-full{border-radius:9999px!important}.yst-rounded-lg{border-radius:.5rem!important}.yst-rounded-3xl{border-radius:1.5rem!important}.yst-rounded-none{border-radius:0!important}.yst-rounded-xl{border-radius:.75rem!important}.yst-rounded-l-md{border-bottom-left-radius:.375rem!important;border-top-left-radius:.375rem!important}.yst-rounded-r-md{border-bottom-right-radius:.375rem!important;border-top-right-radius:.375rem!important}.yst-rounded-t-lg{border-top-left-radius:.5rem!important;border-top-right-radius:.5rem!important}.yst-rounded-b-lg{border-bottom-left-radius:.5rem!important;border-bottom-right-radius:.5rem!important}.yst-rounded-br-none{border-bottom-right-radius:0!important}.yst-border{border-width:1px!important}.yst-border-2{border-width:2px!important}.yst-border-0{border-width:0!important}.yst-border-y{border-bottom-width:1px!important;border-top-width:1px!important}.yst-border-x-0{border-left-width:0!important;border-right-width:0!important}.yst-border-l{border-left-width:1px!important}.yst-border-b{border-bottom-width:1px!important}.yst-border-r{border-right-width:1px!important}.yst-border-t,.yst-border-t-\[1px\]{border-top-width:1px!important}.yst-border-solid{border-style:solid!important}.yst-border-dashed{border-style:dashed!important}.yst-border-none{border-style:none!important}.yst-border-slate-200{--tw-border-opacity:1!important;border-color:rgb(226 232 240/var(--tw-border-opacity))!important}.yst-border-transparent{border-color:#0000!important}.yst-border-white{--tw-border-opacity:1!important;border-color:rgb(255 255 255/var(--tw-border-opacity))!important}.yst-border-amber-300{--tw-border-opacity:1!important;border-color:rgb(252 211 77/var(--tw-border-opacity))!important}.yst-border-slate-300{--tw-border-opacity:1!important;border-color:rgb(203 213 225/var(--tw-border-opacity))!important}.yst-border-primary-500{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important}.yst-border-slate-100{--tw-border-opacity:1!important;border-color:rgb(241 245 249/var(--tw-border-opacity))!important}.yst-border-primary-300{--tw-border-opacity:1!important;border-color:rgb(205 130 171/var(--tw-border-opacity))!important}.yst-border-red-300{--tw-border-opacity:1!important;border-color:rgb(252 165 165/var(--tw-border-opacity))!important}.yst-border-red-500{--tw-border-opacity:1!important;border-color:rgb(239 68 68/var(--tw-border-opacity))!important}.yst-border-emerald-600{--tw-border-opacity:1!important;border-color:rgb(5 150 105/var(--tw-border-opacity))!important}.yst-border-r-slate-200{--tw-border-opacity:1!important;border-right-color:rgb(226 232 240/var(--tw-border-opacity))!important}.yst-border-t-\[rgb\(0\,0\,0\,0\.2\)\]{border-top-color:#0003!important}.yst-bg-slate-600{--tw-bg-opacity:1!important;background-color:rgb(71 85 105/var(--tw-bg-opacity))!important}.yst-bg-slate-100{--tw-bg-opacity:1!important;background-color:rgb(241 245 249/var(--tw-bg-opacity))!important}.yst-bg-white{--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.yst-bg-slate-200{--tw-bg-opacity:1!important;background-color:rgb(226 232 240/var(--tw-bg-opacity))!important}.yst-bg-slate-50{--tw-bg-opacity:1!important;background-color:rgb(248 250 252/var(--tw-bg-opacity))!important}.yst-bg-transparent{background-color:initial!important}.yst-bg-green-100{--tw-bg-opacity:1!important;background-color:rgb(220 252 231/var(--tw-bg-opacity))!important}.yst-bg-primary-500{--tw-bg-opacity:1!important;background-color:rgb(166 30 105/var(--tw-bg-opacity))!important}.yst-bg-black{--tw-bg-opacity:1!important;background-color:rgb(0 0 0/var(--tw-bg-opacity))!important}.yst-bg-slate-300{--tw-bg-opacity:1!important;background-color:rgb(203 213 225/var(--tw-bg-opacity))!important}.yst-bg-red-100{--tw-bg-opacity:1!important;background-color:rgb(254 226 226/var(--tw-bg-opacity))!important}.yst-bg-primary-600{--tw-bg-opacity:1!important;background-color:rgb(154 22 96/var(--tw-bg-opacity))!important}.yst-bg-blue-100{--tw-bg-opacity:1!important;background-color:rgb(219 234 254/var(--tw-bg-opacity))!important}.yst-bg-yellow-100{--tw-bg-opacity:1!important;background-color:rgb(254 249 195/var(--tw-bg-opacity))!important}.yst-bg-primary-200{--tw-bg-opacity:1!important;background-color:rgb(224 179 204/var(--tw-bg-opacity))!important}.yst-bg-opacity-75{--tw-bg-opacity:0.75!important}.yst-stroke-3{stroke-width:3px!important}.yst-stroke-1{stroke-width:1!important}.yst-object-contain{object-fit:contain!important}.yst-object-cover{object-fit:cover!important}.yst-object-center{object-position:center!important}.yst-p-1{padding:.25rem!important}.yst-p-6{padding:1.5rem!important}.yst-p-4{padding:1rem!important}.yst-p-8{padding:2rem!important}.yst-p-0{padding:0!important}.yst-p-2\.5{padding:.625rem!important}.yst-p-2{padding:.5rem!important}.yst-p-3{padding:.75rem!important}.yst-px-4{padding-left:1rem!important;padding-right:1rem!important}.yst-px-3{padding-left:.75rem!important;padding-right:.75rem!important}.yst-py-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.yst-py-6{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.yst-px-2{padding-left:.5rem!important;padding-right:.5rem!important}.yst-py-4{padding-bottom:1rem!important;padding-top:1rem!important}.yst-px-6{padding-left:1.5rem!important;padding-right:1.5rem!important}.yst-py-3{padding-bottom:.75rem!important;padding-top:.75rem!important}.yst-px-2\.5{padding-left:.625rem!important;padding-right:.625rem!important}.yst-py-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.yst-px-0\.5{padding-left:.125rem!important;padding-right:.125rem!important}.yst-px-0{padding-left:0!important;padding-right:0!important}.yst-px-\[3px\]{padding-left:3px!important;padding-right:3px!important}.yst-py-\[3px\]{padding-bottom:3px!important;padding-top:3px!important}.yst-px-8{padding-left:2rem!important;padding-right:2rem!important}.yst-py-12{padding-bottom:3rem!important;padding-top:3rem!important}.yst-py-1\.5{padding-bottom:.375rem!important;padding-top:.375rem!important}.yst-px-11{padding-left:2.75rem!important;padding-right:2.75rem!important}.yst-px-10{padding-left:2.5rem!important;padding-right:2.5rem!important}.yst-pb-10{padding-bottom:2.5rem!important}.yst-pb-1{padding-bottom:.25rem!important}.yst-pt-1{padding-top:.25rem!important}.yst-pt-4{padding-top:1rem!important}.yst-pb-4{padding-bottom:1rem!important}.yst-pr-4{padding-right:1rem!important}.yst-pl-6{padding-left:1.5rem!important}.yst-pt-2{padding-top:.5rem!important}.yst-pl-\[1em\]{padding-left:1em!important}.yst-pb-6{padding-bottom:1.5rem!important}.yst-pb-8{padding-bottom:2rem!important}.yst-pt-6{padding-top:1.5rem!important}.yst-pl-2{padding-left:.5rem!important}.yst-pr-3{padding-right:.75rem!important}.yst-pb-2{padding-bottom:.5rem!important}.yst-pt-10{padding-top:2.5rem!important}.yst-pt-\[56\.25\%\]{padding-top:56.25%!important}.yst-pl-3{padding-left:.75rem!important}.yst-pr-2{padding-right:.5rem!important}.yst-pl-0{padding-left:0!important}.yst-pr-10{padding-right:2.5rem!important}.yst-pr-9{padding-right:2.25rem!important}.yst-text-left{text-align:left!important}.yst-text-center{text-align:center!important}.yst-align-middle{vertical-align:middle!important}.yst-font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.yst-font-wp{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important}.yst-text-sm{font-size:.8125rem!important}.yst-text-4xl{font-size:2.25rem!important}.yst-text-2xl{font-size:1.5rem!important}.yst-text-base{font-size:1rem!important}.yst-text-tiny{font-size:.875rem!important}.yst-text-lg{font-size:1.125rem!important}.yst-text-xs{font-size:.75rem!important}.yst-text-xl{font-size:1.25rem!important}.yst-text-\[10px\]{font-size:10px!important}.yst-text-xxs{font-size:.675rem!important}.yst-font-medium{font-weight:500!important}.yst-font-semibold{font-weight:600!important}.yst-font-extrabold{font-weight:800!important}.yst-font-bold{font-weight:700!important}.yst-font-\[650\]{font-weight:650!important}.yst-font-light{font-weight:300!important}.yst-font-normal{font-weight:400!important}.yst-uppercase{text-transform:uppercase!important}.yst-italic{font-style:italic!important}.yst-leading-10{line-height:2.5rem!important}.yst-leading-6{line-height:1.5rem!important}.yst-leading-8{line-height:2rem!important}.yst-leading-5{line-height:1.25rem!important}.yst-leading-normal{line-height:1.5!important}.yst-leading-\[normal\]{line-height:normal!important}.yst-leading-tight{line-height:1.25!important}.yst-leading-4{line-height:1rem!important}.yst-tracking-tight{letter-spacing:-.025em!important}.yst-tracking-wide{letter-spacing:.025em!important}.yst-text-slate-800{--tw-text-opacity:1!important;color:rgb(30 41 59/var(--tw-text-opacity))!important}.yst-text-slate-400{--tw-text-opacity:1!important;color:rgb(148 163 184/var(--tw-text-opacity))!important}.yst-text-white{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.yst-text-slate-500{--tw-text-opacity:1!important;color:rgb(100 116 139/var(--tw-text-opacity))!important}.yst-text-slate-900{--tw-text-opacity:1!important;color:rgb(15 23 42/var(--tw-text-opacity))!important}.yst-text-slate-600{--tw-text-opacity:1!important;color:rgb(71 85 105/var(--tw-text-opacity))!important}.yst-text-primary-500{--tw-text-opacity:1!important;color:rgb(166 30 105/var(--tw-text-opacity))!important}.yst-text-gray-900{--tw-text-opacity:1!important;color:rgb(17 24 39/var(--tw-text-opacity))!important}.yst-text-gray-500{--tw-text-opacity:1!important;color:rgb(107 114 128/var(--tw-text-opacity))!important}.yst-text-green-600{--tw-text-opacity:1!important;color:rgb(22 163 74/var(--tw-text-opacity))!important}.yst-text-gray-400{--tw-text-opacity:1!important;color:rgb(156 163 175/var(--tw-text-opacity))!important}.yst-text-indigo-600{--tw-text-opacity:1!important;color:rgb(79 70 229/var(--tw-text-opacity))!important}.yst-text-\[\#555\]{--tw-text-opacity:1!important;color:rgb(85 85 85/var(--tw-text-opacity))!important}.yst-text-amber-300{--tw-text-opacity:1!important;color:rgb(252 211 77/var(--tw-text-opacity))!important}.yst-text-slate-700{--tw-text-opacity:1!important;color:rgb(51 65 85/var(--tw-text-opacity))!important}.yst-text-red-500{--tw-text-opacity:1!important;color:rgb(239 68 68/var(--tw-text-opacity))!important}.yst-text-green-400{--tw-text-opacity:1!important;color:rgb(74 222 128/var(--tw-text-opacity))!important}.yst-text-\[\#111827\]{--tw-text-opacity:1!important;color:rgb(17 24 39/var(--tw-text-opacity))!important}.yst-text-yellow-900{--tw-text-opacity:1!important;color:rgb(113 63 18/var(--tw-text-opacity))!important}.yst-text-amber-500{--tw-text-opacity:1!important;color:rgb(245 158 11/var(--tw-text-opacity))!important}.yst-text-amber-900{--tw-text-opacity:1!important;color:rgb(120 53 15/var(--tw-text-opacity))!important}.yst-text-red-600{--tw-text-opacity:1!important;color:rgb(220 38 38/var(--tw-text-opacity))!important}.yst-text-blue-500{--tw-text-opacity:1!important;color:rgb(59 130 246/var(--tw-text-opacity))!important}.yst-text-blue-800{--tw-text-opacity:1!important;color:rgb(30 64 175/var(--tw-text-opacity))!important}.yst-text-yellow-500{--tw-text-opacity:1!important;color:rgb(234 179 8/var(--tw-text-opacity))!important}.yst-text-yellow-800{--tw-text-opacity:1!important;color:rgb(133 77 14/var(--tw-text-opacity))!important}.yst-text-red-800{--tw-text-opacity:1!important;color:rgb(153 27 27/var(--tw-text-opacity))!important}.yst-text-emerald-600{--tw-text-opacity:1!important;color:rgb(5 150 105/var(--tw-text-opacity))!important}.yst-text-green-800{--tw-text-opacity:1!important;color:rgb(22 101 52/var(--tw-text-opacity))!important}.yst-text-red-900{--tw-text-opacity:1!important;color:rgb(127 29 29/var(--tw-text-opacity))!important}.yst-underline{-webkit-text-decoration-line:underline!important;text-decoration-line:underline!important}.yst-line-through{-webkit-text-decoration-line:line-through!important;text-decoration-line:line-through!important}.yst-no-underline{-webkit-text-decoration-line:none!important;text-decoration-line:none!important}.yst-subpixel-antialiased{-webkit-font-smoothing:auto!important;-moz-osx-font-smoothing:auto!important}.yst-placeholder-slate-500::placeholder{--tw-placeholder-opacity:1!important;color:rgb(100 116 139/var(--tw-placeholder-opacity))!important}.yst-opacity-0{opacity:0!important}.yst-opacity-100{opacity:1!important}.yst-opacity-25{opacity:.25!important}.yst-opacity-75{opacity:.75!important}.yst-opacity-50{opacity:.5!important}.yst-shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a!important;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)!important}.yst-shadow,.yst-shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.yst-shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a!important;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)!important}.yst-shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a!important;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)!important}.yst-shadow-md,.yst-shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.yst-shadow-xl{--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a!important;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)!important}.yst-shadow-none{--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important}.yst-shadow-none,.yst-shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.yst-shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d!important;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)!important}.yst-shadow-amber-700\/30{--tw-shadow-color:#b453094d!important;--tw-shadow:var(--tw-shadow-colored)!important}.yst-outline-none{outline:2px solid #0000!important;outline-offset:2px!important}.yst-ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.yst-ring-gray-200{--tw-ring-opacity:1!important;--tw-ring-color:rgb(229 231 235/var(--tw-ring-opacity))!important}.yst-ring-black{--tw-ring-opacity:1!important;--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity))!important}.yst-ring-opacity-5{--tw-ring-opacity:0.05!important}.yst-ring-offset-2{--tw-ring-offset-width:2px!important}.yst-ring-offset-primary-500{--tw-ring-offset-color:#a61e69!important}.yst-drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px #00000012) drop-shadow(0 2px 2px #0000000f)!important}.yst-drop-shadow-md,.yst-grayscale{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.yst-grayscale{--tw-grayscale:grayscale(100%)!important}.yst-filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.yst-transition-opacity{transition-duration:.15s!important;transition-property:opacity!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition{transition-duration:.15s!important;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-all{transition-duration:.15s!important;transition-property:all!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-colors{transition-duration:.15s!important;transition-property:color,background-color,border-color,fill,stroke,-webkit-text-decoration-color!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,-webkit-text-decoration-color!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-transform{transition-duration:.15s!important;transition-property:transform!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-\[width\]{transition-duration:.15s!important;transition-property:width!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-delay-200{transition-delay:.2s!important}.yst-delay-\[900ms\]{transition-delay:.9s!important}.yst-delay-100{transition-delay:.1s!important}.yst-duration-1000{transition-duration:1s!important}.yst-duration-200{transition-duration:.2s!important}.yst-duration-300{transition-duration:.3s!important}.yst-duration-100{transition-duration:.1s!important}.yst-duration-75{transition-duration:75ms!important}.yst-duration-150{transition-duration:.15s!important}.yst-duration-500{transition-duration:.5s!important}.yst-ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)!important}.yst-ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)!important}.yst-ease-linear{transition-timing-function:linear!important}.odd\:yst-bg-white:nth-child(odd){--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.even\:yst-bg-slate-50:nth-child(2n){--tw-bg-opacity:1!important;background-color:rgb(248 250 252/var(--tw-bg-opacity))!important}.focus-within\:yst-border-primary-500:focus-within{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important}.focus-within\:yst-outline-none:focus-within{outline:2px solid #0000!important;outline-offset:2px!important}.focus-within\:yst-ring-1:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.focus-within\:yst-ring-primary-500:focus-within{--tw-ring-opacity:1!important;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))!important}.hover\:yst-bg-slate-50:hover{--tw-bg-opacity:1!important;background-color:rgb(248 250 252/var(--tw-bg-opacity))!important}.hover\:yst-bg-gray-50:hover{--tw-bg-opacity:1!important;background-color:rgb(249 250 251/var(--tw-bg-opacity))!important}.hover\:yst-bg-\[\#f0f0f0\]:hover{--tw-bg-opacity:1!important;background-color:rgb(240 240 240/var(--tw-bg-opacity))!important}.hover\:yst-bg-white:hover{--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.hover\:yst-bg-primary-600:hover{--tw-bg-opacity:1!important;background-color:rgb(154 22 96/var(--tw-bg-opacity))!important}.hover\:yst-text-slate-900:hover{--tw-text-opacity:1!important;color:rgb(15 23 42/var(--tw-text-opacity))!important}.hover\:yst-text-slate-500:hover{--tw-text-opacity:1!important;color:rgb(100 116 139/var(--tw-text-opacity))!important}.hover\:yst-text-slate-800:hover{--tw-text-opacity:1!important;color:rgb(30 41 59/var(--tw-text-opacity))!important}.hover\:yst-text-white:hover{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.hover\:yst-text-primary-500:hover{--tw-text-opacity:1!important;color:rgb(166 30 105/var(--tw-text-opacity))!important}.hover\:yst-underline:hover{-webkit-text-decoration-line:underline!important;text-decoration-line:underline!important}.focus\:yst-border-primary-500:focus{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important}.focus\:yst-border-red-500:focus{--tw-border-opacity:1!important;border-color:rgb(239 68 68/var(--tw-border-opacity))!important}.focus\:yst-border-emerald-600:focus{--tw-border-opacity:1!important;border-color:rgb(5 150 105/var(--tw-border-opacity))!important}.focus\:yst-bg-primary-600:focus{--tw-bg-opacity:1!important;background-color:rgb(154 22 96/var(--tw-bg-opacity))!important}.focus\:yst-text-white:focus{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.focus\:yst-text-primary-500:focus{--tw-text-opacity:1!important;color:rgb(166 30 105/var(--tw-text-opacity))!important}.focus\:yst-shadow-\[0_0_3px_rgba\(8\2c 74\2c 103\2c 0\.8\)\]:focus{--tw-shadow:0 0 3px #084a67cc!important;--tw-shadow-colored:0 0 3px var(--tw-shadow-color)!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.focus\:yst-outline-none:focus{outline:2px solid #0000!important;outline-offset:2px!important}.focus\:yst-outline:focus{outline-style:solid!important}.focus\:yst-outline-\[1px\]:focus{outline-width:1px!important}.focus\:-yst-outline-offset-1:focus{outline-offset:-1px!important}.focus\:yst-outline-\[color\:\#0066cd\]:focus{outline-color:#0066cd!important}.focus\:yst-ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important}.focus\:yst-ring-1:focus,.focus\:yst-ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.focus\:yst-ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important}.focus\:yst-ring-inset:focus{--tw-ring-inset:inset!important}.focus\:yst-ring-primary-500:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))!important}.focus\:yst-ring-white:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity))!important}.focus\:yst-ring-red-500:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity))!important}.focus\:yst-ring-emerald-600:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(5 150 105/var(--tw-ring-opacity))!important}.focus\:yst-ring-offset-1:focus{--tw-ring-offset-width:1px!important}.focus\:yst-ring-offset-2:focus{--tw-ring-offset-width:2px!important}.focus\:yst-ring-offset-transparent:focus{--tw-ring-offset-color:#0000!important}.focus\:yst-ring-offset-primary-500:focus{--tw-ring-offset-color:#a61e69!important}.yst-group:hover .group-hover\:yst-bg-primary-500{--tw-bg-opacity:1!important;background-color:rgb(166 30 105/var(--tw-bg-opacity))!important}.yst-group:hover .group-hover\:yst-bg-primary-200{--tw-bg-opacity:1!important;background-color:rgb(224 179 204/var(--tw-bg-opacity))!important}.yst-group:hover .group-hover\:yst-text-slate-500{--tw-text-opacity:1!important;color:rgb(100 116 139/var(--tw-text-opacity))!important}.yst-group:hover .group-hover\:yst-text-white{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.yst-group:hover .group-hover\:yst-text-primary-800{--tw-text-opacity:1!important;color:rgb(131 8 78/var(--tw-text-opacity))!important}[dir=rtl] .rtl\:yst-rotate-180{--tw-rotate:180deg!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}@media not all and (min-width:640px){.max-sm\:yst-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}}@media (min-width:640px){.sm\:yst-mx-0{margin-left:0!important;margin-right:0!important}.sm\:yst-mb-0{margin-bottom:0!important}.sm\:yst-ml-3{margin-left:.75rem!important}.sm\:yst-mt-0{margin-top:0!important}.sm\:yst-ml-4{margin-left:1rem!important}.sm\:yst-flex{display:flex!important}.sm\:yst-h-10{height:2.5rem!important}.sm\:yst-w-auto{width:auto!important}.sm\:yst-w-10{width:2.5rem!important}.sm\:yst-translate-y-0{--tw-translate-y:0px!important}.sm\:yst-scale-95,.sm\:yst-translate-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.sm\:yst-scale-95{--tw-scale-x:.95!important;--tw-scale-y:.95!important}.sm\:yst-scale-100{--tw-scale-x:1!important;--tw-scale-y:1!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.sm\:yst-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.sm\:yst-flex-row-reverse{flex-direction:row-reverse!important}.sm\:yst-items-start{align-items:flex-start!important}.sm\:yst-text-left{text-align:left!important}.sm\:yst-text-sm{font-size:.8125rem!important}}@media (min-width:768px){.md\:yst-absolute{position:absolute!important}.md\:yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.md\:yst-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.md\:yst-flex-row{flex-direction:row!important}}@media (min-width:783px){.min-\[783px\]\:yst-block{display:block!important}.min-\[783px\]\:yst-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}.min-\[783px\]\:yst-p-8{padding:2rem!important}}@media (min-width:1024px){.lg\:yst-col-span-2{grid-column:span 2/span 2!important}.lg\:yst-mt-0{margin-top:0!important}.lg\:yst-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.lg\:yst-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.lg\:yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.lg\:yst-gap-12{gap:3rem!important}}@media (min-width:1280px){.xl\:yst-fixed{position:fixed!important}.xl\:yst-right-8{right:2rem!important}.xl\:yst-col-span-2{grid-column:span 2/span 2!important}.xl\:yst-mb-0{margin-bottom:0!important}.xl\:yst-mt-0{margin-top:0!important}.xl\:yst-w-\[16rem\]{width:16rem!important}.xl\:yst-max-w-3xl{max-width:48rem!important}.xl\:yst-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.xl\:yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.xl\:yst-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}.xl\:yst-gap-12{gap:3rem!important}.xl\:yst-pr-\[17\.5rem\]{padding-right:17.5rem!important}}@media (min-width:1536px){.\32xl\:yst-col-span-2{grid-column:span 2/span 2!important}.\32xl\:yst-mt-0{margin-top:0!important}.\32xl\:yst-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.\32xl\:yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.\32xl\:yst-gap-12{gap:3rem!important}}@media (min-width:1800px){.min-\[1800px\]\:yst-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/toggle-switch-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/toggle-switch-2330-rtl.css new file mode 100644 index 00000000..24fb5bb5 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/toggle-switch-2330-rtl.css @@ -0,0 +1 @@ +.switch-light span span,.switch-toggle a{display:none}@media only screen{.switch-light,.switch-toggle{display:block;padding:0!important;position:relative}.switch-light:after,.switch-toggle:after{clear:both;content:"";display:table}.switch-light *,.switch-light :after,.switch-light :before,.switch-toggle *,.switch-toggle :after,.switch-toggle :before{box-sizing:border-box}.switch-light a,.switch-toggle a{display:block;transition:all .2s ease-out}.switch-light label,.switch-light-visual-label,.switch-light>span,.switch-toggle label,.switch-toggle>span{line-height:2;vertical-align:middle}.switch-light input{opacity:0;position:absolute;z-index:3}.switch-light input[type=checkbox].disabled,.switch-light input[type=checkbox].disabled:checked:before,.switch-light input[type=checkbox]:disabled,.switch-light input[type=checkbox]:disabled:checked:before{opacity:0}.switch-light input:checked~span a{left:0}.switch-light strong{font-weight:inherit}.switch-light>span{min-height:2em;padding:0;position:relative;text-align:right}.switch-light span span{display:block;float:right;position:relative;text-align:center;-webkit-user-select:none;user-select:none;width:50%;z-index:2}.switch-light a{display:block;height:100%;padding:0;position:absolute;left:50%;top:0;width:50%;z-index:1}.switch-toggle input{right:0;opacity:0;position:absolute}.switch-toggle input[type=radio].disabled,.switch-toggle input[type=radio].disabled:checked:before,.switch-toggle input[type=radio]:disabled,.switch-toggle input[type=radio]:disabled:checked:before{opacity:0}.switch-toggle input+label{float:right;margin:0;padding:0 .5em;text-align:center}.switch-toggle input:checked+label{position:relative;z-index:2}.switch-toggle a{height:100%;right:0;padding:0;position:absolute;top:0;width:10px;z-index:1}.switch-toggle .yoast-button-upsell{right:20px;position:relative}.switch-toggle label:nth-child(2):nth-last-child(4),.switch-toggle label:nth-child(2):nth-last-child(4)~a,.switch-toggle label:nth-child(2):nth-last-child(4)~label{width:50%}.switch-toggle label:nth-child(2):nth-last-child(4)~input:checked:nth-child(3)+label~a{right:50%}.switch-toggle label:nth-child(2):nth-last-child(6),.switch-toggle label:nth-child(2):nth-last-child(6)~a,.switch-toggle label:nth-child(2):nth-last-child(6)~label{width:33.33%}.switch-toggle label:nth-child(2):nth-last-child(6)~input:checked:nth-child(3)+label~a{right:33.33%}.switch-toggle label:nth-child(2):nth-last-child(6)~input:checked:nth-child(5)+label~a{right:66.66%}.switch-toggle label:nth-child(2):nth-last-child(8),.switch-toggle label:nth-child(2):nth-last-child(8)~a,.switch-toggle label:nth-child(2):nth-last-child(8)~label{width:25%}.switch-toggle label:nth-child(2):nth-last-child(8)~input:checked:nth-child(3)+label~a{right:25%}.switch-toggle label:nth-child(2):nth-last-child(8)~input:checked:nth-child(5)+label~a{right:50%}.switch-toggle label:nth-child(2):nth-last-child(8)~input:checked:nth-child(7)+label~a{right:75%}.switch-toggle label:nth-child(2):nth-last-child(10),.switch-toggle label:nth-child(2):nth-last-child(10)~a,.switch-toggle label:nth-child(2):nth-last-child(10)~label{width:20%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(3)+label~a{right:20%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(5)+label~a{right:40%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(7)+label~a{right:60%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(9)+label~a{right:80%}.switch-toggle label:nth-child(2):nth-last-child(12),.switch-toggle label:nth-child(2):nth-last-child(12)~a,.switch-toggle label:nth-child(2):nth-last-child(12)~label{width:16.6%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(3)+label~a{right:16.6%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(5)+label~a{right:33.2%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(7)+label~a{right:49.8%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(9)+label~a{right:66.4%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(11)+label~a{right:83%}.switch-candy a{box-shadow:0 1px 1px #0003,inset 0 1px 1px #ffffff73}}@media only screen and (-webkit-max-device-pixel-ratio:2) and (max-device-width:80em){.switch-light,.switch-toggle{-webkit-animation:webkitSiblingBugfix 1s infinite}}.fieldset-switch-toggle{width:400px}.fieldset-switch-toggle label{float:none}.fieldset-switch-toggle .yoast-button-upsell{background-color:green;height:16px;overflow:hidden;width:20px}@media only screen{.fieldset-switch-toggle legend{box-sizing:border-box;float:right;font-weight:600;line-height:2;margin:8px 0;min-width:200px;padding-left:16px;vertical-align:middle}.fieldset-switch-toggle .disabled-note{clear:both}.switch-container__has-help .switch-light-visual-label,.switch-container__has-help legend{float:right;min-width:0;padding-left:0}.switch-container__has-help .yoast_help.yoast-help-button{margin:8px 2px 0 0}.switch-light.switch-yoast-seo>span,.switch-toggle.switch-yoast-seo{background-color:#dcdcdc;border:1px solid #ccc;border-radius:.5em;box-shadow:inset 0 2px 4px #00000026;width:250px}.switch-light.switch-yoast-seo,.switch-toggle.switch-yoast-seo{clear:both;float:right}.switch-light.switch-yoast-seo>span{display:inline-block;overflow:visible}.switch-light.switch-yoast-seo a,.switch-toggle.switch-yoast-seo a{background:#a4286a;border:1px solid #b5b5b5;border-radius:.5em}.switch-light.switch-yoast-seo input.disabled+span a,.switch-light.switch-yoast-seo input.disabled:checked+span a,.switch-light.switch-yoast-seo input:disabled+span a,.switch-light.switch-yoast-seo input:disabled:checked+span a,.switch-toggle.switch-yoast-seo input.disabled+a,.switch-toggle.switch-yoast-seo input.disabled~a,.switch-toggle.switch-yoast-seo input:disabled+a,.switch-toggle.switch-yoast-seo input:disabled~a{background:#9b9b9b;border:0}.switch-light.switch-yoast-seo input:focus+label,.switch-light.switch-yoast-seo input:focus~span a,.switch-toggle.switch-yoast-seo input:focus+label,.switch-toggle.switch-yoast-seo input:focus~span a{outline:none}.switch-light.switch-yoast-seo input:focus~span a,.switch-toggle.switch-yoast-seo input:focus~a{border-color:#5b9dd9!important;box-shadow:0 0 2px #0073aacc!important}.switch-light.switch-yoast-seo input:checked~span a,.switch-toggle.switch-yoast-seo input:checked~span a{background:#a4286a;border:1px solid #b5b5b5}.switch-light.switch-yoast-seo input:checked~span span:first-child,.switch-light.switch-yoast-seo span span,.switch-toggle.switch-yoast-seo label{color:#333;font-weight:inherit;text-shadow:none}.switch-candy.switch-yoast-seo input:checked+label,.switch-candy.switch-yoast-seo input:checked~span span:nth-child(2),.switch-candy.switch-yoast-seo input~span span:first-child{color:#fff;text-shadow:none}.switch-candy.switch-yoast-seo input+label:after{content:"";display:block;height:100%;right:0;position:absolute;top:0;width:100%;z-index:3}.switch-candy.switch-yoast-seo input:checked+label:after{content:none}.switch-light.switch-yoast-seo-reverse input:checked~span a{right:0}.switch-light.switch-yoast-seo-reverse a{right:50%}.switch-light.switch-yoast-seo-reverse span span{float:left}.switch-toggle.switch-yoast-seo label,label.switch-light.switch-yoast-seo{cursor:pointer;margin-right:0}.switch-light.switch-yoast-seo input.disabled+span,.switch-light.switch-yoast-seo input:disabled+span,.switch-toggle.switch-yoast-seo input.disabled+label,.switch-toggle.switch-yoast-seo input:disabled+label{cursor:not-allowed}.switch-yoast-seo .switch-yoast-seo-jaws-a11y{display:block;height:1px;margin-bottom:-1px;overflow:hidden}.switch-light.switch-yoast-seo label code,.switch-toggle.switch-yoast-seo label code{background-color:inherit;vertical-align:top}.switch-light-visual-label{display:block;font-weight:600;line-height:2;margin:8px 0}.switch-light-visual-label__strong{font-weight:600}.switch-container{clear:both;margin:0 0 .8em}.switch-container.premium-upsell .clear{display:none}.switch-container.premium-upsell{align-items:end;clear:both;display:grid;grid-template-columns:280px 1fr;margin:0 0 .8em}.switch-container.premium-upsell .yoast-help-panel{width:520px}@media screen and (max-width:600px){.switch-container.premium-upsell{clear:both;display:grid;grid-template-columns:1fr;margin:0 0 .8em}.switch-container.premium-upsell .yoast-help-panel{width:unset}}.switch-container.premium-upsell .yoast-button{clear:both;margin-top:8px;width:-moz-fit-content;width:fit-content}.switch-container+.switch-container{margin-top:8px}.switch-container+p{margin:0 0 16px}} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/toggle-switch-2330.css b/wp-content/plugins/wordpress-seo/css/dist/toggle-switch-2330.css new file mode 100644 index 00000000..c2154611 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/toggle-switch-2330.css @@ -0,0 +1 @@ +.switch-light span span,.switch-toggle a{display:none}@media only screen{.switch-light,.switch-toggle{display:block;padding:0!important;position:relative}.switch-light:after,.switch-toggle:after{clear:both;content:"";display:table}.switch-light *,.switch-light :after,.switch-light :before,.switch-toggle *,.switch-toggle :after,.switch-toggle :before{box-sizing:border-box}.switch-light a,.switch-toggle a{display:block;transition:all .2s ease-out}.switch-light label,.switch-light-visual-label,.switch-light>span,.switch-toggle label,.switch-toggle>span{line-height:2;vertical-align:middle}.switch-light input{opacity:0;position:absolute;z-index:3}.switch-light input[type=checkbox].disabled,.switch-light input[type=checkbox].disabled:checked:before,.switch-light input[type=checkbox]:disabled,.switch-light input[type=checkbox]:disabled:checked:before{opacity:0}.switch-light input:checked~span a{right:0}.switch-light strong{font-weight:inherit}.switch-light>span{min-height:2em;padding:0;position:relative;text-align:left}.switch-light span span{display:block;float:left;position:relative;text-align:center;-webkit-user-select:none;user-select:none;width:50%;z-index:2}.switch-light a{display:block;height:100%;padding:0;position:absolute;right:50%;top:0;width:50%;z-index:1}.switch-toggle input{left:0;opacity:0;position:absolute}.switch-toggle input[type=radio].disabled,.switch-toggle input[type=radio].disabled:checked:before,.switch-toggle input[type=radio]:disabled,.switch-toggle input[type=radio]:disabled:checked:before{opacity:0}.switch-toggle input+label{float:left;margin:0;padding:0 .5em;text-align:center}.switch-toggle input:checked+label{position:relative;z-index:2}.switch-toggle a{height:100%;left:0;padding:0;position:absolute;top:0;width:10px;z-index:1}.switch-toggle .yoast-button-upsell{left:20px;position:relative}.switch-toggle label:nth-child(2):nth-last-child(4),.switch-toggle label:nth-child(2):nth-last-child(4)~a,.switch-toggle label:nth-child(2):nth-last-child(4)~label{width:50%}.switch-toggle label:nth-child(2):nth-last-child(4)~input:checked:nth-child(3)+label~a{left:50%}.switch-toggle label:nth-child(2):nth-last-child(6),.switch-toggle label:nth-child(2):nth-last-child(6)~a,.switch-toggle label:nth-child(2):nth-last-child(6)~label{width:33.33%}.switch-toggle label:nth-child(2):nth-last-child(6)~input:checked:nth-child(3)+label~a{left:33.33%}.switch-toggle label:nth-child(2):nth-last-child(6)~input:checked:nth-child(5)+label~a{left:66.66%}.switch-toggle label:nth-child(2):nth-last-child(8),.switch-toggle label:nth-child(2):nth-last-child(8)~a,.switch-toggle label:nth-child(2):nth-last-child(8)~label{width:25%}.switch-toggle label:nth-child(2):nth-last-child(8)~input:checked:nth-child(3)+label~a{left:25%}.switch-toggle label:nth-child(2):nth-last-child(8)~input:checked:nth-child(5)+label~a{left:50%}.switch-toggle label:nth-child(2):nth-last-child(8)~input:checked:nth-child(7)+label~a{left:75%}.switch-toggle label:nth-child(2):nth-last-child(10),.switch-toggle label:nth-child(2):nth-last-child(10)~a,.switch-toggle label:nth-child(2):nth-last-child(10)~label{width:20%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(3)+label~a{left:20%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(5)+label~a{left:40%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(7)+label~a{left:60%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(9)+label~a{left:80%}.switch-toggle label:nth-child(2):nth-last-child(12),.switch-toggle label:nth-child(2):nth-last-child(12)~a,.switch-toggle label:nth-child(2):nth-last-child(12)~label{width:16.6%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(3)+label~a{left:16.6%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(5)+label~a{left:33.2%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(7)+label~a{left:49.8%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(9)+label~a{left:66.4%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(11)+label~a{left:83%}.switch-candy a{box-shadow:0 1px 1px #0003,inset 0 1px 1px #ffffff73}}@media only screen and (-webkit-max-device-pixel-ratio:2) and (max-device-width:80em){.switch-light,.switch-toggle{-webkit-animation:webkitSiblingBugfix 1s infinite}}.fieldset-switch-toggle{width:400px}.fieldset-switch-toggle label{float:none}.fieldset-switch-toggle .yoast-button-upsell{background-color:green;height:16px;overflow:hidden;width:20px}@media only screen{.fieldset-switch-toggle legend{box-sizing:border-box;float:left;font-weight:600;line-height:2;margin:8px 0;min-width:200px;padding-right:16px;vertical-align:middle}.fieldset-switch-toggle .disabled-note{clear:both}.switch-container__has-help .switch-light-visual-label,.switch-container__has-help legend{float:left;min-width:0;padding-right:0}.switch-container__has-help .yoast_help.yoast-help-button{margin:8px 0 0 2px}.switch-light.switch-yoast-seo>span,.switch-toggle.switch-yoast-seo{background-color:#dcdcdc;border:1px solid #ccc;border-radius:.5em;box-shadow:inset 0 2px 4px #00000026;width:250px}.switch-light.switch-yoast-seo,.switch-toggle.switch-yoast-seo{clear:both;float:left}.switch-light.switch-yoast-seo>span{display:inline-block;overflow:visible}.switch-light.switch-yoast-seo a,.switch-toggle.switch-yoast-seo a{background:#a4286a;border:1px solid #b5b5b5;border-radius:.5em}.switch-light.switch-yoast-seo input.disabled+span a,.switch-light.switch-yoast-seo input.disabled:checked+span a,.switch-light.switch-yoast-seo input:disabled+span a,.switch-light.switch-yoast-seo input:disabled:checked+span a,.switch-toggle.switch-yoast-seo input.disabled+a,.switch-toggle.switch-yoast-seo input.disabled~a,.switch-toggle.switch-yoast-seo input:disabled+a,.switch-toggle.switch-yoast-seo input:disabled~a{background:#9b9b9b;border:0}.switch-light.switch-yoast-seo input:focus+label,.switch-light.switch-yoast-seo input:focus~span a,.switch-toggle.switch-yoast-seo input:focus+label,.switch-toggle.switch-yoast-seo input:focus~span a{outline:none}.switch-light.switch-yoast-seo input:focus~span a,.switch-toggle.switch-yoast-seo input:focus~a{border-color:#5b9dd9!important;box-shadow:0 0 2px #0073aacc!important}.switch-light.switch-yoast-seo input:checked~span a,.switch-toggle.switch-yoast-seo input:checked~span a{background:#a4286a;border:1px solid #b5b5b5}.switch-light.switch-yoast-seo input:checked~span span:first-child,.switch-light.switch-yoast-seo span span,.switch-toggle.switch-yoast-seo label{color:#333;font-weight:inherit;text-shadow:none}.switch-candy.switch-yoast-seo input:checked+label,.switch-candy.switch-yoast-seo input:checked~span span:nth-child(2),.switch-candy.switch-yoast-seo input~span span:first-child{color:#fff;text-shadow:none}.switch-candy.switch-yoast-seo input+label:after{content:"";display:block;height:100%;left:0;position:absolute;top:0;width:100%;z-index:3}.switch-candy.switch-yoast-seo input:checked+label:after{content:none}.switch-light.switch-yoast-seo-reverse input:checked~span a{left:0}.switch-light.switch-yoast-seo-reverse a{left:50%}.switch-light.switch-yoast-seo-reverse span span{float:right}.switch-toggle.switch-yoast-seo label,label.switch-light.switch-yoast-seo{cursor:pointer;margin-left:0}.switch-light.switch-yoast-seo input.disabled+span,.switch-light.switch-yoast-seo input:disabled+span,.switch-toggle.switch-yoast-seo input.disabled+label,.switch-toggle.switch-yoast-seo input:disabled+label{cursor:not-allowed}.switch-yoast-seo .switch-yoast-seo-jaws-a11y{display:block;height:1px;margin-bottom:-1px;overflow:hidden}.switch-light.switch-yoast-seo label code,.switch-toggle.switch-yoast-seo label code{background-color:inherit;vertical-align:top}.switch-light-visual-label{display:block;font-weight:600;line-height:2;margin:8px 0}.switch-light-visual-label__strong{font-weight:600}.switch-container{clear:both;margin:0 0 .8em}.switch-container.premium-upsell .clear{display:none}.switch-container.premium-upsell{align-items:end;clear:both;display:grid;grid-template-columns:280px 1fr;margin:0 0 .8em}.switch-container.premium-upsell .yoast-help-panel{width:520px}@media screen and (max-width:600px){.switch-container.premium-upsell{clear:both;display:grid;grid-template-columns:1fr;margin:0 0 .8em}.switch-container.premium-upsell .yoast-help-panel{width:unset}}.switch-container.premium-upsell .yoast-button{clear:both;margin-top:8px;width:-moz-fit-content;width:fit-content}.switch-container+.switch-container{margin-top:8px}.switch-container+p{margin:0 0 16px}} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/tooltips-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/tooltips-2330-rtl.css new file mode 100644 index 00000000..de072300 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/tooltips-2330-rtl.css @@ -0,0 +1 @@ +.yoast-tooltip{position:relative}button.yoast-tooltip{overflow:visible}.yoast-tooltip:after{word-wrap:break-word;-webkit-font-smoothing:subpixel-antialiased;background:#000c;border-radius:3px;color:#fff;content:attr(aria-label);display:none;font:normal normal 11px/1.45454545 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;letter-spacing:normal;opacity:0;padding:6px 8px 5px;pointer-events:none;position:absolute;text-align:center;text-decoration:none;text-shadow:none;text-transform:none;white-space:pre;z-index:1000000}.yoast-tooltip-alt:after{content:attr(data-label)}.yoast-tooltip:before{border:5px solid #0000;color:#000c;content:"\00a0";display:none;height:0;opacity:0;pointer-events:none;position:absolute;width:0;z-index:1000001}@keyframes yoast-tooltip-appear{0%{opacity:0}to{opacity:1}}.yoast-tooltip:active:after,.yoast-tooltip:active:before,.yoast-tooltip:focus:after,.yoast-tooltip:focus:before,.yoast-tooltip:hover:after,.yoast-tooltip:hover:before{animation-duration:.1s;animation-fill-mode:forwards;animation-name:yoast-tooltip-appear;animation-timing-function:ease-in;display:inline-block;text-decoration:none}.yoast-tooltip-no-delay:active:after,.yoast-tooltip-no-delay:active:before,.yoast-tooltip-no-delay:focus:after,.yoast-tooltip-no-delay:focus:before,.yoast-tooltip-no-delay:hover:after,.yoast-tooltip-no-delay:hover:before{animation:none;opacity:1}.yoast-tooltip-multiline:active:after,.yoast-tooltip-multiline:focus:after,.yoast-tooltip-multiline:hover:after{display:table-cell}.yoast-tooltip-s:after,.yoast-tooltip-se:after,.yoast-tooltip-sw:after{margin-top:5px;left:50%;top:100%}.yoast-tooltip-s:before,.yoast-tooltip-se:before,.yoast-tooltip-sw:before{border-bottom-color:#000c;bottom:-5px;margin-left:-5px;left:50%;top:auto}.yoast-tooltip-se:after{right:50%;margin-right:-15px;left:auto}.yoast-tooltip-sw:after{margin-left:-15px}.yoast-tooltip-n:after,.yoast-tooltip-ne:after,.yoast-tooltip-nw:after{bottom:100%;margin-bottom:5px;left:50%}.yoast-tooltip-n:before,.yoast-tooltip-ne:before,.yoast-tooltip-nw:before{border-top-color:#000c;bottom:auto;margin-left:-5px;left:50%;top:-5px}.yoast-tooltip-ne:after{right:50%;margin-right:-15px;left:auto}.yoast-tooltip-nw:after{margin-left:-15px}.yoast-tooltip-n:after,.yoast-tooltip-s:after{transform:translateX(-50%)}.yoast-tooltip-w:after{bottom:50%;margin-left:5px;left:100%;transform:translateY(50%)}.yoast-tooltip-w:before{border-right-color:#000c;bottom:50%;right:-5px;margin-top:-5px;top:50%}.yoast-tooltip-e:after{bottom:50%;right:100%;margin-right:5px;transform:translateY(50%)}.yoast-tooltip-e:before{border-left-color:#000c;bottom:50%;margin-top:-5px;left:-5px;top:50%}.yoast-tooltip-multiline:after{word-wrap:normal;border-collapse:initial;max-width:250px;white-space:pre-line;width:250px;width:max-content;word-break:break-word}.yoast-tooltip-multiline.yoast-tooltip-n:after,.yoast-tooltip-multiline.yoast-tooltip-s:after{right:50%;left:auto;transform:translateX(50%)}.yoast-tooltip-multiline.yoast-tooltip-e:after,.yoast-tooltip-multiline.yoast-tooltip-w:after{left:100%}@media screen and (min-width:0\0){.yoast-tooltip-multiline:after{width:250px}}.yoast-tooltip-sticky:after,.yoast-tooltip-sticky:before{display:inline-block}.yoast-tooltip-sticky.yoast-tooltip-multiline:after{display:table-cell}@media only screen and (-moz-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.yoast-tooltip-w:after{margin-left:4.5px}}.yoast-tooltip.yoast-tooltip-hidden:after,.yoast-tooltip.yoast-tooltip-hidden:before{display:none} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/tooltips-2330.css b/wp-content/plugins/wordpress-seo/css/dist/tooltips-2330.css new file mode 100644 index 00000000..9023ed33 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/tooltips-2330.css @@ -0,0 +1 @@ +.yoast-tooltip{position:relative}button.yoast-tooltip{overflow:visible}.yoast-tooltip:after{word-wrap:break-word;-webkit-font-smoothing:subpixel-antialiased;background:#000c;border-radius:3px;color:#fff;content:attr(aria-label);display:none;font:normal normal 11px/1.45454545 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;letter-spacing:normal;opacity:0;padding:6px 8px 5px;pointer-events:none;position:absolute;text-align:center;text-decoration:none;text-shadow:none;text-transform:none;white-space:pre;z-index:1000000}.yoast-tooltip-alt:after{content:attr(data-label)}.yoast-tooltip:before{border:5px solid #0000;color:#000c;content:"\00a0";display:none;height:0;opacity:0;pointer-events:none;position:absolute;width:0;z-index:1000001}@keyframes yoast-tooltip-appear{0%{opacity:0}to{opacity:1}}.yoast-tooltip:active:after,.yoast-tooltip:active:before,.yoast-tooltip:focus:after,.yoast-tooltip:focus:before,.yoast-tooltip:hover:after,.yoast-tooltip:hover:before{animation-duration:.1s;animation-fill-mode:forwards;animation-name:yoast-tooltip-appear;animation-timing-function:ease-in;display:inline-block;text-decoration:none}.yoast-tooltip-no-delay:active:after,.yoast-tooltip-no-delay:active:before,.yoast-tooltip-no-delay:focus:after,.yoast-tooltip-no-delay:focus:before,.yoast-tooltip-no-delay:hover:after,.yoast-tooltip-no-delay:hover:before{animation:none;opacity:1}.yoast-tooltip-multiline:active:after,.yoast-tooltip-multiline:focus:after,.yoast-tooltip-multiline:hover:after{display:table-cell}.yoast-tooltip-s:after,.yoast-tooltip-se:after,.yoast-tooltip-sw:after{margin-top:5px;right:50%;top:100%}.yoast-tooltip-s:before,.yoast-tooltip-se:before,.yoast-tooltip-sw:before{border-bottom-color:#000c;bottom:-5px;margin-right:-5px;right:50%;top:auto}.yoast-tooltip-se:after{left:50%;margin-left:-15px;right:auto}.yoast-tooltip-sw:after{margin-right:-15px}.yoast-tooltip-n:after,.yoast-tooltip-ne:after,.yoast-tooltip-nw:after{bottom:100%;margin-bottom:5px;right:50%}.yoast-tooltip-n:before,.yoast-tooltip-ne:before,.yoast-tooltip-nw:before{border-top-color:#000c;bottom:auto;margin-right:-5px;right:50%;top:-5px}.yoast-tooltip-ne:after{left:50%;margin-left:-15px;right:auto}.yoast-tooltip-nw:after{margin-right:-15px}.yoast-tooltip-n:after,.yoast-tooltip-s:after{transform:translateX(50%)}.yoast-tooltip-w:after{bottom:50%;margin-right:5px;right:100%;transform:translateY(50%)}.yoast-tooltip-w:before{border-left-color:#000c;bottom:50%;left:-5px;margin-top:-5px;top:50%}.yoast-tooltip-e:after{bottom:50%;left:100%;margin-left:5px;transform:translateY(50%)}.yoast-tooltip-e:before{border-right-color:#000c;bottom:50%;margin-top:-5px;right:-5px;top:50%}.yoast-tooltip-multiline:after{word-wrap:normal;border-collapse:initial;max-width:250px;white-space:pre-line;width:250px;width:max-content;word-break:break-word}.yoast-tooltip-multiline.yoast-tooltip-n:after,.yoast-tooltip-multiline.yoast-tooltip-s:after{left:50%;right:auto;transform:translateX(-50%)}.yoast-tooltip-multiline.yoast-tooltip-e:after,.yoast-tooltip-multiline.yoast-tooltip-w:after{right:100%}@media screen and (min-width:0\0){.yoast-tooltip-multiline:after{width:250px}}.yoast-tooltip-sticky:after,.yoast-tooltip-sticky:before{display:inline-block}.yoast-tooltip-sticky.yoast-tooltip-multiline:after{display:table-cell}@media only screen and (-moz-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.yoast-tooltip-w:after{margin-right:4.5px}}.yoast-tooltip.yoast-tooltip-hidden:after,.yoast-tooltip.yoast-tooltip-hidden:before{display:none} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/workouts-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/workouts-2330-rtl.css new file mode 100644 index 00000000..7b0376b4 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/workouts-2330-rtl.css @@ -0,0 +1 @@ +#wpseo-workouts-container-free h1,#wpseo-workouts-container-free h3{color:#a4286a;font-weight:500}#wpseo-workouts-container-free h3{font-size:18px;line-height:24px}.card.card-small h3{min-height:48px}#wpseo-workouts-container-free h2{font-size:12px;text-transform:uppercase}#wpseo-workouts-container-free #workouts-page-description{font-size:16px;max-width:600px}.workflow tr.cornerstone{font-weight:700}#wpseo-workouts-container-free hr{margin-bottom:24px;margin-top:8px}#wpseo-workouts-container-free progress{margin:16px 0 8px}#wpseo-workouts-container-free div.card{border-color:#0003;border-radius:8px;border-width:1px;box-shadow:0 1px 3px 0 #0000001a,0 1px 2px 0 #0000000f;max-width:720px;padding:24px;width:100%}#wpseo-workouts-container-free div.card>h2{margin:0}#wpseo-workouts-container-free div.card.card-small{display:flex;flex-direction:column;max-width:320px}#wpseo-workouts-container-free div.card.card-small svg{height:146px;width:204px}#wpseo-workouts-container-free div.card.card-small svg *{height:100%;width:100%}#wpseo-workouts-container-free div.card.card-small>span{margin-top:auto}#wpseo-workouts-container-free table button{margin:2px}.workflow{counter-reset:line-number;list-style:none;margin-right:48px}.workflow li li{counter-increment:none;line-height:19px;margin-bottom:8px}.workflow li.step{counter-increment:line-number;padding-bottom:16px;position:relative}.workflow .yoast-button.yoast-button--finished{opacity:.5}.workflow .finish-button-section .finish-button-saved{color:#6ea029;grid-column-end:3;grid-column-start:3;margin-right:10px;position:relative}.workflow .finish-button-section .finish-button-saved:before{background:var(--yoast-svg-icon-check);background-size:18px 13px;content:"";height:13px;right:-18px;position:absolute;top:2px;width:18px}.workflow li.step>.yoast-button.orphaned-summary{display:initial;margin:0}.yoast .yoast-button--arrow-down{display:inline-block;flex-shrink:0;height:16px;margin:0 6px 0 -2px;width:16px}.workflow>li.step:before{background:#a4286a;bottom:-20px;content:"";right:-33px;position:absolute;top:0;width:2px}.workflow .extra-list-content{position:relative}.workflow>li.step:last-of-type:before{display:none}.workflow>li.step:after{background:#fff;border:2px solid #a4286a;border-radius:100%;color:#a4286a;content:counter(line-number);display:block;height:28px;right:-48px;line-height:28px;position:absolute;text-align:center;top:-8px;width:28px}.workflow li.step.finished:after{background:url("data:image/svg+xml;charset=utf-8,%3Csvg width='24' fill='none' stroke='%23FFF' height='24' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m5 13 4 4L19 7'/%3E%3C/svg%3E") #a4286a;background-position:50%;background-repeat:no-repeat;background-size:20px 20px;content:""}.workflow li.step.finished.faded p,.workflow li.step.finished.faded table{opacity:.5}.workflow li.step img{max-width:100%}.workflow li.step img.workflow__image{max-height:100px;max-width:100px}.workflow li.step.yoast-fadeout:before{background:linear-gradient(-180deg,#a4286a,#fff 75%);display:block}.workflow li.step #react-select-2-input{box-shadow:none!important}.workflows__index{display:flex;flex-wrap:wrap;gap:16px}.workflows__index .yoast-button{width:100%}table.yoast_help.yoast_link_suggestions thead td{padding:16px 8px}table.yoast_help.yoast_link_suggestions td{vertical-align:middle}table.yoast_help th.divider{text-align:center}.workflow table.yoast_help td{vertical-align:middle}.workflow table.yoast_help.yoast_link_suggestions td div{display:inline-block}.workflow table.yoast_help.yoast_link_suggestions td strong{display:inline-block;margin-left:8px}.components-modal__header{height:72px;padding:0 24px}.components-modal__header .components-modal__header-heading{color:#a4286a;font-size:20px;font-weight:400;line-height:1.2;margin:0}.components-modal__header .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-left:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.components-modal__content{padding:0 24px 24px}.components-modal__content input[type=text]{max-width:400px;width:100%}.components-modal__frame.yoast__workout{max-width:720px}.yoast__redirect-suggestions{line-height:2}.components-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#00000059;bottom:0;right:0;position:fixed;left:0;top:0;z-index:100000}@media (prefers-reduced-motion:reduce){.components-modal__screen-overlay{animation-delay:0s;animation-duration:1ms}}.components-modal__frame{background:#fff;border-radius:2px;bottom:0;box-shadow:0 10px 10px #00000040;box-sizing:border-box;right:0;margin:0;overflow:auto;position:absolute;left:0;top:0}@media (min-width:600px){.components-modal__frame{animation:components-modal__appear-animation .1s ease-out;animation-fill-mode:forwards;bottom:auto;right:50%;max-height:90%;max-width:calc(100% - 32px);min-width:360px;left:auto;top:50%;transform:translate(50%,-50%)}}@media (min-width:600px) and (prefers-reduced-motion:reduce){.components-modal__frame{animation-delay:0s;animation-duration:1ms}}@keyframes components-modal__appear-animation{0%{margin-top:32px}to{margin-top:0}}.components-modal__header{align-items:center;background:#fff;border-bottom:1px solid #ddd;box-sizing:border-box;display:flex;flex-direction:row;height:60px;justify-content:space-between;margin:0 -32px 24px;padding:0 32px;position:relative;position:sticky;top:0;z-index:10}@supports (-ms-ime-align:auto){.components-modal__header{position:fixed;width:100%}}.components-modal__header .components-modal__header-heading{font-size:1rem;font-weight:600}.components-modal__header h1{line-height:1;margin:0}.components-modal__header .components-button{right:8px;position:relative}.components-modal__header-heading-container{align-items:center;display:flex;flex-direction:row;flex-grow:1;justify-content:left}.components-modal__header-icon-container{display:inline-block}.components-modal__header-icon-container svg{max-height:36px;max-width:36px;padding:8px}.components-modal__content{box-sizing:border-box;height:100%;padding:0 32px 24px}@supports (-ms-ime-align:auto){.components-modal__content{padding-top:60px}}.workflow li.step h4{font-size:14px;font-weight:600;margin:24px 0 0}.workflow .yoast-social-profiles-input-fields{margin:10px 0 20px}.workflow .tracking-radiobuttons{line-height:19px;margin:0 0 20px}.workflow .yoast-tracking{list-style-position:inside;list-style-type:disc;padding:inherit}.yoast-list--usp{margin-bottom:16px;padding-right:24px}.yoast-list--usp li{margin-bottom:16px;position:relative}.yoast-list--usp li:before{background:var(--yoast-svg-icon-check);background-size:18px 13px;content:"";height:13px;right:-24px;position:absolute;top:3px;width:18px}.workout-card-content-flex{display:flex}.card.card-small .yoast-button-upsell{box-shadow:inset 0 -2px 0 #0003;filter:none;font-family:inherit;min-height:40px}.card.card-small button{box-shadow:inset 0 -2px 0 #0000004d;filter:none;min-height:40px}.card.card-small button.yoast-button--secondary{box-shadow:inset 0 -2px 0 #0000001a}.workout-card-content-flex ul{margin-left:8px}.workout-card-content-flex img{max-width:120px}.workout-card-upsell-button{opacity:1}#wpseo-workouts-container-free div.card.card-small.card-disabled{background-color:#ffffff80}#wpseo-workouts-container-free div.card.card-small.card-disabled .workout-card-content-flex,#wpseo-workouts-container-free div.card.card-small.card-disabled .workout-card-progress,#wpseo-workouts-container-free div.card.card-small.card-disabled h2,#wpseo-workouts-container-free div.card.card-small.card-disabled h3{opacity:.5}.workflow__grid{display:grid;gap:8px;grid-template-columns:auto 100px}.workflow__grid>div:last-of-type{display:flex;flex-wrap:wrap;justify-content:flex-end}@media screen and (max-width:768px){#wpseo-workouts-container-free #workouts-page-description{max-width:320px}} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/workouts-2330.css b/wp-content/plugins/wordpress-seo/css/dist/workouts-2330.css new file mode 100644 index 00000000..8047eede --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/workouts-2330.css @@ -0,0 +1 @@ +#wpseo-workouts-container-free h1,#wpseo-workouts-container-free h3{color:#a4286a;font-weight:500}#wpseo-workouts-container-free h3{font-size:18px;line-height:24px}.card.card-small h3{min-height:48px}#wpseo-workouts-container-free h2{font-size:12px;text-transform:uppercase}#wpseo-workouts-container-free #workouts-page-description{font-size:16px;max-width:600px}.workflow tr.cornerstone{font-weight:700}#wpseo-workouts-container-free hr{margin-bottom:24px;margin-top:8px}#wpseo-workouts-container-free progress{margin:16px 0 8px}#wpseo-workouts-container-free div.card{border-color:#0003;border-radius:8px;border-width:1px;box-shadow:0 1px 3px 0 #0000001a,0 1px 2px 0 #0000000f;max-width:720px;padding:24px;width:100%}#wpseo-workouts-container-free div.card>h2{margin:0}#wpseo-workouts-container-free div.card.card-small{display:flex;flex-direction:column;max-width:320px}#wpseo-workouts-container-free div.card.card-small svg{height:146px;width:204px}#wpseo-workouts-container-free div.card.card-small svg *{height:100%;width:100%}#wpseo-workouts-container-free div.card.card-small>span{margin-top:auto}#wpseo-workouts-container-free table button{margin:2px}.workflow{counter-reset:line-number;list-style:none;margin-left:48px}.workflow li li{counter-increment:none;line-height:19px;margin-bottom:8px}.workflow li.step{counter-increment:line-number;padding-bottom:16px;position:relative}.workflow .yoast-button.yoast-button--finished{opacity:.5}.workflow .finish-button-section .finish-button-saved{color:#6ea029;grid-column-end:3;grid-column-start:3;margin-left:10px;position:relative}.workflow .finish-button-section .finish-button-saved:before{background:var(--yoast-svg-icon-check);background-size:18px 13px;content:"";height:13px;left:-18px;position:absolute;top:2px;width:18px}.workflow li.step>.yoast-button.orphaned-summary{display:initial;margin:0}.yoast .yoast-button--arrow-down{display:inline-block;flex-shrink:0;height:16px;margin:0 -2px 0 6px;width:16px}.workflow>li.step:before{background:#a4286a;bottom:-20px;content:"";left:-33px;position:absolute;top:0;width:2px}.workflow .extra-list-content{position:relative}.workflow>li.step:last-of-type:before{display:none}.workflow>li.step:after{background:#fff;border:2px solid #a4286a;border-radius:100%;color:#a4286a;content:counter(line-number);display:block;height:28px;left:-48px;line-height:28px;position:absolute;text-align:center;top:-8px;width:28px}.workflow li.step.finished:after{background:url("data:image/svg+xml;charset=utf-8,%3Csvg width='24' fill='none' stroke='%23FFF' height='24' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m5 13 4 4L19 7'/%3E%3C/svg%3E") #a4286a;background-position:50%;background-repeat:no-repeat;background-size:20px 20px;content:""}.workflow li.step.finished.faded p,.workflow li.step.finished.faded table{opacity:.5}.workflow li.step img{max-width:100%}.workflow li.step img.workflow__image{max-height:100px;max-width:100px}.workflow li.step.yoast-fadeout:before{background:linear-gradient(180deg,#a4286a,#fff 75%);display:block}.workflow li.step #react-select-2-input{box-shadow:none!important}.workflows__index{display:flex;flex-wrap:wrap;gap:16px}.workflows__index .yoast-button{width:100%}table.yoast_help.yoast_link_suggestions thead td{padding:16px 8px}table.yoast_help.yoast_link_suggestions td{vertical-align:middle}table.yoast_help th.divider{text-align:center}.workflow table.yoast_help td{vertical-align:middle}.workflow table.yoast_help.yoast_link_suggestions td div{display:inline-block}.workflow table.yoast_help.yoast_link_suggestions td strong{display:inline-block;margin-right:8px}.components-modal__header{height:72px;padding:0 24px}.components-modal__header .components-modal__header-heading{color:#a4286a;font-size:20px;font-weight:400;line-height:1.2;margin:0}.components-modal__header .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-right:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.components-modal__content{padding:0 24px 24px}.components-modal__content input[type=text]{max-width:400px;width:100%}.components-modal__frame.yoast__workout{max-width:720px}.yoast__redirect-suggestions{line-height:2}.components-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#00000059;bottom:0;left:0;position:fixed;right:0;top:0;z-index:100000}@media (prefers-reduced-motion:reduce){.components-modal__screen-overlay{animation-delay:0s;animation-duration:1ms}}.components-modal__frame{background:#fff;border-radius:2px;bottom:0;box-shadow:0 10px 10px #00000040;box-sizing:border-box;left:0;margin:0;overflow:auto;position:absolute;right:0;top:0}@media (min-width:600px){.components-modal__frame{animation:components-modal__appear-animation .1s ease-out;animation-fill-mode:forwards;bottom:auto;left:50%;max-height:90%;max-width:calc(100% - 32px);min-width:360px;right:auto;top:50%;transform:translate(-50%,-50%)}}@media (min-width:600px) and (prefers-reduced-motion:reduce){.components-modal__frame{animation-delay:0s;animation-duration:1ms}}@keyframes components-modal__appear-animation{0%{margin-top:32px}to{margin-top:0}}.components-modal__header{align-items:center;background:#fff;border-bottom:1px solid #ddd;box-sizing:border-box;display:flex;flex-direction:row;height:60px;justify-content:space-between;margin:0 -32px 24px;padding:0 32px;position:relative;position:sticky;top:0;z-index:10}@supports (-ms-ime-align:auto){.components-modal__header{position:fixed;width:100%}}.components-modal__header .components-modal__header-heading{font-size:1rem;font-weight:600}.components-modal__header h1{line-height:1;margin:0}.components-modal__header .components-button{left:8px;position:relative}.components-modal__header-heading-container{align-items:center;display:flex;flex-direction:row;flex-grow:1;justify-content:left}.components-modal__header-icon-container{display:inline-block}.components-modal__header-icon-container svg{max-height:36px;max-width:36px;padding:8px}.components-modal__content{box-sizing:border-box;height:100%;padding:0 32px 24px}@supports (-ms-ime-align:auto){.components-modal__content{padding-top:60px}}.workflow li.step h4{font-size:14px;font-weight:600;margin:24px 0 0}.workflow .yoast-social-profiles-input-fields{margin:10px 0 20px}.workflow .tracking-radiobuttons{line-height:19px;margin:0 0 20px}.workflow .yoast-tracking{list-style-position:inside;list-style-type:disc;padding:inherit}.yoast-list--usp{margin-bottom:16px;padding-left:24px}.yoast-list--usp li{margin-bottom:16px;position:relative}.yoast-list--usp li:before{background:var(--yoast-svg-icon-check);background-size:18px 13px;content:"";height:13px;left:-24px;position:absolute;top:3px;width:18px}.workout-card-content-flex{display:flex}.card.card-small .yoast-button-upsell{box-shadow:inset 0 -2px 0 #0003;filter:none;font-family:inherit;min-height:40px}.card.card-small button{box-shadow:inset 0 -2px 0 #0000004d;filter:none;min-height:40px}.card.card-small button.yoast-button--secondary{box-shadow:inset 0 -2px 0 #0000001a}.workout-card-content-flex ul{margin-right:8px}.workout-card-content-flex img{max-width:120px}.workout-card-upsell-button{opacity:1}#wpseo-workouts-container-free div.card.card-small.card-disabled{background-color:#ffffff80}#wpseo-workouts-container-free div.card.card-small.card-disabled .workout-card-content-flex,#wpseo-workouts-container-free div.card.card-small.card-disabled .workout-card-progress,#wpseo-workouts-container-free div.card.card-small.card-disabled h2,#wpseo-workouts-container-free div.card.card-small.card-disabled h3{opacity:.5}.workflow__grid{display:grid;gap:8px;grid-template-columns:auto 100px}.workflow__grid>div:last-of-type{display:flex;flex-wrap:wrap;justify-content:flex-end}@media screen and (max-width:768px){#wpseo-workouts-container-free #workouts-page-description{max-width:320px}} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/wpseo-dismissible-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/wpseo-dismissible-2330-rtl.css new file mode 100644 index 00000000..09bca881 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/wpseo-dismissible-2330-rtl.css @@ -0,0 +1 @@ +.yoast-notice-dismiss:before{-webkit-font-smoothing:antialiased!important;speak:none;background:none;color:#b4b9be;content:"\f153";display:block!important;font:normal 16px/1 dashicons;height:20px;text-align:center;width:20px}.yoast-notice-dismiss{background:none;border:none;color:#b4b9be;cursor:pointer;margin:0;padding:9px;position:absolute;left:1px;top:0}.yoast-notice-dismiss:before{right:0;line-height:20px;position:relative;top:0}.yoast-notice-dismiss:active:before,.yoast-notice-dismiss:focus:before,.yoast-notice-dismiss:hover:before{color:#c00}.yoast-notice-dismiss:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc;color:#c00;outline:none}.yoast-notice.is-dismissible{position:relative}.yoast-notice-dismiss{text-decoration:none} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/wpseo-dismissible-2330.css b/wp-content/plugins/wordpress-seo/css/dist/wpseo-dismissible-2330.css new file mode 100644 index 00000000..78506d9f --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/wpseo-dismissible-2330.css @@ -0,0 +1 @@ +.yoast-notice-dismiss:before{-webkit-font-smoothing:antialiased!important;speak:none;background:none;color:#b4b9be;content:"\f153";display:block!important;font:normal 16px/1 dashicons;height:20px;text-align:center;width:20px}.yoast-notice-dismiss{background:none;border:none;color:#b4b9be;cursor:pointer;margin:0;padding:9px;position:absolute;right:1px;top:0}.yoast-notice-dismiss:before{left:0;line-height:20px;position:relative;top:0}.yoast-notice-dismiss:active:before,.yoast-notice-dismiss:focus:before,.yoast-notice-dismiss:hover:before{color:#c00}.yoast-notice-dismiss:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc;color:#c00;outline:none}.yoast-notice.is-dismissible{position:relative}.yoast-notice-dismiss{text-decoration:none} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/yoast-extensions-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/yoast-extensions-2330-rtl.css new file mode 100644 index 00000000..cb74c8cc --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/yoast-extensions-2330-rtl.css @@ -0,0 +1 @@ +.yoast-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#a4286a99;bottom:0;right:0;position:fixed;left:0;top:0;z-index:100000}.yoast-modal{background:#fff;bottom:48px;display:flex;flex-direction:column;height:calc(100% - 96px);right:calc(50% - 440px);max-width:880px;overflow:hidden;position:fixed;top:48px;width:100%}.yoast-gutenberg-modal .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-left:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.yoast-tabs .yoast-modal__content{display:grid;grid-template-areas:"heading heading" "menu content" "menu footer";grid-template-columns:280px 1fr;grid-template-rows:72px 1fr 88px}.yoast-modal__heading{align-items:center;background:var(--yoast-color-white);border-bottom:var(--yoast-border-default);box-sizing:border-box;display:flex;grid-area:heading;min-height:72px;padding:0 24px}.yoast-modal__heading .yoast-close{position:absolute;left:16px}.yoast-gutenberg-modal__box.components-modal__frame{box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}@media (min-width:600px){.yoast-gutenberg-modal__box.components-modal__frame{border-radius:8px;max-height:calc(100% - 48px)}}.yoast-gutenberg-modal__no-padding .components-modal__content{padding:0}.yoast-gutenberg-modal .components-modal__header-heading,.yoast-modal__heading h1{color:var(--yoast-color-primary);font-size:20px;font-weight:400;line-height:1.2;margin:0}.yoast-gutenberg-modal .components-modal__content .components-modal__header{border-bottom:1px solid #e2e8f0!important}.yoast-gutenberg-modal .components-modal__icon-container{display:inline-flex}.yoast-gutenberg-modal .components-modal__icon-container svg,.yoast-modal__heading-icon{fill:var(--yoast-color-primary);flex-shrink:0;height:20px;margin-left:16px;width:19px}.yoast-modal__menu{border-left:var(--yoast-border-default);grid-area:menu;overflow-y:auto}.yoast-modal__menu ul{list-style:none;margin:0;padding:0}.yoast-modal__menu li{border-bottom:var(--yoast-border-default);color:var(--yoast-color-default);cursor:pointer;display:block;font-size:16px;padding:12px 16px 11px;text-decoration:none}.yoast-modal__menu li:hover{background-color:#edd4e1}.yoast-modal__menu li.yoast-tabs__tab--selected{background-color:var(--yoast-color-primary);border-bottom:var(--yoast-border-default);color:#fff}.yoast-modal__content,.yoast-modal__section{display:flex;flex-direction:column;flex-grow:1;grid-area:content;overflow-y:auto;position:relative}.yoast-modal__section *{max-width:600px}.yoast-modal__section-header{background:var(--yoast-color-white);padding:24px 24px 0;position:sticky;top:0;z-index:10}.yoast-modal__section .yoast-h2{border-bottom:var(--yoast-border-default);padding-bottom:24px}.yoast-modal__footer{align-items:center;align-self:flex-end;background:var(--yoast-color-white);border-top:var(--yoast-border-default);bottom:0;box-sizing:border-box;display:flex;grid-area:footer;justify-content:flex-end;margin:0 24px;min-height:88px;padding:0;position:sticky;width:calc(100% - 48px);z-index:10}.yoast-modal__settings-saved{align-items:center;display:inline-flex;margin-left:16px;position:relative}.yoast-modal__settings-saved:before{background:var(--yoast-checkmark--green) no-repeat center;content:"";display:inline-block;height:13px;margin-left:8px;width:14px}.yoast-modal__footer .yoast-button{display:block}.yoast-modal__section-content{flex-grow:1;padding:24px}@media screen and (max-width:880px){.yoast-modal{bottom:0;height:auto;right:0;left:0;top:0}}@media screen and (max-width:782px){.yoast-modal{overflow-y:initial}.yoast-modal.yoast-modal-collapsible{padding-bottom:72px}.yoast-tabs .yoast-modal__content{grid-template-rows:48px 1fr 72px}.yoast-modal__heading{min-height:48px;padding:0 16px;position:fixed;top:0;width:100%;z-index:11}.yoast-modal__heading h1{font-size:var(--yoast-font-size-default)}.yoast-close svg{width:10px}.yoast-modal__heading-icon{height:15px;margin-left:8px}.yoast .yoast-close{left:3px}.yoast-modal__heading .yoast-h2{font-size:var(--yoast-font-size-default)}.yoast-modal__section{flex-grow:0;overflow:initial}.yoast-modal__section-content{margin:0 16px;padding:24px 0}.yoast-modal__section:first-of-type{margin-top:48px}.yoast-modal__section:last-of-type{margin-bottom:72px}.yoast-modal__section-header{margin:0;padding:0;position:sticky;top:48px}.yoast-modal__section-open .yoast-modal__section-header{margin-right:16px;margin-left:16px;padding-right:0;padding-left:0}.yoast-modal__section-open{border-bottom:var(--yoast-border-default)}.yoast-modal__footer{margin:0;min-height:72px;padding:0 16px;position:fixed;width:100%;z-index:11}.yoast-modal-collapsible .yoast-modal__footer{min-height:72px}.yoast-modal-collapsible .yoast-modal__section-content{border-bottom:var(--yoast-border-default);margin:0;padding:24px 16px}.yoast-collapsible__hidden{display:none}.yoast-collapsible__trigger{background:#fff;border:none;border-bottom:var(--yoast-border-default);color:var(--yoast-color-primary);cursor:pointer;font-size:var(--yoast-font-size-default);justify-content:space-between;padding:16px;text-align:right;width:100%}.yoast-collapsible__trigger[aria-expanded=true] .yoast-collapsible__icon{transform:rotate(-180deg)}.yoast-collapsible__trigger[aria-expanded=true]{margin:0 16px;padding:16px 0;width:calc(100% - 32px)}.yoast-collapsible__icon{background-color:var(--yoast-color-white);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8' fill='%23404040'%3E%3Cpath d='M1.4 0 6 4.6 10.6 0 12 1.4 6 7.5 0 1.4z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:10px auto;border:none;display:block;float:left;height:19px;width:19px}.yoast-collapsible-block{margin-top:48px;width:100%}.yoast-collapsible-block+.yoast-collapsible-block{margin-top:0}}.yoast-post-settings-modal{height:100%;max-height:calc(100% - 96px);max-width:calc(100% - 96px);overflow:hidden;width:880px}.yoast-modal-content{padding:16px}@media (min-width:782px){.yoast-modal-content--columns{grid-gap:24px;display:grid;grid-template-columns:1fr 1fr}}.yoast-post-settings-modal__button-container{border-bottom:1px solid #0003;display:flex;flex-direction:column;padding:16px}.yoast-post-settings-modal .components-modal__content{display:flex;flex-direction:column;padding:0}.yoast-post-settings-modal .components-modal__header{border-bottom:var(--yoast-border-default);flex-shrink:0;margin:0}.yoast-post-settings-modal .yoast-notice-container{bottom:0;right:0;margin-top:auto;position:sticky;width:100%;z-index:1}.yoast-post-settings-modal .components-modal__content>div:not([class]):not([class=""]){display:flex;flex-direction:column;overflow:hidden}.yoast-post-settings-modal .yoast-notice-container>hr{margin-bottom:0;margin-top:-1px}.yoast-post-settings-modal .yoast-content-container{flex-grow:1;overflow-y:auto}.yoast-post-settings-modal .yoast-button-container{display:flex;flex-direction:row;justify-content:flex-end;margin:0;padding:24px}.yoast-post-settings-modal .yoast-button-container p{align-self:center;color:var(--yoast-color-label-help);padding-left:24px}.yoast-post-settings-modal .yoast-button-container button{align-self:center;flex-shrink:0;max-height:45px}@media only screen and (max-width:600px){.yoast-post-settings-modal{max-height:100%;max-width:100%}.yoast-post-settings-modal .yoast-button-container{justify-content:space-between;padding:16px}.yoast-post-settings-modal .yoast-button-container p{padding-left:0}}.yoast-related-keyphrases-modal,.yoast-wincher-seo-performance-modal{max-width:712px}.yoast-wincher-seo-performance-modal__content{padding:25px 32px 32px}#yoast-get-related-keyphrases-metabox,#yoast-get-related-keyphrases-sidebar{margin-top:8px}.yoast-gutenberg-modal .yoast-related-keyphrases-modal__content{min-height:66vh;position:relative}#yoast-semrush-country-selector{border:none;position:relative}.yoast-related-keyphrases-modal__chart{display:block}:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.yoast-list--usp{font-family:Arial,sans-serif;margin-bottom:2rem;padding:0}.yoast-list--usp li{list-style:none!important;padding-right:1.2533333333rem;position:relative}.yoast-list--usp li:before{color:#77b227;content:"\f00c\0020";font-family:FontAwesome,Open Sans,Arial,sans-serif;right:0;position:absolute;top:0}.yoast .h1,.yoast .h2,.yoast .h3,.yoast .h4,.yoast .h5,.yoast .h6,.yoast h1,.yoast h2,.yoast h3,.yoast h4,.yoast h5,.yoast h6{display:block;font-family:Arial,sans-serif;font-weight:300;margin-top:0}.yoast .h1,.yoast h1{font-size:2.5em;letter-spacing:normal;line-height:3.68rem;margin-bottom:1.35rem}@media only screen and (min-width:30rem){.yoast .h1,.yoast h1{font-size:2.75em}}.yoast .h2,.yoast h2{font-size:1.88em;line-height:2.5rem;margin-bottom:1.2rem}.yoast .h2.tight,.yoast h2.tight{margin-bottom:.6rem}.yoast .h3,.yoast h3{font-size:1.25em;line-height:1.88rem;margin-bottom:.8rem}.yoast .h3.tight,.yoast h3.tight{margin-bottom:.4rem}@media only screen and (min-width:30rem){.yoast .h3,.yoast h3{font-size:1.375em}}@media only screen and (min-width:50rem){.yoast .h3,.yoast h3{font-size:1.5em}}.yoast .h4,.yoast .h5,.yoast .h6,.yoast h4,.yoast h5,.yoast h6{font-size:1.13em;font-weight:400;line-height:1.88rem;margin-bottom:.2rem}.yoast-button{background-color:initial;background-color:#dc5c04;border:0;color:#dc5c04;cursor:pointer;display:inline-block;font-family:Arial,sans-serif;font-size:1.1em;padding:.345em 1em .345em 1.5em;position:relative;text-decoration:none;width:100%}@media only screen and (min-width:30rem){.yoast-button{margin-left:1.36rem;max-height:2.86rem;width:auto}.yoast-button:after{border-bottom:1.44rem solid #0000;border-right:1.43rem solid #dc5c04;border-left:0;border-top:1.43rem solid #0000;content:"";height:0;position:absolute;left:-1.36rem;top:0;width:0}.yoast-button.left{margin-right:1.36rem;margin-left:0}.yoast-button.left:after{content:none}.yoast-button.left:before{border-bottom:1.44rem solid #0000;border-right:0;border-left:1.43rem solid #dc5c04;border-top:1.43rem solid #0000;content:"";height:0;right:-1.36rem;position:absolute;top:0;width:0}}.yoast-button.alignleft{margin:1rem 0 0 2.5rem!important}.yoast-button .arrow{display:none}.yoast-button+.yoast-button{margin-right:1.88rem;margin-top:1em}.yoast-button--full{width:100%}.yoast-button--full:after{content:none}.yoast-button.default{background-color:#dc5c04;color:#fff}.yoast-button.default:after{border-right-color:#dc5c04}.yoast-button.default:before{border-left-color:#dc5c04}.yoast-button a:focus,.yoast-button:hover{background-color:#f58223;color:#fff;text-decoration:underline}.yoast-button a:focus:after,.yoast-button:hover:after{border-right-color:#f58223}.yoast-button a:focus:before,.yoast-button:hover:before{border-left-color:#f58223}.yoast-button.academy{background-color:#5d237a;color:#fff}.yoast-button.academy:after{border-right-color:#5d237a}.yoast-button.academy:before{border-left-color:#5d237a}@media only screen and (max-width:20rem){.yoast-button.academy{background-color:#5d237a}}.yoast-button.academy--secondary{background-color:#a4286a;color:#fff}.yoast-button.academy--secondary:after{border-right-color:#a4286a}.yoast-button.academy--secondary:before{border-left-color:#a4286a}@media only screen and (max-width:20rem){.yoast-button.academy--secondary{background-color:#a4286a}}.yoast-button.software{background-color:#0075b3;color:#fff}.yoast-button.software:after{border-right-color:#0075b3}.yoast-button.software:before{border-left-color:#0075b3}.yoast-button.review{background-color:#009288;color:#fff}.yoast-button.review:after{border-right-color:#009288}.yoast-button.review:before{border-left-color:#009288}.yoast-button.about{background-color:#d93f69;color:#fff}.yoast-button.about:after{border-right-color:#d93f69}.yoast-button.about:before{border-left-color:#d93f69}.yoast_academy .yoast-button{background-color:#d93f69;color:#fff}.yoast_academy .yoast-button:after{border-right-color:#d93f69}.yoast_academy .yoast-button:before{border-left-color:#d93f69}.yoast_academy .yoast-button a:focus,.yoast_academy .yoast-button:hover{background-color:#d42a59;color:#fff;text-decoration:underline}.yoast_academy .yoast-button a:focus:after,.yoast_academy .yoast-button:hover:after{border-right-color:#d42a59}.yoast_academy .yoast-button a:focus:before,.yoast_academy .yoast-button:hover:before{border-left-color:#d42a59}.yoast_academy .yoast-button.dimmed,body .yoast-button.dimmed{background-color:#dcdcdc;color:#646464}.yoast_academy .yoast-button.dimmed:after,body .yoast-button.dimmed:after{border-right-color:#dcdcdc}.yoast_academy .yoast-button.dimmed:before,body .yoast-button.dimmed:before{border-left-color:#dcdcdc}.yoast_academy .yoast-button.dimmed a:focus,.yoast_academy .yoast-button.dimmed:hover,body .yoast-button.dimmed a:focus,body .yoast-button.dimmed:hover{background-color:#cdcdcd;color:#646464;text-decoration:underline}.yoast_academy .yoast-button.dimmed a:focus:after,.yoast_academy .yoast-button.dimmed:hover:after,body .yoast-button.dimmed a:focus:after,body .yoast-button.dimmed:hover:after{border-right-color:#cdcdcd}.yoast_academy .yoast-button.dimmed a:focus:before,.yoast_academy .yoast-button.dimmed:hover:before,body .yoast-button.dimmed a:focus:before,body .yoast-button.dimmed:hover:before{border-left-color:#cdcdcd}.yoast-button--noarrow:after{content:none}.yoast-button--naked{background-color:initial;border:none;padding:0}.yoast-button--naked:after{content:none}.yoast-button i.fa{font-size:140%;margin:4px 0 0 10px}.yoast-promoblock{border:1px solid #dcdcdc;box-shadow:0 1px 6px 0 #0000004d;margin-bottom:1.88rem;padding:16px}.yoast-promoblock p{color:#000}.yoast-promoblock p:last-of-type{margin-bottom:0}.yoast-promoblock i.blockicon{bottom:10px;font-size:2.25em;padding:0 .5em 0 0;position:absolute;left:10px}.yoast-promoblock a img{border:1px solid #dcdcdc}.yoast-promoblock p a{font-weight:600!important;text-decoration:underline}.yoast-promoblock form a{font-weight:400!important;text-decoration:none}.yoast-promoblock .h4,.yoast-promoblock h4{margin-bottom:.7rem}.yoast-promoblock.link{border-color:#dc5c04}.yoast-promoblock.link a,.yoast-promoblock.link a:hover{color:#dc5c04}.yoast-promoblock--white{border-color:#fff!important}.product .yoast-promoblock{overflow:hidden}.yoast-promoblock--hometitle{background-color:#d93f6940;border-color:#fff!important;display:flex;font-size:16px;font-size:1rem;height:11em;line-height:1;margin:1rem auto 2rem;max-width:16em}@media only screen and (max-width:30rem){.yoast-promoblock--hometitle:after{content:none!important}}.yoast-promoblock--imageholder{margin-bottom:0;padding:0}.yoast-promoblock--imageholdersmall{position:absolute}.yoast-promoblock--imageholdersmall:first-child{right:4rem}.yoast-promoblock--imageholdersmall:last-child{top:4rem}@media only screen and (max-width:50rem){.yoast-promoblock h2{margin-bottom:0}}a.promoblock{color:#000}a.promoblock,a.promoblock:hover{text-decoration:none}.promoblockimage__holder{height:295px;position:relative;width:240px}.yoast{color:#000;font-family:Open Sans,Arial,sans-serif;font-size:1rem;letter-spacing:.01em;line-height:1.88}.yoast *,.yoast :after,.yoast :before{box-sizing:border-box}.yoast-hr{border:0;margin:0;padding-bottom:1.88rem;position:relative}.yoast-list--usp li:before{background:var(--yoast-svg-icon-check) no-repeat;background-position:right .3em;background-size:contain;content:"";height:100%;width:1em}.yoast-button--purple{background-color:#5d237a}.yoast-button-go-to:after{border:none;content:" \00BB";height:auto;position:static;left:auto;top:auto;width:auto}.yoast-button--extension{color:#fff;padding-right:.8em;padding-left:.8em;text-transform:uppercase}.yoast-button--extension+.yoast-button--extension-activated,.yoast-button--extension+.yoast-button--extension-not-activated{margin-right:0}.yoast-button--extension-activated:hover,.yoast-button--extension-installed:hover,.yoast-button--extension-not-activated:hover{text-decoration:none}.yoast-button--extension-installed{margin-left:.2rem}.yoast-button--extension-installed,.yoast-button--extension-installed:hover{background-color:#008a00}.yoast-button--extension-not-activated,.yoast-button--extension-not-activated:hover{background-color:#dc3232}.yoast-button--extension-activated,.yoast-button--extension-activated:hover{background-color:#008a00}.yoast-button-upsell{margin-bottom:1em;width:100%}@media only screen and (min-width:30rem){.yoast-button-upsell{margin-left:1.36rem;width:auto}}.yoast-promo-extensions{display:flex;flex-wrap:wrap;margin-right:-24px}.yoast-promo-extensions>h2{margin-bottom:32px;margin-right:32px;width:100%}.yoast-promo-extension{background-color:#fff;display:flex;flex-direction:column;margin-right:32px;max-width:340px}.yoast-promo-extension:first-child{margin-right:0}.yoast-promo-extension img{float:left;height:100px;margin-bottom:.8rem;width:100px}@media screen and (max-width:900px){.yoast-promo-extension img{display:none}}.yoast-promo-extension .yoast-button-container{margin-top:auto}.yoast-promo-extension .yoast-button-container div.yoast-button--extension{cursor:default}.yoast-promo-extension .yoast-button{font-size:.9rem;max-height:none;width:100%}.yoast-promo-extension .yoast-button--installed{color:#fff}.yoast-promo-extension .yoast-button--extension{font-size:.9rem;margin-top:0;text-align:center}.yoast-promo-extension .yoast-button--extension-installed{margin:0 0 0 2%;width:48%}.yoast-promo-extension .yoast-button--extension-activated,.yoast-promo-extension .yoast-button--extension-not-activated{margin-right:0;margin-left:0;width:48%}.yoast-promo-extension .yoast-button-upsell{width:100%}.yoast-promo-extension h3{color:#a4286a}@media screen and (max-width:900px){.yoast-promo-extension{max-width:none;width:100%}}.yoast-seo-premium-extension-sale-badge{margin-top:-30px}.yoast-seo-premium-extension-sale-badge span{background:#1f2937;border-radius:14px;color:#fcd34d;font-size:14px;font-weight:600;padding:6px 12px}.yoast-seo-premium-extension{background:#fff;border:1px solid #dcdcdc;box-shadow:0 1px 6px 0 #0000004d;margin:2em .5em 1.5em;max-width:712px;padding:16px}.yoast-seo-premium-extension h2{color:#a61e69;display:flex;font-size:1.5rem;justify-content:space-between;margin-top:16px}.yoast-seo-premium-extension img{margin-right:1rem}@media screen and (max-width:900px){.yoast-seo-premium-extension{max-width:none;width:calc(100% - 8px)}.yoast-seo-premium-extension img{display:none}}.yoast-seo-premium-extension:after,.yoast-seo-premium-extension:before{content:"";display:table}.yoast-seo-premium-extension:after{clear:both}.yoast-seo-premium-benefits__item{font-size:.9rem;font-weight:400;line-height:24px;margin-bottom:8px}.yoast-seo-premium-benefits__item span{color:#404040}.yoast-seo-premium-benefits__title{font-size:.9rem;font-weight:700;line-height:24px}.yoast-seo-premium-benefits__description{font-size:.9rem;font-weight:400;line-height:24px}.yoast-link--license,.yoast-link--more-info{color:#a4286a;font-weight:600}.yoast-link--license{margin:1em 0 0}.yoast-promo-extension .yoast-link--license{display:block;margin:1em 0 0}.yoast-link--license:after{content:" \00BB"}.yoast-link--more-info{background:var(--yoast-svg-icon-info);background-position:100%;background-repeat:no-repeat;background-size:1em;padding-right:calc(1em + 5px)}.yoast-link--more-info:after{content:" \00BB"}.yoast-promo-extension .yoast-link--more-info{background-position:100%;display:block;margin:0}.yoast-heading-highlight{color:#a4286a;font-weight:600}.yoast-money-back-guarantee{font-size:1.1em;font-style:italic}.yoast-license-status-active{background:#008a00;color:#fff;padding:3px 6px}.yoast-license-status-inactive{background:#dc3232;color:#fff;padding:3px 6px}.yoast-promoblock.secondary.yoast-promo-extension .yoast-button-container .yoast-subscription-discount{color:#64748b;font-size:12px;margin-bottom:8px;margin-top:-8px;text-align:center} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/yoast-extensions-2330.css b/wp-content/plugins/wordpress-seo/css/dist/yoast-extensions-2330.css new file mode 100644 index 00000000..252ed924 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/yoast-extensions-2330.css @@ -0,0 +1 @@ +.yoast-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#a4286a99;bottom:0;left:0;position:fixed;right:0;top:0;z-index:100000}.yoast-modal{background:#fff;bottom:48px;display:flex;flex-direction:column;height:calc(100% - 96px);left:calc(50% - 440px);max-width:880px;overflow:hidden;position:fixed;top:48px;width:100%}.yoast-gutenberg-modal .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-right:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.yoast-tabs .yoast-modal__content{display:grid;grid-template-areas:"heading heading" "menu content" "menu footer";grid-template-columns:280px 1fr;grid-template-rows:72px 1fr 88px}.yoast-modal__heading{align-items:center;background:var(--yoast-color-white);border-bottom:var(--yoast-border-default);box-sizing:border-box;display:flex;grid-area:heading;min-height:72px;padding:0 24px}.yoast-modal__heading .yoast-close{position:absolute;right:16px}.yoast-gutenberg-modal__box.components-modal__frame{box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}@media (min-width:600px){.yoast-gutenberg-modal__box.components-modal__frame{border-radius:8px;max-height:calc(100% - 48px)}}.yoast-gutenberg-modal__no-padding .components-modal__content{padding:0}.yoast-gutenberg-modal .components-modal__header-heading,.yoast-modal__heading h1{color:var(--yoast-color-primary);font-size:20px;font-weight:400;line-height:1.2;margin:0}.yoast-gutenberg-modal .components-modal__content .components-modal__header{border-bottom:1px solid #e2e8f0!important}.yoast-gutenberg-modal .components-modal__icon-container{display:inline-flex}.yoast-gutenberg-modal .components-modal__icon-container svg,.yoast-modal__heading-icon{fill:var(--yoast-color-primary);flex-shrink:0;height:20px;margin-right:16px;width:19px}.yoast-modal__menu{border-right:var(--yoast-border-default);grid-area:menu;overflow-y:auto}.yoast-modal__menu ul{list-style:none;margin:0;padding:0}.yoast-modal__menu li{border-bottom:var(--yoast-border-default);color:var(--yoast-color-default);cursor:pointer;display:block;font-size:16px;padding:12px 16px 11px;text-decoration:none}.yoast-modal__menu li:hover{background-color:#edd4e1}.yoast-modal__menu li.yoast-tabs__tab--selected{background-color:var(--yoast-color-primary);border-bottom:var(--yoast-border-default);color:#fff}.yoast-modal__content,.yoast-modal__section{display:flex;flex-direction:column;flex-grow:1;grid-area:content;overflow-y:auto;position:relative}.yoast-modal__section *{max-width:600px}.yoast-modal__section-header{background:var(--yoast-color-white);padding:24px 24px 0;position:sticky;top:0;z-index:10}.yoast-modal__section .yoast-h2{border-bottom:var(--yoast-border-default);padding-bottom:24px}.yoast-modal__footer{align-items:center;align-self:flex-end;background:var(--yoast-color-white);border-top:var(--yoast-border-default);bottom:0;box-sizing:border-box;display:flex;grid-area:footer;justify-content:flex-end;margin:0 24px;min-height:88px;padding:0;position:sticky;width:calc(100% - 48px);z-index:10}.yoast-modal__settings-saved{align-items:center;display:inline-flex;margin-right:16px;position:relative}.yoast-modal__settings-saved:before{background:var(--yoast-checkmark--green) no-repeat center;content:"";display:inline-block;height:13px;margin-right:8px;width:14px}.yoast-modal__footer .yoast-button{display:block}.yoast-modal__section-content{flex-grow:1;padding:24px}@media screen and (max-width:880px){.yoast-modal{bottom:0;height:auto;left:0;right:0;top:0}}@media screen and (max-width:782px){.yoast-modal{overflow-y:initial}.yoast-modal.yoast-modal-collapsible{padding-bottom:72px}.yoast-tabs .yoast-modal__content{grid-template-rows:48px 1fr 72px}.yoast-modal__heading{min-height:48px;padding:0 16px;position:fixed;top:0;width:100%;z-index:11}.yoast-modal__heading h1{font-size:var(--yoast-font-size-default)}.yoast-close svg{width:10px}.yoast-modal__heading-icon{height:15px;margin-right:8px}.yoast .yoast-close{right:3px}.yoast-modal__heading .yoast-h2{font-size:var(--yoast-font-size-default)}.yoast-modal__section{flex-grow:0;overflow:initial}.yoast-modal__section-content{margin:0 16px;padding:24px 0}.yoast-modal__section:first-of-type{margin-top:48px}.yoast-modal__section:last-of-type{margin-bottom:72px}.yoast-modal__section-header{margin:0;padding:0;position:sticky;top:48px}.yoast-modal__section-open .yoast-modal__section-header{margin-left:16px;margin-right:16px;padding-left:0;padding-right:0}.yoast-modal__section-open{border-bottom:var(--yoast-border-default)}.yoast-modal__footer{margin:0;min-height:72px;padding:0 16px;position:fixed;width:100%;z-index:11}.yoast-modal-collapsible .yoast-modal__footer{min-height:72px}.yoast-modal-collapsible .yoast-modal__section-content{border-bottom:var(--yoast-border-default);margin:0;padding:24px 16px}.yoast-collapsible__hidden{display:none}.yoast-collapsible__trigger{background:#fff;border:none;border-bottom:var(--yoast-border-default);color:var(--yoast-color-primary);cursor:pointer;font-size:var(--yoast-font-size-default);justify-content:space-between;padding:16px;text-align:left;width:100%}.yoast-collapsible__trigger[aria-expanded=true] .yoast-collapsible__icon{transform:rotate(180deg)}.yoast-collapsible__trigger[aria-expanded=true]{margin:0 16px;padding:16px 0;width:calc(100% - 32px)}.yoast-collapsible__icon{background-color:var(--yoast-color-white);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8' fill='%23404040'%3E%3Cpath d='M1.4 0 6 4.6 10.6 0 12 1.4 6 7.5 0 1.4z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:10px auto;border:none;display:block;float:right;height:19px;width:19px}.yoast-collapsible-block{margin-top:48px;width:100%}.yoast-collapsible-block+.yoast-collapsible-block{margin-top:0}}.yoast-post-settings-modal{height:100%;max-height:calc(100% - 96px);max-width:calc(100% - 96px);overflow:hidden;width:880px}.yoast-modal-content{padding:16px}@media (min-width:782px){.yoast-modal-content--columns{grid-gap:24px;display:grid;grid-template-columns:1fr 1fr}}.yoast-post-settings-modal__button-container{border-bottom:1px solid #0003;display:flex;flex-direction:column;padding:16px}.yoast-post-settings-modal .components-modal__content{display:flex;flex-direction:column;padding:0}.yoast-post-settings-modal .components-modal__header{border-bottom:var(--yoast-border-default);flex-shrink:0;margin:0}.yoast-post-settings-modal .yoast-notice-container{bottom:0;left:0;margin-top:auto;position:sticky;width:100%;z-index:1}.yoast-post-settings-modal .components-modal__content>div:not([class]):not([class=""]){display:flex;flex-direction:column;overflow:hidden}.yoast-post-settings-modal .yoast-notice-container>hr{margin-bottom:0;margin-top:-1px}.yoast-post-settings-modal .yoast-content-container{flex-grow:1;overflow-y:auto}.yoast-post-settings-modal .yoast-button-container{display:flex;flex-direction:row;justify-content:flex-end;margin:0;padding:24px}.yoast-post-settings-modal .yoast-button-container p{align-self:center;color:var(--yoast-color-label-help);padding-right:24px}.yoast-post-settings-modal .yoast-button-container button{align-self:center;flex-shrink:0;max-height:45px}@media only screen and (max-width:600px){.yoast-post-settings-modal{max-height:100%;max-width:100%}.yoast-post-settings-modal .yoast-button-container{justify-content:space-between;padding:16px}.yoast-post-settings-modal .yoast-button-container p{padding-right:0}}.yoast-related-keyphrases-modal,.yoast-wincher-seo-performance-modal{max-width:712px}.yoast-wincher-seo-performance-modal__content{padding:25px 32px 32px}#yoast-get-related-keyphrases-metabox,#yoast-get-related-keyphrases-sidebar{margin-top:8px}.yoast-gutenberg-modal .yoast-related-keyphrases-modal__content{min-height:66vh;position:relative}#yoast-semrush-country-selector{border:none;position:relative}.yoast-related-keyphrases-modal__chart{display:block}:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.yoast-list--usp{font-family:Arial,sans-serif;margin-bottom:2rem;padding:0}.yoast-list--usp li{list-style:none!important;padding-left:1.2533333333rem;position:relative}.yoast-list--usp li:before{color:#77b227;content:"\f00c\0020";font-family:FontAwesome,Open Sans,Arial,sans-serif;left:0;position:absolute;top:0}.yoast .h1,.yoast .h2,.yoast .h3,.yoast .h4,.yoast .h5,.yoast .h6,.yoast h1,.yoast h2,.yoast h3,.yoast h4,.yoast h5,.yoast h6{display:block;font-family:Arial,sans-serif;font-weight:300;margin-top:0}.yoast .h1,.yoast h1{font-size:2.5em;letter-spacing:normal;line-height:3.68rem;margin-bottom:1.35rem}@media only screen and (min-width:30rem){.yoast .h1,.yoast h1{font-size:2.75em}}.yoast .h2,.yoast h2{font-size:1.88em;line-height:2.5rem;margin-bottom:1.2rem}.yoast .h2.tight,.yoast h2.tight{margin-bottom:.6rem}.yoast .h3,.yoast h3{font-size:1.25em;line-height:1.88rem;margin-bottom:.8rem}.yoast .h3.tight,.yoast h3.tight{margin-bottom:.4rem}@media only screen and (min-width:30rem){.yoast .h3,.yoast h3{font-size:1.375em}}@media only screen and (min-width:50rem){.yoast .h3,.yoast h3{font-size:1.5em}}.yoast .h4,.yoast .h5,.yoast .h6,.yoast h4,.yoast h5,.yoast h6{font-size:1.13em;font-weight:400;line-height:1.88rem;margin-bottom:.2rem}.yoast-button{background-color:initial;background-color:#dc5c04;border:0;color:#dc5c04;cursor:pointer;display:inline-block;font-family:Arial,sans-serif;font-size:1.1em;padding:.345em 1.5em .345em 1em;position:relative;text-decoration:none;width:100%}@media only screen and (min-width:30rem){.yoast-button{margin-right:1.36rem;max-height:2.86rem;width:auto}.yoast-button:after{border-bottom:1.44rem solid #0000;border-left:1.43rem solid #dc5c04;border-right:0;border-top:1.43rem solid #0000;content:"";height:0;position:absolute;right:-1.36rem;top:0;width:0}.yoast-button.left{margin-left:1.36rem;margin-right:0}.yoast-button.left:after{content:none}.yoast-button.left:before{border-bottom:1.44rem solid #0000;border-left:0;border-right:1.43rem solid #dc5c04;border-top:1.43rem solid #0000;content:"";height:0;left:-1.36rem;position:absolute;top:0;width:0}}.yoast-button.alignleft{margin:1rem 2.5rem 0 0!important}.yoast-button .arrow{display:none}.yoast-button+.yoast-button{margin-left:1.88rem;margin-top:1em}.yoast-button--full{width:100%}.yoast-button--full:after{content:none}.yoast-button.default{background-color:#dc5c04;color:#fff}.yoast-button.default:after{border-left-color:#dc5c04}.yoast-button.default:before{border-right-color:#dc5c04}.yoast-button a:focus,.yoast-button:hover{background-color:#f58223;color:#fff;text-decoration:underline}.yoast-button a:focus:after,.yoast-button:hover:after{border-left-color:#f58223}.yoast-button a:focus:before,.yoast-button:hover:before{border-right-color:#f58223}.yoast-button.academy{background-color:#5d237a;color:#fff}.yoast-button.academy:after{border-left-color:#5d237a}.yoast-button.academy:before{border-right-color:#5d237a}@media only screen and (max-width:20rem){.yoast-button.academy{background-color:#5d237a}}.yoast-button.academy--secondary{background-color:#a4286a;color:#fff}.yoast-button.academy--secondary:after{border-left-color:#a4286a}.yoast-button.academy--secondary:before{border-right-color:#a4286a}@media only screen and (max-width:20rem){.yoast-button.academy--secondary{background-color:#a4286a}}.yoast-button.software{background-color:#0075b3;color:#fff}.yoast-button.software:after{border-left-color:#0075b3}.yoast-button.software:before{border-right-color:#0075b3}.yoast-button.review{background-color:#009288;color:#fff}.yoast-button.review:after{border-left-color:#009288}.yoast-button.review:before{border-right-color:#009288}.yoast-button.about{background-color:#d93f69;color:#fff}.yoast-button.about:after{border-left-color:#d93f69}.yoast-button.about:before{border-right-color:#d93f69}.yoast_academy .yoast-button{background-color:#d93f69;color:#fff}.yoast_academy .yoast-button:after{border-left-color:#d93f69}.yoast_academy .yoast-button:before{border-right-color:#d93f69}.yoast_academy .yoast-button a:focus,.yoast_academy .yoast-button:hover{background-color:#d42a59;color:#fff;text-decoration:underline}.yoast_academy .yoast-button a:focus:after,.yoast_academy .yoast-button:hover:after{border-left-color:#d42a59}.yoast_academy .yoast-button a:focus:before,.yoast_academy .yoast-button:hover:before{border-right-color:#d42a59}.yoast_academy .yoast-button.dimmed,body .yoast-button.dimmed{background-color:#dcdcdc;color:#646464}.yoast_academy .yoast-button.dimmed:after,body .yoast-button.dimmed:after{border-left-color:#dcdcdc}.yoast_academy .yoast-button.dimmed:before,body .yoast-button.dimmed:before{border-right-color:#dcdcdc}.yoast_academy .yoast-button.dimmed a:focus,.yoast_academy .yoast-button.dimmed:hover,body .yoast-button.dimmed a:focus,body .yoast-button.dimmed:hover{background-color:#cdcdcd;color:#646464;text-decoration:underline}.yoast_academy .yoast-button.dimmed a:focus:after,.yoast_academy .yoast-button.dimmed:hover:after,body .yoast-button.dimmed a:focus:after,body .yoast-button.dimmed:hover:after{border-left-color:#cdcdcd}.yoast_academy .yoast-button.dimmed a:focus:before,.yoast_academy .yoast-button.dimmed:hover:before,body .yoast-button.dimmed a:focus:before,body .yoast-button.dimmed:hover:before{border-right-color:#cdcdcd}.yoast-button--noarrow:after{content:none}.yoast-button--naked{background-color:initial;border:none;padding:0}.yoast-button--naked:after{content:none}.yoast-button i.fa{font-size:140%;margin:4px 10px 0 0}.yoast-promoblock{border:1px solid #dcdcdc;box-shadow:0 1px 6px 0 #0000004d;margin-bottom:1.88rem;padding:16px}.yoast-promoblock p{color:#000}.yoast-promoblock p:last-of-type{margin-bottom:0}.yoast-promoblock i.blockicon{bottom:10px;font-size:2.25em;padding:0 0 0 .5em;position:absolute;right:10px}.yoast-promoblock a img{border:1px solid #dcdcdc}.yoast-promoblock p a{font-weight:600!important;text-decoration:underline}.yoast-promoblock form a{font-weight:400!important;text-decoration:none}.yoast-promoblock .h4,.yoast-promoblock h4{margin-bottom:.7rem}.yoast-promoblock.link{border-color:#dc5c04}.yoast-promoblock.link a,.yoast-promoblock.link a:hover{color:#dc5c04}.yoast-promoblock--white{border-color:#fff!important}.product .yoast-promoblock{overflow:hidden}.yoast-promoblock--hometitle{background-color:#d93f6940;border-color:#fff!important;display:flex;font-size:16px;font-size:1rem;height:11em;line-height:1;margin:1rem auto 2rem;max-width:16em}@media only screen and (max-width:30rem){.yoast-promoblock--hometitle:after{content:none!important}}.yoast-promoblock--imageholder{margin-bottom:0;padding:0}.yoast-promoblock--imageholdersmall{position:absolute}.yoast-promoblock--imageholdersmall:first-child{left:4rem}.yoast-promoblock--imageholdersmall:last-child{top:4rem}@media only screen and (max-width:50rem){.yoast-promoblock h2{margin-bottom:0}}a.promoblock{color:#000}a.promoblock,a.promoblock:hover{text-decoration:none}.promoblockimage__holder{height:295px;position:relative;width:240px}.yoast{color:#000;font-family:Open Sans,Arial,sans-serif;font-size:1rem;letter-spacing:.01em;line-height:1.88}.yoast *,.yoast :after,.yoast :before{box-sizing:border-box}.yoast-hr{border:0;margin:0;padding-bottom:1.88rem;position:relative}.yoast-list--usp li:before{background:var(--yoast-svg-icon-check) no-repeat;background-position:left .3em;background-size:contain;content:"";height:100%;width:1em}.yoast-button--purple{background-color:#5d237a}.yoast-button-go-to:after{border:none;content:" \00BB";height:auto;position:static;right:auto;top:auto;width:auto}.yoast-button--extension{color:#fff;padding-left:.8em;padding-right:.8em;text-transform:uppercase}.yoast-button--extension+.yoast-button--extension-activated,.yoast-button--extension+.yoast-button--extension-not-activated{margin-left:0}.yoast-button--extension-activated:hover,.yoast-button--extension-installed:hover,.yoast-button--extension-not-activated:hover{text-decoration:none}.yoast-button--extension-installed{margin-right:.2rem}.yoast-button--extension-installed,.yoast-button--extension-installed:hover{background-color:#008a00}.yoast-button--extension-not-activated,.yoast-button--extension-not-activated:hover{background-color:#dc3232}.yoast-button--extension-activated,.yoast-button--extension-activated:hover{background-color:#008a00}.yoast-button-upsell{margin-bottom:1em;width:100%}@media only screen and (min-width:30rem){.yoast-button-upsell{margin-right:1.36rem;width:auto}}.yoast-promo-extensions{display:flex;flex-wrap:wrap;margin-left:-24px}.yoast-promo-extensions>h2{margin-bottom:32px;margin-left:32px;width:100%}.yoast-promo-extension{background-color:#fff;display:flex;flex-direction:column;margin-left:32px;max-width:340px}.yoast-promo-extension:first-child{margin-left:0}.yoast-promo-extension img{float:right;height:100px;margin-bottom:.8rem;width:100px}@media screen and (max-width:900px){.yoast-promo-extension img{display:none}}.yoast-promo-extension .yoast-button-container{margin-top:auto}.yoast-promo-extension .yoast-button-container div.yoast-button--extension{cursor:default}.yoast-promo-extension .yoast-button{font-size:.9rem;max-height:none;width:100%}.yoast-promo-extension .yoast-button--installed{color:#fff}.yoast-promo-extension .yoast-button--extension{font-size:.9rem;margin-top:0;text-align:center}.yoast-promo-extension .yoast-button--extension-installed{margin:0 2% 0 0;width:48%}.yoast-promo-extension .yoast-button--extension-activated,.yoast-promo-extension .yoast-button--extension-not-activated{margin-left:0;margin-right:0;width:48%}.yoast-promo-extension .yoast-button-upsell{width:100%}.yoast-promo-extension h3{color:#a4286a}@media screen and (max-width:900px){.yoast-promo-extension{max-width:none;width:100%}}.yoast-seo-premium-extension-sale-badge{margin-top:-30px}.yoast-seo-premium-extension-sale-badge span{background:#1f2937;border-radius:14px;color:#fcd34d;font-size:14px;font-weight:600;padding:6px 12px}.yoast-seo-premium-extension{background:#fff;border:1px solid #dcdcdc;box-shadow:0 1px 6px 0 #0000004d;margin:2em .5em 1.5em;max-width:712px;padding:16px}.yoast-seo-premium-extension h2{color:#a61e69;display:flex;font-size:1.5rem;justify-content:space-between;margin-top:16px}.yoast-seo-premium-extension img{margin-left:1rem}@media screen and (max-width:900px){.yoast-seo-premium-extension{max-width:none;width:calc(100% - 8px)}.yoast-seo-premium-extension img{display:none}}.yoast-seo-premium-extension:after,.yoast-seo-premium-extension:before{content:"";display:table}.yoast-seo-premium-extension:after{clear:both}.yoast-seo-premium-benefits__item{font-size:.9rem;font-weight:400;line-height:24px;margin-bottom:8px}.yoast-seo-premium-benefits__item span{color:#404040}.yoast-seo-premium-benefits__title{font-size:.9rem;font-weight:700;line-height:24px}.yoast-seo-premium-benefits__description{font-size:.9rem;font-weight:400;line-height:24px}.yoast-link--license,.yoast-link--more-info{color:#a4286a;font-weight:600}.yoast-link--license{margin:1em 0 0}.yoast-promo-extension .yoast-link--license{display:block;margin:1em 0 0}.yoast-link--license:after{content:" \00BB"}.yoast-link--more-info{background:var(--yoast-svg-icon-info);background-position:0;background-repeat:no-repeat;background-size:1em;padding-left:calc(1em + 5px)}.yoast-link--more-info:after{content:" \00BB"}.yoast-promo-extension .yoast-link--more-info{background-position:0;display:block;margin:0}.yoast-heading-highlight{color:#a4286a;font-weight:600}.yoast-money-back-guarantee{font-size:1.1em;font-style:italic}.yoast-license-status-active{background:#008a00;color:#fff;padding:3px 6px}.yoast-license-status-inactive{background:#dc3232;color:#fff;padding:3px 6px}.yoast-promoblock.secondary.yoast-promo-extension .yoast-button-container .yoast-subscription-discount{color:#64748b;font-size:12px;margin-bottom:8px;margin-top:-8px;text-align:center} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/yst_plugin_tools-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/yst_plugin_tools-2330-rtl.css new file mode 100644 index 00000000..743427bd --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/yst_plugin_tools-2330-rtl.css @@ -0,0 +1 @@ +:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.wpseo_content_wrapper{display:table;table-layout:fixed;width:100%}.wpseo_content_cell{display:table-cell;height:500px;margin:0;padding:0;vertical-align:top}#wpseo_content_top{width:100%}tr.yst_row{margin:5px 0 0;padding:5px 0 0}#sidebar-container{padding-right:20px;width:300px}tr.yst_row.even{background-color:#f6f6f6}.wpseo_content_wrapper label.select,.wpseo_content_wrapper label.textinput{word-wrap:break-word;float:right;margin:5px 0;width:200px}.wpseo_content_wrapper label.select.error,.wpseo_content_wrapper label.textinput.error{color:#dc3232;font-weight:700}.wpseo_content_wrapper .yoast-inline-label{display:inline-block;float:none;margin:0 0 8px}.wpseo_content_wrapper input.textinput,.wpseo_content_wrapper select,.wpseo_content_wrapper textarea{width:400px}.wpseo_content_wrapper input.number{width:100px}.wpseo_content_wrapper input.large-text,.wpseo_content_wrapper textarea.large-text{width:99%}.wpseo_content_wrapper .select2-container,.wpseo_content_wrapper input.textinput,.wpseo_content_wrapper select.select,.wpseo_content_wrapper textarea.textinput{margin:0 0 15px}.wpseo_content_wrapper input.textinput[aria-invalid=true]{background:#f9dcdc url(../../images/error-icon.svg) no-repeat calc(100% - (100% - 6px));background-size:12px;border:1px solid #dc3232;color:#000;padding-left:24px}.wpseo_content_wrapper input.textinput[aria-invalid=true][aria-describedby]{margin-bottom:.5rem}.wpseo_content_wrapper .yoast-input-validation__error-description{color:#8f1919;margin:0 0 1rem;padding-right:200px;width:400px}.wpseo_content_wrapper input.checkbox,.wpseo_content_wrapper input.checkbox.double,.wpseo_content_wrapper input.radio{margin:6px 0 6px 10px}.wpseo_content_wrapper .textinput.metadesc{height:50px}.wpseo_content_wrapper textarea.import{height:100px;width:500px}.wpseo_content_wrapper p.desc{margin:6px 0 10px;padding:0 25px 8px 0}.wpseo_content_wrapper div.desc.label,.wpseo_content_wrapper p.desc.label{margin:0 0 20px;padding:0 200px 10px 0}.wpseo_content_wrapper h4{clear:both;margin:1.2em 0 .5em}.wpseo_content_wrapper .postbox{margin:10px 0 0 10px}.wpseo_content_wrapper .postbox form{line-height:150%}.wpseo_content_wrapper .text{width:250px}.wpseo_content_wrapper .correct{background-color:green;color:#fff;padding:5px}.wpseo_content_wrapper .wrong{background-color:#dc3232;color:#fff;padding:5px}.wpseo_content_wrapper .wrong code{color:#000;padding:3px 8px}.wpseo_content_wrapper .button.fixit{float:left;margin:0 5px}.wpseo_content_wrapper .button.checkit{float:left;margin:0 5px;padding:5px 8px}.wpseo_content_wrapper .disabled-note{color:#888;margin:0 0 8px}.wpseo_content_wrapper #separator{margin:1em 0 0}.wpseo_content_wrapper #separator input.radio{height:1px;right:-9999em;position:absolute;width:1px}.wpseo_content_wrapper #separator input.radio+label{border:1px solid #ccc;cursor:pointer;float:right;font-family:Arial,Helvetica,sans-serif!important;font-size:18px!important;line-height:24px;margin:.5em 0 0 5px!important;padding:9px 6px;text-align:center;width:30px!important}.wpseo_content_wrapper #separator input.radio:checked+label{background-color:#fff;border:3px solid #a4286a;padding:7px 4px}.wpseo_content_wrapper #separator input.radio:focus+label{outline:2px solid #5b9dd9}.wpseo_content_wrapper .svg-container{text-align:center}.wpseo_content_wrapper .svg-container .dashicons{font-size:100px;height:100px;width:200px}.wpseo_content_wrapper .paper.tab-block button.toggleable-container-trigger{font-size:1.0625rem;padding:16px;width:100%}.wpseo_content_wrapper .paper.tab-block button.toggleable-container-trigger:focus{box-shadow:0 0 3px #084a67cc;outline:1px solid #0066cd;outline-offset:-1px}.wpseo_content_wrapper .paper.tab-block button.toggleable-container-trigger:active{box-shadow:none}.wpseo_content_wrapper .paper.tab-block h2.collapsible-header{margin:0!important;padding:0!important}.wpseo_content_wrapper .paper.tab-block.metabox button.toggleable-container-trigger{color:#555}.wpseo_content_wrapper .paper.tab-block.metabox.wpseotab{border:0;padding:0}.wpseo_content_wrapper .paper.tab-block .paper-container{padding:16px}.wpseo_content_wrapper .paper.tab-block.has-paper-container-no-top-padding .paper-container{padding-top:0}.wpseo_content_wrapper .paper.tab-block .paper-container:first-child{margin-top:0}.wpseo_content_wrapper .paper.tab-block .paper-title{padding:16px}.wpseo_content_wrapper .paper.tab-block .paper-title h2{margin:0}.wpseo_content_wrapper .paper.tab-block .tab-block:first-child{margin-top:0}.wpseo_content_wrapper .wpseo-collapsible-container{background-color:#fff;border-bottom:1px solid #e2e4e7;border-top:1px solid #e2e4e7;margin-top:-1px}.wpseo_content_wrapper .toggleable-container-trigger{background:none;border:0;cursor:pointer;padding:0;text-align:right;width:100%}.wpseo_content_wrapper .toggleable-container-icon{float:left;height:20px;position:relative;width:20px}.wpseo_content_wrapper .toggleable-container-trigger .toggleable-container-icon:after{content:"";display:block;right:-4px;padding:14px;position:absolute;top:-4px}.wpseo_content_wrapper .toggleable-container-hidden{display:none}.wpseo_content_wrapper h3{font-size:1.15em;margin:1em 0 .5em}.wpseo_content_wrapper h3.h2{font-size:1.3em}.wpseo_content_wrapper li,.wpseo_content_wrapper p{max-width:600px}.wpseo_content_wrapper .notice p,.yoast .search-box,.yoast-container .container,.yoast-notification p{max-width:none}table.wpseo th{text-align:right}#wpseo-tabs+.notice{margin-top:1.5em}.wpseo-variable-warning-element{border:1px solid #c62d2d!important}.wpseo-variable-warning{clear:both;color:#c62d2d;margin:5px 0 0;padding:5px}.wpseo-variable-warning code{color:#b02828}.wpseo-variable-warning a{color:#c62d2d}.wpseo_content_wrapper h1.wpseo-redirect-url-title{font-size:1.3em;margin:1em 0 .5em}table.yoast_help{border-collapse:collapse;width:100%}table.yoast_help,table.yoast_help td,table.yoast_help th{border:1px solid #ddd;color:#444}table.yoast_help td,table.yoast_help th{padding:5px 10px;text-align:right;vertical-align:top}table.yoast_help tr{background-color:#f1f1f1}table.yoast_help tr:nth-child(2n){background-color:#fbfbfe}table.yoast_help tr:hover{background-color:#ddd}table.yoast_help thead tr,table.yoast_help thead tr:hover{background-color:#fff}table.yoast_help .yoast-variable-name{font-weight:600;white-space:nowrap}table.yoast_help .yoast-variable-desc{min-width:300px}.yoast-notice-blocking-files code{color:#000;line-height:2}.yoast-notice-blocking-files .button{margin:.5em 0}.wpseo_content_wrapper .yoast-blocking-files-error p{max-width:none}.wpseotab{display:none}.wpseotab.active{display:block}.wpseotab p.expl{margin-right:6px}.wpseotab .tab-block{display:block;margin:30px 0}.wpseotab p.expl strong{font-size:115%}#wpseo-debug-info{background-color:#fff;border:1px solid #e5e5e5;box-shadow:0 1px 1px #0000000a;clear:both;margin:20px 0 0;padding:20px 20px 0}#wpseo-debug-info h2{cursor:auto;margin:0}#wpseo-debug-info .wpseo-debug-heading{font-size:1em}#wpseo-debug-info .wpseo-debug{color:#c00;display:inline-block;padding-right:20px}input.wpseo-new-title,textarea.wpseo-new-metadesc{max-width:100%;width:100%}body.toplevel_page_wpseo_dashboard .wp-badge{background:#0000 url(../../packages/js/images/Yoast_SEO_Icon.svg) no-repeat 50% 10px;background-size:140px 140px;box-shadow:none}#wpseo_progressbar{border:1px solid #006691;height:25px}#wpseo_progressbar .ui-progressbar-value{background:#006691;height:25px}.wpseo-progressbar-wrapper{display:inline;width:100%}.wpseo-progressbar{border:1px solid #006691;display:block;height:25px;width:100%}.wpseo-progressbar .ui-progressbar-value{background:#006691;height:25px}.yoast-sidebar__title{border-bottom:1px solid #a4286a;box-sizing:border-box;color:#a4286a;line-height:19px;margin:5px 0;padding:10px 0;text-align:right;width:100%}.yoast-sidebar__product{background:#a61e69;border-radius:8px;color:#fff;margin-top:34px;padding:24px}.yoast-sidebar__product h2{color:#fff;font-size:22px;font-weight:700}.yoast-get-premium-title{line-height:27px;margin-bottom:12px;margin-top:0}.yoast-get-premium-title span{white-space:nowrap}.yoast-sidebar__product .product-image{margin:-50px auto 16px;max-height:75px;max-width:75px;position:relative;z-index:2}.yoast-sidebar__product .product-image img{border:1px solid #fff;border-radius:12px 12px 12px 0;overflow:hidden}.yoast-sidebar__product p{font-size:1rem;margin-bottom:12px;margin-top:0}.yoast-sidebar__product .yoast-price-micro-copy{font-size:12px;font-weight:300;line-height:20px;margin-bottom:16px;text-align:center}.yoast-sidebar__product .yoast-upsell-hr{border-color:#cd82ab;border-top:1px;margin-bottom:16px}.yoast-sidebar__product .plugin-buy-button .yoast-button-upsell{width:100%}.yoast-sidebar__product .review-container{margin-top:16px}.yoast-sidebar__product .review-container a{color:#fff;text-decoration:none}.yoast-sidebar__product .review-container a .claim{color:#fff;display:block;margin-bottom:12px}.yoast-sidebar__product .review-container .title{color:#fff;font-weight:500;margin-bottom:8px}.yoast-sidebar__product .review-container .title:hover{text-decoration:underline}.yoast-sidebar__product .review-container .rating{display:flex;gap:5px}.yoast-sidebar__product .review-container .rating img{max-height:22px;max-width:22px}.yoast-sidebar__product .review-container .rating .rating-text{font-size:16px;font-weight:600}.yoast-sidebar__product .sidebar__sale_banner_container{margin-right:-24px;margin-top:-40px;overflow-x:hidden;overflow-y:initial;width:calc(100% + 48px)}.yoast-sidebar__product .sidebar__sale_banner_container .sidebar__sale_banner{background:#000;box-shadow:0 -1px 4px 0 #fcd34d,0 1px 4px 0 #fcd34d,0 -1px 0 0 #fcd34d,0 1px 0 0 #fcd34d;color:#fcd34d;font-size:20px;font-weight:500;letter-spacing:.5px;line-height:30px;margin-bottom:20px;margin-right:-30px;margin-top:20px;padding:7px 0;text-align:center;transform:rotate(5deg);width:calc(100% + 60px);z-index:1}.yoast-sidebar__product .sidebar__sale_banner_container .sidebar__sale_banner .banner_text{display:inline-block;margin:0 40px}.yoast-sidebar__product .sidebar__sale_text{border-top:1px solid #fff;font-style:italic;text-align:center}.yoast-sidebar__product .sidebar__sale_text p{font-size:12.5px;margin:12.5px 0}.yoast-sidebar__section{background-color:#fff;border:1px solid #dcdcdc;box-shadow:0 1px 6px 0 #0000004d;margin:10px 0 20px;padding:16px}.yoast-sidebar__section h2{color:#a4286a;margin-top:0}.yoast-sidebar__section a{color:#0085ba}.yoast-sidebar__section ul{position:relative}.yoast-sidebar__section li{list-style:none;margin-right:20px}.yoast-sidebar__section li:before{content:"+";font-weight:700;right:0;position:absolute}.yoast-sidebar__section div{margin:10px 0 20px;position:relative}.yoast-sidebar__section div img{float:left;height:70px;margin:0 10px 0 0;width:70px}.yoast-sidebar__section div img.alignleft{float:right;margin:0 0 0 10px}.yoast-sidebar__section div p{float:right;margin:0;width:100%}.yoast_premium_upsell{background-color:#fff;border:1px solid #dcdcdc;box-shadow:0 1px 6px 0 #0000004d;margin-top:2em;max-width:715px;overflow:hidden}.yoast_premium_upsell--container{padding:16px}.black-friday-container{background-color:#1f2937;border-bottom:2px solid #fcd34d;display:flex;padding:8px 16px}.black-friday-container span{color:#fcd34d;font-size:1.2rem;font-weight:600}.yoast_premium_upsell--header{color:#a4286a;font-size:1.7em;font-weight:700;margin-top:.3em}.yoast_premium_upsell--motivation{display:flex;flex-wrap:wrap}.yoast_premium_upsell--motivation li{flex:0 0 50%;list-style:none}.yoast_premium_upsell--argument{padding:0 20px 0 8px}.yoast_premium_upsell--argument:before{content:"+";font-weight:700;right:-16px;margin-left:-10px;position:relative;top:-1px}@media screen and (max-width:480px){.yoast_premium_upsell--motivation{display:block}}.yoast-variable-desc{min-width:300px}.yoast-table-scrollable,.yoast-table-scrollable td,.yoast-table-scrollable th{box-sizing:border-box}.yoast-table-scrollable__container.yoast-has-scroll{overflow:hidden;position:relative}.yoast-table-scrollable__container.yoast-has-scroll:after{border-radius:0 10px 10px 0/0 50% 50% 0;box-shadow:5px 0 10px #00000040;content:"";height:calc(100% - 16px);right:100%;position:absolute;top:0;width:50px}.yoast-table-scrollable__container.yoast-has-scroll .yoast-table-scrollable__inner{overflow-x:scroll;padding-bottom:16px}.yoast-table-scrollable__hintwrapper{display:none}.yoast-table-scrollable__hintwrapper.yoast-has-scroll{display:block;margin:1em 0;text-align:center}.yoast-has-scroll .yoast-table-scrollable__hint{display:inline-block}.yoast-has-scroll .yoast-table-scrollable__hint:before{content:"\21c4";display:inline-block;font-size:20px;line-height:inherit;margin-left:10px;vertical-align:text-top}.yoast-styled-select{align-items:center;display:inline-flex;margin-bottom:1em;position:relative}.yoast-styled-select:after,.yoast-styled-select:before{bottom:0;content:"";pointer-events:none;position:absolute;top:0}.yoast-styled-select:before{left:0;width:28px}.yoast-styled-select:after{border-top:4px solid #0000;border-color:#555 #0000 #0000;border-style:solid;border-width:5px 4px 0;height:0;margin:auto;left:6px;width:0;z-index:1}.yoast-styled-select select{-webkit-appearance:none;appearance:none;background:#0000;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;color:#32373c;height:28px;line-height:1;margin:0;max-width:100%;padding:4px 8px 4px 32px}.yoast-styled-select select.error{border-color:#dc3232;border-width:2px}.wpseo_content_wrapper .yoast-styled-select select.select{margin:0}.yoast-styled-select select:focus{border-color:#5b9dd9}.yoast-styled-select select:-moz-focusring{color:#0000;text-shadow:0 0 0 #32373c}.yoast-styled-select select[disabled]{opacity:.75}.yoast-styled-select select::-ms-expand{display:none}@media screen and (max-width:1024px){.wpseo_content_cell,.wpseo_content_wrapper{display:block;height:auto}#wpseo_content_top{width:auto}#sidebar-container{display:flex;gap:.7rem;padding:0;width:auto}.yoast-sidebar__product .sidebar__sale_banner_container{overflow-y:hidden}#sidebar-container .yoast-sidebar__section{margin-top:5rem}.yoast-sidebar__product-list{border-bottom:1px solid #ddd;display:flex}.yoast-sidebar__product-list div p{word-wrap:break-word;width:calc(100% - 50px)}.yoast-sidebar__product-list .yoast-sidebar__section{border-bottom:none}.yoast-sidebar__product-list .yoast-sidebar__section:first-child{margin-left:40px}}@media screen and (max-width:782px){.wpseo_content_wrapper label.select,.wpseo_content_wrapper label.textinput{display:inline-block;float:none;width:auto}.wpseo_content_wrapper input.textinput,.wpseo_content_wrapper textarea,.wpseo_content_wrapper textarea.textinput{display:block;width:100%}.wpseo_content_wrapper .select2-container,.wpseo_content_wrapper select,.wpseo_content_wrapper select.select{display:block;margin:0 0 5px;max-width:100%}.wpseo_content_wrapper div.desc.label,.wpseo_content_wrapper p.desc.label{padding-right:0}.wpseo_content_wrapper .textinput[aria-invalid=true][aria-describedby]+br{display:none}.wpseo_content_wrapper .yoast-input-validation__error-description{padding-right:0;width:auto}}@media screen and (max-width:600px){.yoast-sidebar__product-list{border-bottom:none;display:block}.yoast-sidebar__product-list .yoast-sidebar__section{border-bottom:1px solid #ddd}.yoast-sidebar__product-list .yoast-sidebar__section p{word-wrap:break-word;padding-right:50px;width:calc(100% - 50px)}}@media screen and (max-width:500px){.yoast-sidebar__product .sidebar__sale_banner_container .sidebar__sale_banner{transform:rotate(4deg)}#sidebar-container{display:block}#sidebar-container .yoast-sidebar__section{margin-top:20px}body.toplevel_page_wpseo_dashboard .wp-badge{background-color:#a4286a;background-size:100px 100px;box-shadow:0 1px 3px #0003;padding-top:80px}}.wpseo-checkmark-ok-icon{background:var(--yoast-svg-icon-check-ok) no-repeat;background-size:18px;float:right;height:18px;margin-left:5px;vertical-align:top;width:18px}.yoast-settings-section:not(:last-child){margin-bottom:40px}.yoast-settings-section .yoast-field-group__title .yoast_help.yoast-help-link{margin:-6px 2px 0 0}#yoast-og-default-image-select .yoast-field-group__title{display:none}.yoast-settings-section.yoast-settings-section-disabled{border:1px solid #ccc;padding:16px;position:relative}.yoast-settings-section.yoast-settings-section-disabled>*{opacity:.5}.yoast-settings-section.yoast-settings-section-disabled .yoast-settings-section-upsell{align-items:center;bottom:0;display:flex;justify-content:center;right:0;opacity:1;position:absolute;left:0;top:0}@keyframes yoast-spin{0%{transform:rotate(0deg)}to{transform:rotate(-1turn)}} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/yst_plugin_tools-2330.css b/wp-content/plugins/wordpress-seo/css/dist/yst_plugin_tools-2330.css new file mode 100644 index 00000000..75d3bd5d --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/yst_plugin_tools-2330.css @@ -0,0 +1 @@ +:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.wpseo_content_wrapper{display:table;table-layout:fixed;width:100%}.wpseo_content_cell{display:table-cell;height:500px;margin:0;padding:0;vertical-align:top}#wpseo_content_top{width:100%}tr.yst_row{margin:5px 0 0;padding:5px 0 0}#sidebar-container{padding-left:20px;width:300px}tr.yst_row.even{background-color:#f6f6f6}.wpseo_content_wrapper label.select,.wpseo_content_wrapper label.textinput{word-wrap:break-word;float:left;margin:5px 0;width:200px}.wpseo_content_wrapper label.select.error,.wpseo_content_wrapper label.textinput.error{color:#dc3232;font-weight:700}.wpseo_content_wrapper .yoast-inline-label{display:inline-block;float:none;margin:0 0 8px}.wpseo_content_wrapper input.textinput,.wpseo_content_wrapper select,.wpseo_content_wrapper textarea{width:400px}.wpseo_content_wrapper input.number{width:100px}.wpseo_content_wrapper input.large-text,.wpseo_content_wrapper textarea.large-text{width:99%}.wpseo_content_wrapper .select2-container,.wpseo_content_wrapper input.textinput,.wpseo_content_wrapper select.select,.wpseo_content_wrapper textarea.textinput{margin:0 0 15px}.wpseo_content_wrapper input.textinput[aria-invalid=true]{background:#f9dcdc url(../../images/error-icon.svg) no-repeat calc(100% - 6px);background-size:12px;border:1px solid #dc3232;color:#000;padding-right:24px}.wpseo_content_wrapper input.textinput[aria-invalid=true][aria-describedby]{margin-bottom:.5rem}.wpseo_content_wrapper .yoast-input-validation__error-description{color:#8f1919;margin:0 0 1rem;padding-left:200px;width:400px}.wpseo_content_wrapper input.checkbox,.wpseo_content_wrapper input.checkbox.double,.wpseo_content_wrapper input.radio{margin:6px 10px 6px 0}.wpseo_content_wrapper .textinput.metadesc{height:50px}.wpseo_content_wrapper textarea.import{height:100px;width:500px}.wpseo_content_wrapper p.desc{margin:6px 0 10px;padding:0 0 8px 25px}.wpseo_content_wrapper div.desc.label,.wpseo_content_wrapper p.desc.label{margin:0 0 20px;padding:0 0 10px 200px}.wpseo_content_wrapper h4{clear:both;margin:1.2em 0 .5em}.wpseo_content_wrapper .postbox{margin:10px 10px 0 0}.wpseo_content_wrapper .postbox form{line-height:150%}.wpseo_content_wrapper .text{width:250px}.wpseo_content_wrapper .correct{background-color:green;color:#fff;padding:5px}.wpseo_content_wrapper .wrong{background-color:#dc3232;color:#fff;padding:5px}.wpseo_content_wrapper .wrong code{color:#000;padding:3px 8px}.wpseo_content_wrapper .button.fixit{float:right;margin:0 5px}.wpseo_content_wrapper .button.checkit{float:right;margin:0 5px;padding:5px 8px}.wpseo_content_wrapper .disabled-note{color:#888;margin:0 0 8px}.wpseo_content_wrapper #separator{margin:1em 0 0}.wpseo_content_wrapper #separator input.radio{height:1px;left:-9999em;position:absolute;width:1px}.wpseo_content_wrapper #separator input.radio+label{border:1px solid #ccc;cursor:pointer;float:left;font-family:Arial,Helvetica,sans-serif!important;font-size:18px!important;line-height:24px;margin:.5em 5px 0 0!important;padding:9px 6px;text-align:center;width:30px!important}.wpseo_content_wrapper #separator input.radio:checked+label{background-color:#fff;border:3px solid #a4286a;padding:7px 4px}.wpseo_content_wrapper #separator input.radio:focus+label{outline:2px solid #5b9dd9}.wpseo_content_wrapper .svg-container{text-align:center}.wpseo_content_wrapper .svg-container .dashicons{font-size:100px;height:100px;width:200px}.wpseo_content_wrapper .paper.tab-block button.toggleable-container-trigger{font-size:1.0625rem;padding:16px;width:100%}.wpseo_content_wrapper .paper.tab-block button.toggleable-container-trigger:focus{box-shadow:0 0 3px #084a67cc;outline:1px solid #0066cd;outline-offset:-1px}.wpseo_content_wrapper .paper.tab-block button.toggleable-container-trigger:active{box-shadow:none}.wpseo_content_wrapper .paper.tab-block h2.collapsible-header{margin:0!important;padding:0!important}.wpseo_content_wrapper .paper.tab-block.metabox button.toggleable-container-trigger{color:#555}.wpseo_content_wrapper .paper.tab-block.metabox.wpseotab{border:0;padding:0}.wpseo_content_wrapper .paper.tab-block .paper-container{padding:16px}.wpseo_content_wrapper .paper.tab-block.has-paper-container-no-top-padding .paper-container{padding-top:0}.wpseo_content_wrapper .paper.tab-block .paper-container:first-child{margin-top:0}.wpseo_content_wrapper .paper.tab-block .paper-title{padding:16px}.wpseo_content_wrapper .paper.tab-block .paper-title h2{margin:0}.wpseo_content_wrapper .paper.tab-block .tab-block:first-child{margin-top:0}.wpseo_content_wrapper .wpseo-collapsible-container{background-color:#fff;border-bottom:1px solid #e2e4e7;border-top:1px solid #e2e4e7;margin-top:-1px}.wpseo_content_wrapper .toggleable-container-trigger{background:none;border:0;cursor:pointer;padding:0;text-align:left;width:100%}.wpseo_content_wrapper .toggleable-container-icon{float:right;height:20px;position:relative;width:20px}.wpseo_content_wrapper .toggleable-container-trigger .toggleable-container-icon:after{content:"";display:block;left:-4px;padding:14px;position:absolute;top:-4px}.wpseo_content_wrapper .toggleable-container-hidden{display:none}.wpseo_content_wrapper h3{font-size:1.15em;margin:1em 0 .5em}.wpseo_content_wrapper h3.h2{font-size:1.3em}.wpseo_content_wrapper li,.wpseo_content_wrapper p{max-width:600px}.wpseo_content_wrapper .notice p,.yoast .search-box,.yoast-container .container,.yoast-notification p{max-width:none}table.wpseo th{text-align:left}#wpseo-tabs+.notice{margin-top:1.5em}.wpseo-variable-warning-element{border:1px solid #c62d2d!important}.wpseo-variable-warning{clear:both;color:#c62d2d;margin:5px 0 0;padding:5px}.wpseo-variable-warning code{color:#b02828}.wpseo-variable-warning a{color:#c62d2d}.wpseo_content_wrapper h1.wpseo-redirect-url-title{font-size:1.3em;margin:1em 0 .5em}table.yoast_help{border-collapse:collapse;width:100%}table.yoast_help,table.yoast_help td,table.yoast_help th{border:1px solid #ddd;color:#444}table.yoast_help td,table.yoast_help th{padding:5px 10px;text-align:left;vertical-align:top}table.yoast_help tr{background-color:#f1f1f1}table.yoast_help tr:nth-child(2n){background-color:#fbfbfe}table.yoast_help tr:hover{background-color:#ddd}table.yoast_help thead tr,table.yoast_help thead tr:hover{background-color:#fff}table.yoast_help .yoast-variable-name{font-weight:600;white-space:nowrap}table.yoast_help .yoast-variable-desc{min-width:300px}.yoast-notice-blocking-files code{color:#000;line-height:2}.yoast-notice-blocking-files .button{margin:.5em 0}.wpseo_content_wrapper .yoast-blocking-files-error p{max-width:none}.wpseotab{display:none}.wpseotab.active{display:block}.wpseotab p.expl{margin-left:6px}.wpseotab .tab-block{display:block;margin:30px 0}.wpseotab p.expl strong{font-size:115%}#wpseo-debug-info{background-color:#fff;border:1px solid #e5e5e5;box-shadow:0 1px 1px #0000000a;clear:both;margin:20px 0 0;padding:20px 20px 0}#wpseo-debug-info h2{cursor:auto;margin:0}#wpseo-debug-info .wpseo-debug-heading{font-size:1em}#wpseo-debug-info .wpseo-debug{color:#c00;display:inline-block;padding-left:20px}input.wpseo-new-title,textarea.wpseo-new-metadesc{max-width:100%;width:100%}body.toplevel_page_wpseo_dashboard .wp-badge{background:#0000 url(../../packages/js/images/Yoast_SEO_Icon.svg) no-repeat 50% 10px;background-size:140px 140px;box-shadow:none}#wpseo_progressbar{border:1px solid #006691;height:25px}#wpseo_progressbar .ui-progressbar-value{background:#006691;height:25px}.wpseo-progressbar-wrapper{display:inline;width:100%}.wpseo-progressbar{border:1px solid #006691;display:block;height:25px;width:100%}.wpseo-progressbar .ui-progressbar-value{background:#006691;height:25px}.yoast-sidebar__title{border-bottom:1px solid #a4286a;box-sizing:border-box;color:#a4286a;line-height:19px;margin:5px 0;padding:10px 0;text-align:left;width:100%}.yoast-sidebar__product{background:#a61e69;border-radius:8px;color:#fff;margin-top:34px;padding:24px}.yoast-sidebar__product h2{color:#fff;font-size:22px;font-weight:700}.yoast-get-premium-title{line-height:27px;margin-bottom:12px;margin-top:0}.yoast-get-premium-title span{white-space:nowrap}.yoast-sidebar__product .product-image{margin:-50px auto 16px;max-height:75px;max-width:75px;position:relative;z-index:2}.yoast-sidebar__product .product-image img{border:1px solid #fff;border-radius:12px 12px 0 12px;overflow:hidden}.yoast-sidebar__product p{font-size:1rem;margin-bottom:12px;margin-top:0}.yoast-sidebar__product .yoast-price-micro-copy{font-size:12px;font-weight:300;line-height:20px;margin-bottom:16px;text-align:center}.yoast-sidebar__product .yoast-upsell-hr{border-color:#cd82ab;border-top:1px;margin-bottom:16px}.yoast-sidebar__product .plugin-buy-button .yoast-button-upsell{width:100%}.yoast-sidebar__product .review-container{margin-top:16px}.yoast-sidebar__product .review-container a{color:#fff;text-decoration:none}.yoast-sidebar__product .review-container a .claim{color:#fff;display:block;margin-bottom:12px}.yoast-sidebar__product .review-container .title{color:#fff;font-weight:500;margin-bottom:8px}.yoast-sidebar__product .review-container .title:hover{text-decoration:underline}.yoast-sidebar__product .review-container .rating{display:flex;gap:5px}.yoast-sidebar__product .review-container .rating img{max-height:22px;max-width:22px}.yoast-sidebar__product .review-container .rating .rating-text{font-size:16px;font-weight:600}.yoast-sidebar__product .sidebar__sale_banner_container{margin-left:-24px;margin-top:-40px;overflow-x:hidden;overflow-y:initial;width:calc(100% + 48px)}.yoast-sidebar__product .sidebar__sale_banner_container .sidebar__sale_banner{background:#000;box-shadow:0 -1px 4px 0 #fcd34d,0 1px 4px 0 #fcd34d,0 -1px 0 0 #fcd34d,0 1px 0 0 #fcd34d;color:#fcd34d;font-size:20px;font-weight:500;letter-spacing:.5px;line-height:30px;margin-bottom:20px;margin-left:-30px;margin-top:20px;padding:7px 0;text-align:center;transform:rotate(-5deg);width:calc(100% + 60px);z-index:1}.yoast-sidebar__product .sidebar__sale_banner_container .sidebar__sale_banner .banner_text{display:inline-block;margin:0 40px}.yoast-sidebar__product .sidebar__sale_text{border-top:1px solid #fff;font-style:italic;text-align:center}.yoast-sidebar__product .sidebar__sale_text p{font-size:12.5px;margin:12.5px 0}.yoast-sidebar__section{background-color:#fff;border:1px solid #dcdcdc;box-shadow:0 1px 6px 0 #0000004d;margin:10px 0 20px;padding:16px}.yoast-sidebar__section h2{color:#a4286a;margin-top:0}.yoast-sidebar__section a{color:#0085ba}.yoast-sidebar__section ul{position:relative}.yoast-sidebar__section li{list-style:none;margin-left:20px}.yoast-sidebar__section li:before{content:"+";font-weight:700;left:0;position:absolute}.yoast-sidebar__section div{margin:10px 0 20px;position:relative}.yoast-sidebar__section div img{float:right;height:70px;margin:0 0 0 10px;width:70px}.yoast-sidebar__section div img.alignleft{float:left;margin:0 10px 0 0}.yoast-sidebar__section div p{float:left;margin:0;width:100%}.yoast_premium_upsell{background-color:#fff;border:1px solid #dcdcdc;box-shadow:0 1px 6px 0 #0000004d;margin-top:2em;max-width:715px;overflow:hidden}.yoast_premium_upsell--container{padding:16px}.black-friday-container{background-color:#1f2937;border-bottom:2px solid #fcd34d;display:flex;padding:8px 16px}.black-friday-container span{color:#fcd34d;font-size:1.2rem;font-weight:600}.yoast_premium_upsell--header{color:#a4286a;font-size:1.7em;font-weight:700;margin-top:.3em}.yoast_premium_upsell--motivation{display:flex;flex-wrap:wrap}.yoast_premium_upsell--motivation li{flex:0 0 50%;list-style:none}.yoast_premium_upsell--argument{padding:0 8px 0 20px}.yoast_premium_upsell--argument:before{content:"+";font-weight:700;left:-16px;margin-right:-10px;position:relative;top:-1px}@media screen and (max-width:480px){.yoast_premium_upsell--motivation{display:block}}.yoast-variable-desc{min-width:300px}.yoast-table-scrollable,.yoast-table-scrollable td,.yoast-table-scrollable th{box-sizing:border-box}.yoast-table-scrollable__container.yoast-has-scroll{overflow:hidden;position:relative}.yoast-table-scrollable__container.yoast-has-scroll:after{border-radius:10px 0 0 10px/50% 0 0 50%;box-shadow:-5px 0 10px #00000040;content:"";height:calc(100% - 16px);left:100%;position:absolute;top:0;width:50px}.yoast-table-scrollable__container.yoast-has-scroll .yoast-table-scrollable__inner{overflow-x:scroll;padding-bottom:16px}.yoast-table-scrollable__hintwrapper{display:none}.yoast-table-scrollable__hintwrapper.yoast-has-scroll{display:block;margin:1em 0;text-align:center}.yoast-has-scroll .yoast-table-scrollable__hint{display:inline-block}.yoast-has-scroll .yoast-table-scrollable__hint:before{content:"\21c4";display:inline-block;font-size:20px;line-height:inherit;margin-right:10px;vertical-align:text-top}.yoast-styled-select{align-items:center;display:inline-flex;margin-bottom:1em;position:relative}.yoast-styled-select:after,.yoast-styled-select:before{bottom:0;content:"";pointer-events:none;position:absolute;top:0}.yoast-styled-select:before{right:0;width:28px}.yoast-styled-select:after{border-top:4px solid #0000;border-color:#555 #0000 #0000;border-style:solid;border-width:5px 4px 0;height:0;margin:auto;right:6px;width:0;z-index:1}.yoast-styled-select select{-webkit-appearance:none;appearance:none;background:#0000;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;color:#32373c;height:28px;line-height:1;margin:0;max-width:100%;padding:4px 32px 4px 8px}.yoast-styled-select select.error{border-color:#dc3232;border-width:2px}.wpseo_content_wrapper .yoast-styled-select select.select{margin:0}.yoast-styled-select select:focus{border-color:#5b9dd9}.yoast-styled-select select:-moz-focusring{color:#0000;text-shadow:0 0 0 #32373c}.yoast-styled-select select[disabled]{opacity:.75}.yoast-styled-select select::-ms-expand{display:none}@media screen and (max-width:1024px){.wpseo_content_cell,.wpseo_content_wrapper{display:block;height:auto}#wpseo_content_top{width:auto}#sidebar-container{display:flex;gap:.7rem;padding:0;width:auto}.yoast-sidebar__product .sidebar__sale_banner_container{overflow-y:hidden}#sidebar-container .yoast-sidebar__section{margin-top:5rem}.yoast-sidebar__product-list{border-bottom:1px solid #ddd;display:flex}.yoast-sidebar__product-list div p{word-wrap:break-word;width:calc(100% - 50px)}.yoast-sidebar__product-list .yoast-sidebar__section{border-bottom:none}.yoast-sidebar__product-list .yoast-sidebar__section:first-child{margin-right:40px}}@media screen and (max-width:782px){.wpseo_content_wrapper label.select,.wpseo_content_wrapper label.textinput{display:inline-block;float:none;width:auto}.wpseo_content_wrapper input.textinput,.wpseo_content_wrapper textarea,.wpseo_content_wrapper textarea.textinput{display:block;width:100%}.wpseo_content_wrapper .select2-container,.wpseo_content_wrapper select,.wpseo_content_wrapper select.select{display:block;margin:0 0 5px;max-width:100%}.wpseo_content_wrapper div.desc.label,.wpseo_content_wrapper p.desc.label{padding-left:0}.wpseo_content_wrapper .textinput[aria-invalid=true][aria-describedby]+br{display:none}.wpseo_content_wrapper .yoast-input-validation__error-description{padding-left:0;width:auto}}@media screen and (max-width:600px){.yoast-sidebar__product-list{border-bottom:none;display:block}.yoast-sidebar__product-list .yoast-sidebar__section{border-bottom:1px solid #ddd}.yoast-sidebar__product-list .yoast-sidebar__section p{word-wrap:break-word;padding-left:50px;width:calc(100% - 50px)}}@media screen and (max-width:500px){.yoast-sidebar__product .sidebar__sale_banner_container .sidebar__sale_banner{transform:rotate(-4deg)}#sidebar-container{display:block}#sidebar-container .yoast-sidebar__section{margin-top:20px}body.toplevel_page_wpseo_dashboard .wp-badge{background-color:#a4286a;background-size:100px 100px;box-shadow:0 1px 3px #0003;padding-top:80px}}.wpseo-checkmark-ok-icon{background:var(--yoast-svg-icon-check-ok) no-repeat;background-size:18px;float:left;height:18px;margin-right:5px;vertical-align:top;width:18px}.yoast-settings-section:not(:last-child){margin-bottom:40px}.yoast-settings-section .yoast-field-group__title .yoast_help.yoast-help-link{margin:-6px 0 0 2px}#yoast-og-default-image-select .yoast-field-group__title{display:none}.yoast-settings-section.yoast-settings-section-disabled{border:1px solid #ccc;padding:16px;position:relative}.yoast-settings-section.yoast-settings-section-disabled>*{opacity:.5}.yoast-settings-section.yoast-settings-section-disabled .yoast-settings-section-upsell{align-items:center;bottom:0;display:flex;justify-content:center;left:0;opacity:1;position:absolute;right:0;top:0}@keyframes yoast-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/yst_seo_score-2330-rtl.css b/wp-content/plugins/wordpress-seo/css/dist/yst_seo_score-2330-rtl.css new file mode 100644 index 00000000..5b462a4c --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/yst_seo_score-2330-rtl.css @@ -0,0 +1 @@ +.wpseo-score-icon{background:#888;border-radius:50%!important;display:inline-block!important;height:12px!important;margin:3px 3px 0 10px;vertical-align:top;width:12px!important}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}.wpseo-score-title{font-weight:600}#taxonomy_overall{margin-right:87.5%;position:absolute;top:0} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/dist/yst_seo_score-2330.css b/wp-content/plugins/wordpress-seo/css/dist/yst_seo_score-2330.css new file mode 100644 index 00000000..53b23fd2 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/dist/yst_seo_score-2330.css @@ -0,0 +1 @@ +.wpseo-score-icon{background:#888;border-radius:50%!important;display:inline-block!important;height:12px!important;margin:3px 10px 0 3px;vertical-align:top;width:12px!important}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}.wpseo-score-title{font-weight:600}#taxonomy_overall{margin-left:87.5%;position:absolute;top:0} \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/css/main-sitemap.xsl b/wp-content/plugins/wordpress-seo/css/main-sitemap.xsl new file mode 100644 index 00000000..b6e0ad17 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/css/main-sitemap.xsl @@ -0,0 +1,145 @@ + + + + + + + XML Sitemap + + + + +
    +

    XML Sitemap

    +

    + Generated by Yoast SEO, this is an XML Sitemap, meant for consumption by search engines.
    + You can find more information about XML sitemaps on sitemaps.org. +

    + +

    + This XML Sitemap Index file contains sitemaps. +

    + + + + + + + + + + + + + + + + + + +
    SitemapLast Modified
    + + + +
    +
    + +

    + This XML Sitemap contains URLs. +

    + + + + + + + + + + + + + + + + + + + +
    URLImagesLast Mod.
    + + + + + + + + + + +
    +
    +
    + + +
    +
    diff --git a/wp-content/plugins/wordpress-seo/images/Yoast_SEO_negative_icon.svg b/wp-content/plugins/wordpress-seo/images/Yoast_SEO_negative_icon.svg new file mode 100644 index 00000000..ad6a6b3e --- /dev/null +++ b/wp-content/plugins/wordpress-seo/images/Yoast_SEO_negative_icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/images/academy/ai_for_seo_icon_my_yoast.png b/wp-content/plugins/wordpress-seo/images/academy/ai_for_seo_icon_my_yoast.png new file mode 100644 index 0000000000000000000000000000000000000000..4e27c6e221478162e63d589e706f13892b31eec2 GIT binary patch literal 16291 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

    >eqK(e^1UX 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 I-6wwk59{%sbN~PV literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wordpress-seo/images/academy/all_around_seo.png b/wp-content/plugins/wordpress-seo/images/academy/all_around_seo.png new file mode 100644 index 0000000000000000000000000000000000000000..c63aa729a87a3f7bbfec66c97a014d8f23820a5f GIT binary patch literal 8249 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 rkQ~%PbLBDd!>+of;2IR7t^@T#yTTlNB1)69O literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wordpress-seo/images/academy/block_editor.png b/wp-content/plugins/wordpress-seo/images/academy/block_editor.png new file mode 100644 index 0000000000000000000000000000000000000000..bb47a94a4db9793e36f25c6cb056ea69ebfd095d GIT binary patch literal 1441 zcmeAS@N?(olHy`uVBq!ia0y~yV1CKK!1$Ge87Q(h!@mVcEe-Gqah-q5KY2%u|JrW1 zDW$=aqOB%2S8fYcpT3fz@igFYSb;in+wu@Cv5lgR? zib+wcYfD=av0zogf>~+(^%1T0-jmk)F03kA7**Tukes9HF(oy9if=)KWlUv|SNAdN zj?{?mki;72kOE8h_L#_N6JpxR0;)@$x(g$k=h>BSQlDOsQJ8Jf6PwWGoR;t5P?%&@ zTx%@xkvp7$fn~d=i(^Oym^rm91aTv^?Ewqqcb5FD-SBDu$)ZUhGr&G-Ly;7L+)=Y`EkI z#Ehtd5D6qfglf1TvJqfGR3kuUHlv%1#WI*H;O1KFhv-@+68+97;(kin#6`9Re)A*W zxZO_4i`~tRaQp&x6wUv9yf;?wp7Kh!d24g)w}l{oKlZk-3}5Yi|H`|y*BHa!6JvdV z6^36CHiCkSSifR~;eryFa~~RM!b2ZRC>@x>z5Pz=hJ7c`D7jWYm}9s3M(?(hcXs9R zgMu6**g+BcFV&hkcV>6l>s&3g1hPe>+Nx%wtj-p3Mqq%7P5)=>Fz8bNBnk@ZmVG)n z?cgmncQ&v1HJ_Ouyn==qM!;T}7s|iwBe(nA+gILwJ^#~mM&7cp-vKd)er@_Lcjrv% zp{v#)Eg0Gm@c~bJ7=b&5kBG>pRt8!o^7^p&Z8c+lySN8(bLw8+o>Db`@;zoyy2YC4 z8a0pJdi+8DYks4!POa#HtJVcf=y?#sX|N;+_cD3uz0vmY{S8`=1upZ0(wnENpUXO@ GgeCwt5*sc6 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wordpress-seo/images/academy/copywriting.png b/wp-content/plugins/wordpress-seo/images/academy/copywriting.png new file mode 100644 index 0000000000000000000000000000000000000000..50812e745a89a1bfd2be005b09abcc9f58e14326 GIT binary patch literal 5630 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wordpress-seo/images/academy/crawlability.png b/wp-content/plugins/wordpress-seo/images/academy/crawlability.png new file mode 100644 index 0000000000000000000000000000000000000000..ab7c573f20fd408a9a44591e848a6fc84218e02d GIT binary patch literal 9760 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wordpress-seo/images/academy/ecommerce.png b/wp-content/plugins/wordpress-seo/images/academy/ecommerce.png new file mode 100644 index 0000000000000000000000000000000000000000..26af3317a481f8f968143a5b0c0b4e899de1e0c1 GIT binary patch literal 6167 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 Wy#D!yAovF{Oxl`yH_FuS2mKElolY$P literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wordpress-seo/images/academy/keyword_research.png b/wp-content/plugins/wordpress-seo/images/academy/keyword_research.png new file mode 100644 index 0000000000000000000000000000000000000000..75d5d451770c9a348a2b5ecc4787eb985b3cf498 GIT binary patch literal 4934 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wordpress-seo/images/academy/local.png b/wp-content/plugins/wordpress-seo/images/academy/local.png new file mode 100644 index 0000000000000000000000000000000000000000..6916755fea9f3127d84529db09d5a36cd38f6df3 GIT binary patch literal 8257 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wordpress-seo/images/academy/seo_for_beginners.png b/wp-content/plugins/wordpress-seo/images/academy/seo_for_beginners.png new file mode 100644 index 0000000000000000000000000000000000000000..4c932b2f8d9dcd8c462980b6fa4d7672ec123170 GIT binary patch literal 4337 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 Qe`Uao_09DvQCIK$4@M0(fB*mh literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wordpress-seo/images/academy/seo_for_wp.png b/wp-content/plugins/wordpress-seo/images/academy/seo_for_wp.png new file mode 100644 index 0000000000000000000000000000000000000000..363417eeb25452f37268ba212cfead7b76fb85f4 GIT binary patch literal 7855 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�RMmrFaWB&;Xeb(E2J9O(rSTSqy^xy8DIhSPIYl^8O1^w?D8 zo=d{ev~48K(*!1)9=5NG`q(VkSO}WF8-i0F_Bnq7T9Q4&6y;N5hEz*4hHUAdx0I~I zn^SG+e8H2OtLgRruy#a<%58gDq$1ND=Cda*)dj!=GpnbL+nbxhpUTYJ27 zWOxEz7$I_&^f@5+#S!s?}wGWS`% zSQTaah$CQ2hY6uM6;T*2;{G%ODZ&)m{yF_$ANYTJp--&w#J(;^0Jij;20>y_9}z-$ zlGa^Z`mg!qI^|qaHKj7e=jNcX0G_lt^mfmg&J2ej5n4y9DC++{gj*;P5C-Hw_6pQI zi^Qn+A(XQ~23A=NGF`MW{p~> zk!YpYlG9cD@@)>r5${K5_53X-#`y@#$yYvcK0EVs-{{Ki+UzY2>5$NmJf|OXk&^~O z(o&s$QT&`QM3Y`DGy7U7@=ya=%yP#ngvq9#82k0UJg(58#7Yiou$QzNIcrVd7v)r* z`a8a8)Ub?de2xm3%R%qqB2S|$bsuKr6fU}E7zhaFR8byG48>HWf6%$G-T#|gN}Yui z@?=H*I1wr=ijsMd9#;&6({^)VNFq(jPp%wcNS22>Q}Pv1eAxE>YO;!m1u~{rNWCeY zU__4fcX6RKySgcMzmCIBqRAaOQYi!>@-|Ox>a7B+b0>UwyO9c?T_;R?tY@g-_Qjam z(wp^{5*sv~@=h!!`%>@K46X;9MTB9GrD^Fii#Oj*EG=rX6XeVUOD&O~5X>`ZU%ge| zlHVHhI@!gLeP-mtUDQfo@THx*)o)F)M@f!m7h)h+ZRt7&iJWdZ=;c5Co})G1L)X#; zcP_!4G~I9#R~dI!+wO}iB$hyC+~Nb$v6IkmK8dz;BYthCa?gnn@mX@MYx$4<3j%b#c|^N%A*Q?vC^)|0eMhefdWM6rF_kx2^-@Fel8y` z7XTN+X~Amb?VI}#E+3`G+1K$rRFcDU-@{25Gw}O<{Z4{JDi$By)F}iGR8fMW#1nbs z#FkEsc-_AOBl~bp^912q0;jGrevdrR53C5YuMo`9vh{NV?ot7UR&LR8t`$hFvU9^<1otS@c)ihqoA~V8OpIl;cx%@v6bB%^`W|C)!Jl9kRwzC0Bhnq0%Zi!OP}<$uslIRwjC7X zCl}flo5c(IS}P)C{vkF!+&FVe_0d}k57I+5!}zt*%8R+TLe{IS6;A|)0;%pP$vMef zsl}^`36Wc0V`mSp)E1-?oEX^Abfu$gl;N3*(MUT(@+$jN+Cy4}5b@r6pnL7} zTE4?9?(2b|TIKyrGtR&;vu>S25f-c*kgAm}Yho*v`t|Md*j}bI@_JVEmC(-aLmwk&~z~ z0f||Lt{A)Tk?D!=x z7gBWZD!?B&CYMFzSmlh1r6^%tii!-#pI`nZRw7VBK`~)7`yC01+2dk$idd;df}r-p zZ?gZGQZapd+ka7~zOTvN&elKzOO;1|e5DI??RXM_21MnOZE{)Z2h*3wJ>`sdG>`7chGJB(((ZP=cIK19Ws!u@b9e$r&o;rmMe_0Em}p8BVqXXB7}OSTE{|<75^Z3 z|4t6inj)&_n}9^O6XeK4Ph-U8ra6>Bt3dArMYz!31SqRrTx=HfN&eD(14a&upe$R_ z>DYGlKFknuQHN9)s8*YDMRdZFaayuv`8GH;e93ygsFYe(8esOtL~{9`@6`ftDP#`iE^SK zEUnCj=|Q&%jS*Tut3}f-SPc5hGo6E1xtrk1C?a4P*Y&)*l=^Fyu+%)#WD6+(Bw@ib z=JdP}W)H{Y?l>KEd#6uMr-1n}Vuc4Y=C3n;gR%>Ab9U@C{MdX)!1x+Csj zgbP{U*)lx!Wa%3AmpgL)&B6pd8cXe(fl`&QjdJKGuWFUBd8Bedq_ViI-$=jl@&HXly|fNdJWJOZv?VMOZ6Pq zH^S{@RULI#0CjxPn2}pbEqH4}=)x9@81!*YcgsLKcY?gW?CdfQ`Y0HngyZ(R+$0#~ zd>$vBQQQ;EIp7Qu%Y%D;(Z0+fhg!liSqGUn4`s&v4&ZFgxH>Fd(4fB7RO_QF73ZNV;J=XbA@jR6`YcDE!*ikC+BxqHxx500vP z9!OB`KJFM}ig2Lw?|h(yM8`KV%?3g3iN*1HG2iU#U2IP2%E2a|O3`}qM1G5NUetFl z;E@7q51T$6Fq}dlQnlnzb017V@=Y{eafg^)d3wU9=`shpksxt4KyUk+C4D`>r;FC> zQYvi(szAa-)OQOp>~MKs8)uzXXAr`iz{NQ%2R)oFw1CxBV5Ub%0We(P31Y|P<>(^@dt8^M9t#yVQ*!hrej>izyw40U!WEPMJP&BMVcZbZ2GRH` z9kzeMkQA{9!s#_yMGMD?_q-38CtXdcs-v6}It{>D zJXyn=Fq|~&Hyf}t)~P+kb?O?tQw-a(V&23h@a!qVi)^wk=!0(zJSN+B0#wVF)MG15 zCWnD+Yr2-c&{F6DXL)@a2bKN5dl#Ju!7E-fWAtO2$!vM-N5OO!LaP@I$__!1A^?rh3S|^{D@NE_`r0_%t*fQvk^Q|;DTD`U zZZNX3juS2bf^Ry?*$iy}gkws$5;+qV6A-$^XB!DFI2UCID859c!{^Wh!s+8+UP4R= zD}}pM?GMDcL{IdBRYG;W4Ty5uX;czQ54B1GFWtEao$973t~f8+L@1u!&mPz3Rrwga zaXJied%Uy+DIf-nSqappH-E35Hm^?!6j7m*=-y#}CS4Qwz)TlmPDfSeyGWTj(@n8q zML|N^0gsqlJ<0BRkpW9^f+BC>wg1B6liV6DDFQPsmu`PWT_NGoPBAonk{(@85faWU z0If#bWt38!FW3J`l^_>uyryd$w69Om3Ju%~$g=}0Hrsqa`d#|juE^osABXTPLcdJV zlbhnvFUl#(b_-NGS0JvjdJHt}5%(m2hnd5drqo#HSXD(~HVb3;-5urKFJF*B=AnaZHa;FI?>mQO>4C7=hj#uS-bMZhX`vAHTOFf<4Xsx62%_G{Z_aQ6o)(G0bkW=57o zP@i%);O*#HSet;xz)@?uUCdxEHu+Dd7)4B{DP*s;O4NYNS&RqO2Z^QliG_)IDKJB; z+~FR~G}@b4xvOmENC7uoSbJiD-?J1#8Sqxj1nr9gAYKRR8A5dhk1gvQGN4~HY%k2!vqb7Q~lPnu2X;YFPn z8!MqspfV^3PVp|P9YfsuVWY|jxk0q#%VFyhsy8ix0}O`Gn+lY{2<>9*1De=+xRZ!? zWOPr^^>CD=o#UVkscQ3*|{lelj`I!0`E-Rc%@^@JSz0LVW8b@|vX`BjzpD-U8=RZgz&1 z)Kp-{+b6Gs5uv_puvs=1Ov3_}I%yN1?wFB{ul!AJWNE(4!T)4fc>zTUi~17aJXNDH zw+B|=hhy?ex^`-lTQULPe*CJ=>oGAJ{3ubOVcT_;zx3HWw}GtWpO|I}F_!nyOlWGq z@WK%qBqo7dXzqG#rH3Ke*!=IM=d4IFNh(?~P&*SJdYe&`#NSCg+ug+~)rOR zO{Ap*;|6_k&&}z63teF9G~T%r5)=zrXu22}n9v$J0zs?!%A>l!_gnxIPDk8cqYpX4 z*j6c=u-4S?=%Ulw<%THDd@3rG#*$dx^6z{kI0%m&I>p&DdG)jnun z7sD&Fj&O!InUVL0{cY95Dd^i|OuSz_876i-AeJ{-J;U2{AVn%h{LJ){b_xN8Or3M9 zasf}2J#t*wi*x+(`qC_my)|stFO~RQf9{4yLevWfWBn99570GPX)qB8=ucYm^>fFK z>sKD4<@$FYpF58Q3mdutBc2v`Jl3TuEC(AlI)teFk*C7wq zE2Jv>*C{TL7}F(|x7207HL={K>Q`tO;OLh;^ti!aI1L-gi92QiI*Yb1^|_n;#D#-e zR3*GO_oa)c9SsGw9lrSt(1OtdX+Zv@+TDT4Q(=pm(N32xlpE-i_rLs*4`HG{3yN*> z4z_D`QX%N!C}d3(HhCO;p^K1(%877U-avmhxtW>kdV~&te?Ga!hIqkl%R0evS)Eh-)n}J|KtAe-*M~L*F&v{Q7bfwjhUY zq+C$Xa0hRFT!`;y&lm*XRU}CwGb^r0o0F`N!_(DMC<@+)D_foQ!$GX)pd!4;;P#-l zexBfDj;0zY}kbCQ^EkDuTct)uaFwhhk97NYabwArRb8@MxP1K z8zBk5qOfc+4XUcD1K2xG-LH@R*Q4JwNOpIs*Kd0J61!{4Q_`&-zfv&uV2++MIJ> z{6mKdp#B5>_+;n`+V$#+a5<9WsD`8jaVtQ(=1 z$E|-DI^O|~?v9d-c3)JO&nH^;1z{`=^zx1b9L7WW#AS20VM4JHI*3}{+5GwW^bdZ{ z?*eh=z_E)#S^#=|y8QibA^2k@o3VkZeg*7q=>Gx1Zl{3& literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wordpress-seo/images/acf-logo.png b/wp-content/plugins/wordpress-seo/images/acf-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..829a7023d1536562c83e80e9c641b7877684e398 GIT binary patch literal 3774 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 Kw%YpAt^Wh%=%%~? literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wordpress-seo/images/admin_bar.png b/wp-content/plugins/wordpress-seo/images/admin_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..54b086ff61e8b80c05f25a4042a744529fe46e4b GIT binary patch literal 21035 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 Hu0mjfr9J}R literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wordpress-seo/images/ai-fix-assessments-thumbnail.png b/wp-content/plugins/wordpress-seo/images/ai-fix-assessments-thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..bb7a4acea2b675695f4534369e55d974cc850eca GIT binary patch literal 46609 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�K6j5HN9iQc$`%Ry=zl*nGPnsJ8P?b4{@il z!Rbc{y$bjqUfj#nywI`cmaQ;s6ZhnShv0%w&^!Tr@JgDipGp=+98Mk%j@DWwZFGFx zLZ_cmFz9>^|9|mmUoD8pPO5_*^MYiP>YLxv;vDRj!>O;o@^?Jh9$eFV-BFdFT0h2v$bC|9h_>%~ zU~Zximh9@M$~vO&@}oMW(SAzVD!lp@ff7hqjGf(I4BD7DFJqz*jT8+hCT~AEbLMBO zLCO#ux&BIu7j5fst(2FP<$cR9 zi+*bs=^YkL_?J>|B42a1#Ctz}Y9pg6Kk{O+-`WDkF%&+gkzb)!QEF9kYu2po{@(|b!+;J6RZYTM_ekkd$idGxy0^sv4O=TNfJ|9CCsqfl5Ug(zK z4?a0WE{{YGk&lw|%e77e@n_YN!Gxu2%s$7y?}J5PJ$Z-}czd(i4tnTJSwOFFFunBg znf+FG4@N}i*g+tP4z zA7IgKF5|+K)$t{bV>kb_nuYG`mLF?b&qX6Y(_&79)=@H=^xIwogn(_vGjNbzyHtmP z;by+9{*8jc502uoqscjSVCcY;?+Y)MUJoKnvt`!DrY^@CI_V5Q8L5U(mI~q?B0h;} zRiktZVxT8my^mc?loeMQ+9ofyO-*cp`6mwAc~(fXynu;)#>~yMqvzun=f6tAYk|A*WRZ z-4f1bUidRmBCUwYYHewOILUjNK=v-m@G~ml4bx9GkmWS4#RJK#8%5V>Rh|=10NedT zQ)~*Md;*B$AZhNlw@lJ0o}XjFIB)r}#T0CtpB&`qdT*)$#f%=~oGl*zWtSIH_cPyj z+-MfQ5%@cXIs7ktQv3-3(JXnt5s)vc6^^ev30kd?tYAkVhqkY3hPPz@x*2P>u=F60 zcuP%=0}_TYc(-#v`e;3ddcj*K?jmXs3T;WPy^)4vAD8`_=G@ rJ|e;n**j|$^O#8f@6Yr9-)G(MA4=X}&EQ+?f6Eqd8(94n_s9PSCw=Lb literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wordpress-seo/images/alert-error-icon.svg b/wp-content/plugins/wordpress-seo/images/alert-error-icon.svg new file mode 100644 index 00000000..80fa0626 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/images/alert-error-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/images/alert-info-icon.svg b/wp-content/plugins/wordpress-seo/images/alert-info-icon.svg new file mode 100644 index 00000000..332d7af5 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/images/alert-info-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/images/alert-success-icon.svg b/wp-content/plugins/wordpress-seo/images/alert-success-icon.svg new file mode 100644 index 00000000..30519e54 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/images/alert-success-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/images/alert-warning-icon.svg b/wp-content/plugins/wordpress-seo/images/alert-warning-icon.svg new file mode 100644 index 00000000..f52df867 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/images/alert-warning-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/images/cornerstone_content.png b/wp-content/plugins/wordpress-seo/images/cornerstone_content.png new file mode 100644 index 0000000000000000000000000000000000000000..8e007575fde8de64581621fcdb1304a933de8ed0 GIT binary patch literal 16450 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%0ALvdy^owvNZ<>*HTW$}7-*vGr-LKUcNQ4n< z0<_kNZtlyMaGRZg(V>zgESh`nO#43Zjpld~q%~BkHNRisv3yPXU`GtED>m|C%6;l` zbK6o^#++x{)0=$HNt@3!8RE3zh4VwC^fS7-0xa3C8es_&(c>+&?|1R2T6`E;YMA@d zW{C{Hs1%<{%&={u!01omG>4?_!ZQE*b$M8vytM$ixvKLzoifq&Z;QukiiKaAFIk>8 zMS2BNBmF}1v6)}wui>H2rHY`W&J;8691w;XJ>)^gQ6Akx64)*YW@nm9Z@ANTEH(0| z1O3dY=uj_S@$XT0>h=|m=#_j>;(PEHceSh3d_h+sZOMcSb@F~3M29U_JJ?;VQ=9?s zH@xYYVH&v9F%4j--j-UCFL+;l{3ekXK|WD-dibVHy}>pwsX{8fOIW~%c%CI*CefEu z_q(`?J!{hSA!D3croVMx&N?JgT-FiGOr>d*BE;Kk#2T#RTOa!!Og5EvYA2k1@BxH? zF`f?qcpI!*?U2^9s?H}1*SDN|zX>=06c%;1R^c6K*U>fy z)0da<`H}pBHl~Nv5%i!%bew#p{YO9Erj&jTzrVwI&|7!8hpO(B7a$e&pFeT6a*1l} z&$#Gm`5q74$PsE3E#l6>s9NiFuG;_k{IipxH20lrngQ&kx<;B1#9nM~m9+Er@y^y& z9xAQ3>8h^!gNQ)IJev|CkPMykSto61O-5Rjj0#x!g($UxYT)bQ*~sOi3FX_9hS!HB z#9{v7;R*EU)5M-@%c?tm*T7+^JHFXIg+7rrR`lX_;pR5tFGKY0sf*IQJmuv-HkY}q z?NOfwXDe{ud?5Ijs=qY6VbiH##f&4;BP>GKqj5-RApP^kK0L6{yAthl?4U-@k}72y z5AP--XaZW3#twJ2^bR!(3BFo~dY87%*yhB4W3K5c8e5F(zA4vImK}`XK&N!v8r@WE zuX2uc-V(L^_?xpAuT_D$@#dTQdx-eWSr7GAK3O3+H*b${m#3X9D%ZOyxC#lUKfYyE zsTl84fu4sthF%>F`!Vi1Rk zNKj?<&ZWjNGyf||+3I4a?D^sBGT@Qi1pR%9rOUX~!#BsF9}22pV{bDpre_3bQc+^G zS>KHCs2y0_AZhT`I{mv1I*3>U%G5FtuY;a>7$!vM2>iW-MRi9lWA3`9lsBKmT}Fs2 zld{tQ9)MMl|6Y+W+%o(p#IaN)|7ra1j{np6KOO%o`G2MVHAay)3Nbwto@DX;cdNd( Mx&f&1i9_^%0VNcts{jB1 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wordpress-seo/images/error-icon.svg b/wp-content/plugins/wordpress-seo/images/error-icon.svg new file mode 100644 index 00000000..43e859de --- /dev/null +++ b/wp-content/plugins/wordpress-seo/images/error-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/images/inclusive_language_analysis.png b/wp-content/plugins/wordpress-seo/images/inclusive_language_analysis.png new file mode 100644 index 0000000000000000000000000000000000000000..21fc79eb4c7226f446c9b49514bab8b8eda8db90 GIT binary patch literal 20788 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wordpress-seo/images/index.php b/wp-content/plugins/wordpress-seo/images/index.php new file mode 100644 index 00000000..e94d9a42 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/images/index.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/images/indexnow.png b/wp-content/plugins/wordpress-seo/images/indexnow.png new file mode 100644 index 0000000000000000000000000000000000000000..e86fb02227028befff2b97ebf28321d36ef61cf1 GIT binary patch literal 13613 zcmZ8|cTiJL)Ha9$ic&#^bcf!H=n8!mp?O|Wl@{a( z0-~-uE?|!G)y;aj{;xXBU(tp<2!2lA0hdQ6VC3cap*?On2{8ooEg@2sd2;XBgcvlu zd+rn6WQwlPmA?D@%NEM$v(O!8P8pwDu4(qsg8dZ?{|XgTZ)9saR;+&vCH(QOz@^$! zhlO*}p=L|chmFC2amAyvCRUKmWyN7>wSXx!;acQCpu76WeF=DVo=o8G^aAOAbSsrZ z^!@sZy_Wts;hi#ggn?ri$K zdD2EZXpRDHU@mz zJk493#mfmW*rSfLn9PTj`6u?uXtGiVN5N)SC6oTn1`NUBV$p2_t}s6Q(LY=&@&J3R z*m1CjWY_oGdY*fs)^qF58b7?kI5OGl?nElH*H$#pRWXqxP^Gb#x`?cXl2nx9AH{`( z_gxk1%lqrdfm=Tu%G)@OxrNxh24@)w+XMx+Iu@)OB+XN znObw5eZP!?x#QNF%^v)4Vy!AX_6YUIm8al-KJ{BR8t7$F`b~RkJ)k^!Jug5#!h}Uz zGd8-$tD`960qTZHqW1WLirEh z6ohj)N9Zk&!wcP7Am1$NYL0uO-ZD2pkLwv1;JaH(<+Q6o^Z-e;{uG< z{p#lzs3Qt>^Mb}neGxYslC7c)$CH>F4rY=_w|+9~Y5$UhLdRAVsxb~*F?XS>yf9_x zBY3X@pS7b%d?+Gay-Az&^T0q5B!#t)RmA`Kq!$}TZfd5$e6Q42@ z;c^)sK2Xfkt$WjW2rm7w2bwSVd*@Q?XF&@0ng;X}-s&_GKuBNhzP8V1%_QPvG**?enps{kkWXknVf0}})mU6{HBpsuPXg+69EiT^avh|G-bB;KLeuVRyM!bN^(xlqN+*- zv3ukf!JY3k@mytI`3jej_byp5!&O)|zy6Z&2d=GyM6@v!f9I;QhhO8F`VDd!Q&u1GB&nJQX@ z0s&=J(BrVgttOL=RIRHrkWbo3>6H#>RbBJf(2ca=&%VI#%isqVGiSMb{pv#(j^#?Z zcS(J(<|YXK7l-Zxp5+IvAq8(YzS(8i^t1&Am(?{U_iaZP{_CcQ*o*(kWfZ`wKl9ZK zLYkl47VKS&wf+7a7?Sz@=12gk^?e;qc<_y}*dAzr&=vTsS_o`8=47}h8qVDaCDcNz z*>WLcer|C?`fZT#CB1Aj3I&|eh(E@q%1I+dCMDjJH)1sk+l8P^^6&4IgB-1bKS908 zs}FMoDg`#=rtxYQ#X?jN0;N^#ipfLg8VristWlX|w(QJCSo90H9jEt$?ukD{X-q^b zQ_1ZR-`QzUY;^l#GW$N_wj571_)|fKnkmvLjGzY1j5X*-CcrVSz+PI(!I;{qBJ_g! zy0b$VLNUm<5#%Q$!(UWTNe_x3dS_VNDc-H0CL)O#|6RVf>FVN$IOl7^Sk){8MyMcA zHycTaXys=Z(6cs0u%08n9&$M0)kN+nV^#IN$5i?mR0{$_HnJ92fTEs%F8)BV#2W7- znXkdR;M5&D8^NGJYGhAh*0i3V=|;`qwmQRlK)F5(hMS)-?+A>cSusc9qU2M_q7#FM zuf7TAXt`Ruv4VbSLT%x^a^0B_*@|Nk*fYYx9Qx;!&NwWcj-S#bKTwe|;S118Ip(W< zc!7EQUrbd{Ct^GSf?R9DM4~W*kM^0AsJY|79xL*BJ2+w>^v%-r@5jLlp{kKH@Z)2g zrUhZUM-T#dW;{%7xm|}7CJEF!=BVx2#to2kte<2e__O++rLd<)tEdv_p=!`O+!T8E zJOR(DirlY-dy@+~;x~IuqJ;X_NFy;?^xe;zL`fg{4jI*1oi5Wpj-PwJ9Uz{?N?WEu z>ht2x>bsTpLwjg4D6D4?L#yAelC@i4?tzP#?(Xf@Jy>OQ%>N^)CA4Q$FSDrlQj3X} z?R_~UpJ%q9jXcb-`E~4gc%4ec8xTiT-=$9*tX4flL4Fx-G5zN^=MO~W`;E9wt9ke? zvE4LBrZa=h$%2gT?m&gxs`cY4q)1qS>EMVDJglH_{EhaV`;DVF5|>LY+TT zlxBvXAz1e~uMCTmrYXZ;*a*G#DZE#My7+L3nbpR;bpch?9%grt$;&f8>#v0mlX3tWj-28%oKOT@A6^2PtG z3Mbm7`ir68$v?#;wT@DRcG%v3cZ~smG~+%uBh^#g z%#Ac>%F`a=7^Oo0f9vpWb zXXm^{v4iC#e{ot9)bdC22o}upL^Q`({#4`UL@_XTTc{^F{NHbxi}k6bvFvP}WYI+Y z1;hwM%B+%o(ff$04v|UUvC(P_S*~e+M6shGYTXA!f5ta>vz5}cRM%Xvh7(i<*qypy9XC>EI!5xIfcUyyZ@u1nU zg{@XXjFyb?gPY!-j^lMt5(#{Og@c?}>?kchkhp>}o?!8Z*(}OPB*ncQXfClCC^;mR z7<&9td*ih(@4TqQBTShR8%CW=>+T-3Z9H@PIbKt(}I+eV%OGknKby*EMf21uri4nKclG@vl{owj1lupx726Y?A=Cw5`{8bX@$W_D4}aY=Y(Pb@1Kqh#6kyEhY^=p|;2{ zr!e_f^f!{VZq#+72>x{NA8)BHwXjmlO04A9=NBPZeH0rYP* zx~AJ5ZZVW8dDzvz3F%|&KP=bPCwQM`Dzc0h)2rY;C#2>-DXMuK3{rvY~= zN>E`^M9rY9#VidE>}@p zO%CQ99X_^4Wb5Wx^h^M!cXA3e-nqaTU(`Y{R@Q6@HY}i}J6}arZL5uS{HFTWQPl%7 z^65hws*v2|qq^GKnl=!zky>=D)BCnF0oHZZQ>S>0wm1s5v-Y-bJ z9TA(_Ket# z04pHwsTeuuD;?hmlNCc_F4oAZn`f;L&d}}mr6HQ0Dfd!RaXzv86oIu8@>qM-LD0|= zq>@{B&@d=3Iw8|PMuHZR&Jv>E3*^J?M-=v%=gg#9?stl(I)XQ^PG3{DZwNf} z;H0^jn)s2&$%>94ifh96>JwGKX}R=6t5VEs-nDDc0qQ;$@7Y%wb0W9z!C@w_K6Mx$ z^T%Wvgei=YkO8WcGzZjjBMciy7#tL{pab#qcknk$YL0aZE~f|yeLol`#s|_eFp*9= zZh7)$rlELEjO_lJe1D>dEH=S`OP$?S z-CF~tlC<)Zlm0m@7TV+R#Wz>#P z#_y25?w1~=L#oRVgi%z*9Hw`8|EGbB+Zs5C- zo1Fhz4hMVO`+p~2Ij=68jMIhMvY5tdeTKH__+{Myj;3hckkl2eg_TR})u5EzdB`vE>1^HjiwmtDSIu@2#>?b@vG5OphCS=&PzGWh{ohBr%VgwdMxk zdHt@(k_b#l?fqMG2{F@`iQUAd+1PhZ$;{wC9jd6RUO~_BGC^19Z!Y{3VjAq3%w(UT z-&8NM%XnOgySRo!O34arp(F-c1(OB@HXLcZ=sG@eCchD(2$%gf+&V zc}-;jD(#)-SA&Sg9Gb4eFg=4bb=c0y_I3>0L7c#&m?b6LT3n;CAO{xaPUwBBT}gPV zNsb7Vr;e!1X6Q~K-kPG98Jq+rGix@MmwUsem^d{>g)j0fEwXgg;gcK%l3-}m2ZO9UpAv@R_?<0`xBAN(p-O)=MPwq4#{Cz?PJM)8sn797Ny`y4bWl6ROm0=CFD>8hxI8tL zAr=BOS_6j?#7~O(1Qn}RAY&PdJ-5%gh9fO`=)JcLGEbz9NhB(@5vGo!dopP&95}sL z_^$rjk-?xfn5t(GB=^Gzr34~Y?0PIl2CEJ^xGwT~f802_7BCL9R1!)Bl-|i;cT*&F z2)rAj=~*n}XBE3DLpOE>ALDHCvGet4rNKRoTyF+XZO2eugCC8k^jZ8_azFl~#FO@R z-Wdod+~<>Im8DAMm!!KM!W~P{f}8x`typer&8yeU zxebP>J!2i$940ETQuSUg3&F&`rhXpLD@v(4uS;F7BF7~$8(>g?`xFV{l2e(NZ-Y`ih381jFw3;`PQ^w-D=;NKZmD(n zWaGcss9!Lv$2OC`6q8Otelbv8)~>85+pRyOEHhzR$xIjI_7$C87QE!Xy(7h&cEN#w{NDrD=Wz+ zS##%D<`eEVhv_BToUe!MXDKlw{H-Gie9T)Wc~=d%{0*$X8fN384|KwcUT+x&F*^G# z9ORzeHxIDV3%^frf;NAiKSq$Ej_bQ}=<;Pc^2*;BoRR|79#?QYu6c98Uh1iVABmP8 zI`DYqD>$-+T{A5PqcdJI9*N~(pk%h}pa)5iI@wti3ql}$(vG(jIAXp~v(h}T55*My za&OWVet~;wdm--X4S4*!aOSVd{6;fN*M;3gDfiDJgubRc8a(iV1hsHk4nCe;D4aiB z?7FNR&F6j7k=Nen>iIGWsh~Acxg(Y8GFO|MS9V)clH&!bso!BPb6a(TKT6<(S^idm z+-Lc$X@hN7gBjtBl)(dcXx|`i{BB*$H04gHIDV1sYY-?b%s#W(8{e|jgVwr?lZd-$ zX4Vk!?!zc_vikOsL9cm?w^bDRFbM@E31%q#0Fx_D9CaVuK-&?v> zY@kr^g}%7C_!#~$7ONtNTeIb}NNLQ7=sj4|_LY1vPa5L3>)ihN7^*YgaEeG^Cn2Mq zUUStzi+9YVn{{(~44R~N>h7JAHo)=+Znuf_3yJlARpTc^z+Kshluu8kU>B2)30Iw_ zx)ll22W0Yu8MeEU*UtOwdTYnyy#Krr1$s_JN)-QXiQ9rHMfc46Y0r8y0gMSyUB^~RI&aJ!QtosbG%u2Z2ob7*%3@Op$Dhz@gX$Z+Nb zRHiS2L^Sn5t-Su63VfLO26`{=OY5!YHYHl$lbMAw)ZT+F)-p7RNz1-O;N|n-j-TV74@jr4J z&Z-)I|3Z(x+0rlOwy0;xn>B>872s7ap2Uy69?OO+Oj(lDZ=smDcZp9{cZWKWeDt<- zkpfq78Gx-nnh1iK%@`&}k%Be2xcp80zZ6P@p=Rc2P$mzHBk!l>Wi+$SCL=CMxEWo^GlZN(^bR6-Xizf$*Xy&ls1_8&7 zac%XVD>__tkVoIAcNM$g)@EKMq;`7(Z5V%2k>hXqs-aOzm8|nXE?2JHyeUcj&R$ALXzLry4R(G*{(bIh1#R;jdUm%DqwGv;`=?yxtM_*?T zW`O$wJ-GNioO2q)^Ey;DfcV$){pr>ywP!5~vuA+5z<#N%uxjnA~u^WzQ9` za^P8ibUo?PGHVq`^`mhNN5}55#}*@hg%0_3&)0+16A}DbRHr(LV?Xx_9!YBZBlx0+ z@`rCL(zAo)lm_|5a_Cv3*EUFMA&u_x0>>3Q0Sz9D7GJu|%CKAIkmRiTNaB5x40Z*M`wyD>X4!IpHR)QoW zh(!9$cnLbt`RsaqjyXO4ao9P&6jN~AY}K(~Ord?ZI#s-U7BeO)ES_UEa!CYo&c|v0 zy#bNM6mY$IQo78@WpIBXRyC6pmQiOHZ9cyA;PJnDmjQd|IZ(_Uv$MaHlpkI~VSeJ; z1p(yWk3zRB4aj}aI4GI)XA^Ss7Exqyl)g|d9>YyaKRAVs<)Py9^m^DA#s zkOD37amoF-_dSifl<#W8%#OtSfh%~?9N}>l^2ccVC&#v9?K>n-L_~0Q)_5&_w(8#? zp587i`kt(n^MMon*qzu|c}$QE%fp=Z8G{By;UZ9aNDehDBbaJ?LUGH$mik2F4}LXp zki^$CKSnPL+889O1I{>>%J@K4UOzM7qyD#8rrImrpIhb2cJ3LG>%$IMpz;7~?B=QT zOBM4PjGvrUT#pe?^kQ4_Szad>^xmdVW2&=vV$aDs@qO2VR;C1z75~0VaD=W~|M~5{ zgn0;J_D%B6lDG$Vi1Lo=#^5(Cv>yXnBZ&%q3WNhqA{Y@^sE* zX4`pPEsUKM{&%*fQVzd!ar(szqMS_ox)z46q;72Lo@2X%Ep9VVaLX~@4&$oE(>a6n z9vR(nd(rR!@wjFz8K#LF?(Ta24>N~M##m-43>IL}Hwf|7K{+l@i`OipRUVWN>g__7 zee?-a8Z7A{a!wfsLQ7)_pX;{W$Z8M5jJ<-=TeQnTs-;&nzs^PM$j5(?J&R>+cYyD} z=tzmnryWWq8BDjzYcM{61h>2c9df_kPsh+kb8TG@uf2ff=kCMD&wMps4xef@o2Wwj zqrQy&mg!qlFrGpSY}ZT{;}<5-d9CW5q?P|D_Jj-B^G%zs3txT~ooO?yc!V})Pj)t9 z24})4Z6x2kEJ(%#Cpo2FLin~0^H^_jW?Z|O-`Z~t#*C@(D2LKk`LAD(2~fLv=W-A2 zKmlBoYiE+|%Z~+{w4W;<-wqeGoM_+WP`IyNTX~Ow;|c@Ah6}Q^`}fj2Sp^>KM zRk;Tcl@XWXg8}M*#@Ehmx0%?$(%VkZDuxPp4uVeeL}TimkakYmCvC{@MgMAZB_?RR z^n@6D_;&8*7(jRKrkfsra;oRPTRo$B8so^e=yJ9 z%}#%o)s<`Y4;1!pY*Xyq*WcSF5@)eXl_lpqoo>L-jW7AH@*rn{Ck<8FYr$<$6p>xX?%!E&xi4fD@zlpE)Y)=Z`9o@3>Y8+l#tiiV_1E1a*`&@+{ zpPo+F?tUnLHC7jS+weh#UfzABho9u=AiU7+OW^Y$$&?gnVzwig>Ev)yD?C2ZjNj(T z=ywT`yoHMN5a#Ww-OKu+5S4*dtNtzAq47@8R(V+hj(WL&+9GA&q*G!;3?T2IZvq@J zU*iI0pFrX~Wufjd!ph?l#^ynu$1gWyTe;UyVgg6du?d#|ImSDhY^e{vc0;h*Tqg_AHck~(%0?wOy5|+#ASU|bg^ttpr zaOjPQwpKl0ak0UvxU-iIsclW6W`A4M8Gn=={gj(BqjVhVSxx{D1>PUvyjjb3aWD{-2 zw}r*zFSPKnV>6ZIG-=XBBfzq_lTMvt1Qa+1M%VydDAyE5ye@pK(@bUQiZ;{;VBUU7 zynMjWL9S63finD!9|MoRl#AmgU7cQJK&se^L;aMN8^FkfPsYH^cDXocR|*{1%fdOr zhEy>TC!OLl$t3MA1-;lbk^uo+K`0&tf96b#IVZUV#;EA2;By%9Y)EzCb7VhMgsnqF zkDLWX9`xY;@`3clp{EBo8M~WE^+i=kB|SmJf4Hr#HmIJ*g!me>`q5HqJf_q9tW{R{ zWse4Q?g|MxzHnDB%$^0lH;lMU^_lx=#fS%=jCSu%sNN#^R4~oH!1$@3qBOG^hhq=x|Bj-paFc;@+4eZHpJ=Pz)495%xlb#Y6mhp)g z$!PWh(q0Q+!@hGJe`h?i9*Y#5YJId=%yeGQu~48jSt*C{AJ(Oz#WuU_hf5Di(WbVI#_g;xq(s1H21( zUBIiNW!!^+#!uKu8uHUc+jSnty=MbODiJ2$WV6V|@+Mq^@}1QFFGIkaSny&%IoA%u z-;2L|!?-}%Oz>2-*o%1F-iv5HyLgW0VX^YNU8uI?XSlgNuTpQc<#4Z0z4{UU-&U{L z3P-n%?;YUR_?}JG2aDS}lX!fd2TXNt;t(DdFGt{fHRhhpV!jc><1g=^*mk7}xW+zv zOJnC#)U=#u-8_ES;QiO%#H!SA!?OzKLDOkLAKIPSVlLPKg;#12?GSF*6w2JYZ_ZQi zF?SivR%ZWuag~D_qr^M{DvWFJ3)4=Fy6!in-qwy@W+I0ucswg_QQ?9brr35vcHqUw z*^A<7F2mW-d~mV)gWK1}WMfYMDwAKMvM=luFmwo+^kqUyp`hMk?*Na$@|L#e08ff4 z&f4LcN85&`epqSIC*k*j)W=DUDHC}INd-@()RTx>cl|AS>K$<>GFGfr(3W2$~EjwujENjQ`rkOOLq!gdy8-&gm)7I+wzO+5Jzm(J9I$nDlE4Q{^AFkLqz z2Bdj{8DIyZ(Mn2#gf6KjNEYezE*N|1T!rNY7a zx)jykdfQ2>$CM>Tw>OJqr~l-4MA^8SroWw&mR4r^@5Q1^{GBhgcESV9G2(|Vk%o>h zW#%~Wbeg-@DfI`23qt^Vt_#3e1jcG&J{SX!MwKvXxMN2&n(0OUd|5$*C2#V|4E)6s{t3|V zVp`32`WEJwpoTy*tc*$db!}Q7+Pb4!vx=|X&E&UuH&e7n(VyQLsA5dhqv(<{qN zao_F;mTpO2%7};v8~FLU5#>iW3Qs*frG1@XfgiN6mh|}ZH#P0%maa3xD46&JvK&n6 zifi`@KCRwD7s3I0z2ZR65NNuU%y|UAH%uJh`If=+D*Rh8NDp-Jhuu58W;HPEk2+91 zK1TK#-=bI#Q}Jrv2IcyCFH`N<8#|@Do%zs790yVTwpzJCN4|s48N%?Micj|j@h0*@ z{1!q#GMM)&HoaW_{tCAPNL-pJvNBf!U)) z-ASWawG&YvT&@+@p^_hsR^v7E03LWtyBOt3a^^S4O{kk8i*u2UMVKS@2;9DOW66XZ zwZqG~n|+}8&a33|e4*tlVxt1qxvb^j6Q@Y@RRS+S-K_>_^emE1?>$ku0q|`ha)ZJJ zjSL4rXU>_hf(^s=QpeKNYk)9DkGG+@ry;*^nam{Nq*Wr96h*;ECj%9T^RPhQw&H96 z76@s9zLSgB82{rJ(+M_z&`yh0nj6JOHW0mEVe@SaV?~uC-)V8&s4Ffz(V6jDyf})# zO}-;7x>n`S>>0`{;sV`gxGzOveeg{WU*4PLV;LyV*Ojwy>o`Bl4*h+-7`2R*6@ zXW_xgGWW4H;-Ch5QoK%VBzsQjzyGj*)odpjJRhaIr*Ps0=az{R$m3BR!TrVC|CB%# zjV&!Y$qwZ$?G4(x;;iX%?I~_TyV^rtGZ}Wb$DN64e`5 zw2J|I8`Qg!dN!BO&y0}CioG+M@Kr6L4pS0?vQ&qNuvlVdNcvdu@yyH&7Wxyqr8UD3 zLmX_6ohGEZe|Ojx{Tt8!VJTfC_96At+Ja3&_nfD;mal5aAOyYKPJpz(u0wUIqg;Qu zLOB6hCgBb;{y}TiE_x+KX%u2{Xx3;e5=87nCAeXaN27yT@sS=&0qG-$=ue>EJjrNjFNQJf6eAnaCMVpmwN*4P&!H}j~5 zfV8(>)74}{hK+2MH93RqbBpjp#V!XDl{8yN8FW%(;}KAyvTT@KvZ3)06g!(>$H8V} zRcoK%!uNxcROVPC5&jxFm(?hmdh$2F;4ZYb`=VW6N`S&qH1?VVd)FPc;b%vi)i3DT z36NXe;tx=fyVC9SV>k%waq38cCt~3lvG@|PO`r9ov8p(XGUmY)9;P%he;;=PjzNP9nh`lPH5U~HayrCs&H{9?GAjl{=W z-__nZ(hnUNsIY>=+MdOm_8+7sHa{?Ii>1qBFl5+rdmhFu4;t`$c7n=&Lfk&|Hl;khNeUrx@>k5)qxuf+r2)RdBcwr=nTzK+h>(I9s)L~l zD{ZkXn}dU4HW;dsE7gFq4o?fziD&>=FBQ|d?zU-rw*eA%PmV@4_aljB=Puz7#6DVy zvYKL9a@lAB65-IC=B^`i^0X}z(0(_Ja=`YLSRv_Qo(erk^}(;Hk)oUq(3e7qL9_ojw=b!)7%vQOYgWskJ)GY8>EJ0SZZ8pm2VUG;bPV+{e zACUD{D^;gATiaYm{C+wxXOFIZ^}fi`m7yG_M(}4sCDOg$Ta{p92WXlNjnV#e8~xs4%X-Q#X8U=i z3BnpPu=;p8L+E~_8L#A6Wbc*hfDjl;_vLceoqiWi0GsBXv&?oIqsu6vb~hpPTEBpV zQ<W4iuR4_3EO7AFbmgoT4-+)VyL>*9Xb-LVtvWkD87xNm8g`GzKdARc^oE=0 zS7@lD0mN}oty_nXKyD5(SeM#E1VyELqqriE>*ii|tcN_kgP~I$3;xXvx4D~RN6?Hh zBX_aG_u1DyBHbmXL_L93-*wgGYFVNR5;lmt;@dJOU_kEw@UbQ4Kc*?05Z@xd)@weC z?enrHG{YTV7!S`omxxc#qk)>btP2`kBu5ibf~xjNZ--%Enl9ILZ7|kPDs4e3W~yIFjavGeq!(mj4#&ti)hf{D@NL zHL7VnA1cyulfj=Tb?%< zrM-TG(uAGn;^4B)#(b9X)$d-TADRu94_g5X5{_QX6T+bO_Sq;{HVEmT(;~wq4;$`5 zv%}Mg^)z4ago%Km_Yjh5$?a=rT036aEaZAJ@$Gt_iR;ngumHk*r92)pB7s&tHIn`>IW)yta@2c6DZ1y1O&;;HNJf08SN*T6p zzy6S|67g1`;|=JNPQxJ<>D@68BiM^p^#|*b{|Sejr!w3_)T>o_%mtJvOw`2Y zFQuJ==c{={K-thIucABdtCEM*UcdtXMQO%Nv_)gNqWHKJ*9<&4Zc92}4Vu1hl)M1Qm34$6YsaP35|R1h({A@p zTqRvtikpL)SO>e9jj4fJGU%sDH86ziYAf0eW-u$}1S1@~!~ATpNfk2K-(Fstd~DQD z&#MVfV7!E$#1i$B;v74Cex~H$nJS3x;m_)Lt}qU;W@%Yhkmiwj4g}ApwqV2d;|AU~ zeJx(g@b^9JT^v=`%?#0LS2DpNWAbxfDn?hTBTZ|LsVGoqD}2ng(;k~TW?B0FoCB0? zzCg;6YDC*(%|WY9!KJ>rji?>Ag=@6|R}h^co)Ebox3<@=Y@+LGhraCI!@e1f+nUsX z3=LR?YL8jdMKGpTxY}>5(8ZxpXVfwEHij1bnB_D^ zq|eu$?&htZE@XJc&w=C@)=%)+b4r2s@v2z}%b=L31dM-x_c0Uf)Tmv;;~of^3!}Qj z{S3&|uEdxJM0hrTJ7Nq=YRN_6WYa3!WO1o8k&RG64?aQV!oV`U}UP9DrJ$V_R#oM7oJt=_LcfuBX9| z<(_9=KZvS6Zf2<>sp-THHwgd2an;;y^2y%L)1s|^65(!A?eR)0_e%gAvv;S!FS>l5 z6{*rHA8IyeUqR4T;^OEP#?sZ;QJxCTI~nDP;p`ovx-gw~EE6huS-_gXP0QT#ft4sRq?JQF4Q z(=T{jthZJ8HKAq<>;18Rodg@INGtJ^qHXkH9!OGr{N&VsLoR_@A>}09_(=yD|E^B- zRzeVpq)Q`4$qVN)6QmJhkn(s(LdLaS{B}ZP+pF+- literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wordpress-seo/images/insights.png b/wp-content/plugins/wordpress-seo/images/insights.png new file mode 100644 index 0000000000000000000000000000000000000000..9af1fbf5115c864acf43ab1f753858f78e5fb72f GIT binary patch literal 30697 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wordpress-seo/images/local_plugin_assistant.svg b/wp-content/plugins/wordpress-seo/images/local_plugin_assistant.svg new file mode 100644 index 00000000..44e32643 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/images/local_plugin_assistant.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/images/mirrored_fit_bubble_man_1_optim.svg b/wp-content/plugins/wordpress-seo/images/mirrored_fit_bubble_man_1_optim.svg new file mode 100644 index 00000000..187e6c45 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/images/mirrored_fit_bubble_man_1_optim.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/images/mirrored_fit_bubble_woman_1_optim.svg b/wp-content/plugins/wordpress-seo/images/mirrored_fit_bubble_woman_1_optim.svg new file mode 100644 index 00000000..4d5a2480 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/images/mirrored_fit_bubble_woman_1_optim.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/images/mirrored_fit_bubble_woman_2_optim.svg b/wp-content/plugins/wordpress-seo/images/mirrored_fit_bubble_woman_2_optim.svg new file mode 100644 index 00000000..801c69a0 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/images/mirrored_fit_bubble_woman_2_optim.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/images/new-to-configuration-notice.svg b/wp-content/plugins/wordpress-seo/images/new-to-configuration-notice.svg new file mode 100644 index 00000000..2343c570 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/images/new-to-configuration-notice.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/images/news_plugin_assistant.svg b/wp-content/plugins/wordpress-seo/images/news_plugin_assistant.svg new file mode 100644 index 00000000..f178f9c2 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/images/news_plugin_assistant.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/images/open_graph.png b/wp-content/plugins/wordpress-seo/images/open_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..cb53dc2b3304047aedb255272728dff5dec9e265 GIT binary patch literal 22912 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

    Cm<)*{M*i7IH^I0Ju2btdqdKB)wB^|NmKkZU zdKio3xoqS>_x4!XqcSS(dX`AmS$;s1)f8LYP&bzuU0s-3r+uf3!o$lJ3~?B@X`jMUxw z9Uz~@FMzX$ydMqBHnZ?7)eWyap7XDENyAbBRl~5@ais>e3+=? zg6L9g^X1OcTNFWgB+_dD+9TItyCd#_B@ZZO7}b#B>3jhF8h1e#VXJHd>~Bx}hR!eN z^7B?!;=HE&66z9ioUoGN9IKASQ?^#_e%fZTcmM{X&X~YG@nQTVa%^bZ?Lo5gMQm9p zCDX6kdS|O{AXow=^)TG>hB&un#oF4P<8`+yZk%Lmc#HS4zC7x=1yg=~$Q7rfGGhFM zZsNeBbBMLptvd&l;d7q@&om0~Gv-6liHzz=yx!U``)}ktfhR-yy+bqk2h@)C&AJYj zW}$%>WuUMehL@^O!|Kj6e21U%;BMNRTdKWm?><|n7|}f6 zxtZHFxxVrX*%(KpbMzv5S(b9i&~$zl?bQ_Dym6Q*=Q-yz!BMXuST8x;DftTq8XYRi zVxBcka7IQ){d96u=k?FN6JIbhaTB4yf+e-5hCVf_OYE6b8+r(CK3SQnJjNT^CWdm67!JE4=yoPg{_ zyBXrx{mZCY=e(VrWa4JT8;E;zWk_1-TvD(c0`1un4T}&JDva-ndNN7UJ^8R2k+%Gb z-2Bhk;?=O$Jsfk(m%wjt9V)xL4Tw%xxNT5hj~W#N9{Co9$n5>h@nTCi&=!ByHBAQr ztdfIZkDBylb54d)zCxk>h}&nVS&R%xB>Iz6v2hhmh}j$63XdY-T2=fec3RYeLPEp9 zq@d^rj5jT4SNHF4if@QYHT?(R80#2II}_VemC{u>Wc=MiSCp|Y%ymA4R8BF4(7yH( z*7WIKyY}-mCCBGUL6;r!mnKQs$@Ym76Vu7ApB#cpU*WOV&IQ;$ex$Lb3^+Xnh<>ml z+VxW}&y(+Smji9LgeU5kAOE?%UAa(~*6<_d`jLnS`F zyhzemr6b^Ov)-ZK9$!y(7$$Bmm) zbHRBVU-?ZKB}N`CBK!m_YfiD+a6PV=+fY0H**GdoWsW0sDPr7&HcSiLE6(kqQmMJQ zT#FmyC4ZYE^!z>#qBY1K>o1E9Ei7v$WvRkk{WiC(i(Uoios=CHmIJ$8z=&`5_DJ1edY7gU6ZqChtT;!^a8klkGXfz&kh3uyEY9u3=hr7|esFebMN!QC_YpTtZ_Gde zL8ScgKDv46$EgLG9XVIpoPB;!IEm|uqr}a22kShEOdiK~##BDrl%s%~@#qcH4gAw# zNQri)=LSyukk2K>^hBCsCP~!IeA>LV|5&Aa=%^(gLwo4J4DwJwftNX}XKcLflM8cC{%NBKP2iuD&dN|(< R|KDGKI$DOBHR^97{|{fxz}Wx* literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wordpress-seo/images/stale-cornerstone-content-in-yoast-seo.png b/wp-content/plugins/wordpress-seo/images/stale-cornerstone-content-in-yoast-seo.png new file mode 100644 index 0000000000000000000000000000000000000000..581509a3a09492fa467a978aa6123db8f33f6c5e GIT binary patch literal 24197 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 IEN-RzA4B!&=l}o! literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wordpress-seo/inc/class-addon-manager.php b/wp-content/plugins/wordpress-seo/inc/class-addon-manager.php new file mode 100644 index 00000000..aa73685a --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/class-addon-manager.php @@ -0,0 +1,878 @@ + self::PREMIUM_SLUG, + 'wpseo-news.php' => self::NEWS_SLUG, + 'video-seo.php' => self::VIDEO_SLUG, + 'wpseo-woocommerce.php' => self::WOOCOMMERCE_SLUG, + 'local-seo.php' => self::LOCAL_SLUG, + ]; + + /** + * The addon data for the shortlinks. + * + * @var array + */ + private $addon_details = [ + self::PREMIUM_SLUG => [ + 'name' => 'Yoast SEO Premium', + 'short_link_activation' => 'https://yoa.st/13j', + 'short_link_renewal' => 'https://yoa.st/4ey', + ], + self::NEWS_SLUG => [ + 'name' => 'Yoast News SEO', + 'short_link_activation' => 'https://yoa.st/4xq', + 'short_link_renewal' => 'https://yoa.st/4xv', + ], + self::WOOCOMMERCE_SLUG => [ + 'name' => 'Yoast WooCommerce SEO', + 'short_link_activation' => 'https://yoa.st/4xs', + 'short_link_renewal' => 'https://yoa.st/4xx', + ], + self::VIDEO_SLUG => [ + 'name' => 'Yoast Video SEO', + 'short_link_activation' => 'https://yoa.st/4xr', + 'short_link_renewal' => 'https://yoa.st/4xw', + ], + self::LOCAL_SLUG => [ + 'name' => 'Yoast Local SEO', + 'short_link_activation' => 'https://yoa.st/4xp', + 'short_link_renewal' => 'https://yoa.st/4xu', + ], + ]; + + /** + * Holds the site information data. + * + * @var stdClass + */ + private $site_information; + + /** + * Hooks into WordPress. + * + * @codeCoverageIgnore + * + * @return void + */ + public function register_hooks() { + add_action( 'admin_init', [ $this, 'validate_addons' ], 15 ); + add_filter( 'pre_set_site_transient_update_plugins', [ $this, 'check_for_updates' ] ); + add_filter( 'plugins_api', [ $this, 'get_plugin_information' ], 10, 3 ); + add_action( 'plugins_loaded', [ $this, 'register_expired_messages' ], 10 ); + } + + /** + * Registers "expired subscription" warnings to the update messages of our addons. + * + * @return void + */ + public function register_expired_messages() { + foreach ( array_keys( $this->get_installed_addons() ) as $plugin_file ) { + add_action( 'in_plugin_update_message-' . $plugin_file, [ $this, 'expired_subscription_warning' ], 10, 2 ); + } + } + + /** + * Gets the subscriptions for current site. + * + * @return stdClass The subscriptions. + */ + public function get_subscriptions() { + return $this->get_site_information()->subscriptions; + } + + /** + * Provides a list of addon filenames. + * + * @return string[] List of addon filenames with their slugs. + */ + public function get_addon_filenames() { + return self::$addons; + } + + /** + * Finds the plugin file. + * + * @param string $plugin_slug The plugin slug to search. + * + * @return bool|string Plugin file when installed, False when plugin isn't installed. + */ + public function get_plugin_file( $plugin_slug ) { + $plugins = $this->get_plugins(); + $plugin_files = array_keys( $plugins ); + $target_plugin_file = array_search( $plugin_slug, $this->get_addon_filenames(), true ); + + if ( ! $target_plugin_file ) { + return false; + } + + foreach ( $plugin_files as $plugin_file ) { + if ( strpos( $plugin_file, $target_plugin_file ) !== false ) { + return $plugin_file; + } + } + + return false; + } + + /** + * Retrieves the subscription for the given slug. + * + * @param string $slug The plugin slug to retrieve. + * + * @return stdClass|false Subscription data when found, false when not found. + */ + public function get_subscription( $slug ) { + foreach ( $this->get_subscriptions() as $subscription ) { + if ( $subscription->product->slug === $slug ) { + return $subscription; + } + } + + return false; + } + + /** + * Retrieves a list of (subscription) slugs by the active addons. + * + * @return array The slugs. + */ + public function get_subscriptions_for_active_addons() { + $active_addons = array_keys( $this->get_active_addons() ); + $subscription_slugs = array_map( [ $this, 'get_slug_by_plugin_file' ], $active_addons ); + $subscriptions = []; + foreach ( $subscription_slugs as $subscription_slug ) { + $subscriptions[ $subscription_slug ] = $this->get_subscription( $subscription_slug ); + } + + return $subscriptions; + } + + /** + * Retrieves a list of versions for each addon. + * + * @return array The addon versions. + */ + public function get_installed_addons_versions() { + $addon_versions = []; + foreach ( $this->get_installed_addons() as $plugin_file => $installed_addon ) { + $addon_versions[ $this->get_slug_by_plugin_file( $plugin_file ) ] = $installed_addon['Version']; + } + + return $addon_versions; + } + + /** + * Retrieves the plugin information from the subscriptions. + * + * @param stdClass|false $data The result object. Default false. + * @param string $action The type of information being requested from the Plugin Installation API. + * @param stdClass $args Plugin API arguments. + * + * @return object Extended plugin data. + */ + public function get_plugin_information( $data, $action, $args ) { + if ( $action !== 'plugin_information' ) { + return $data; + } + + if ( ! isset( $args->slug ) ) { + return $data; + } + + $subscription = $this->get_subscription( $args->slug ); + if ( ! $subscription ) { + return $data; + } + + $data = $this->convert_subscription_to_plugin( $subscription, null, true ); + + if ( $this->has_subscription_expired( $subscription ) ) { + unset( $data->package, $data->download_link ); + } + + return $data; + } + + /** + * Retrieves information from MyYoast about which addons are connected to the current site. + * + * @return stdClass The list of addons activated for this site. + */ + public function get_myyoast_site_information() { + if ( $this->site_information === null ) { + $this->site_information = $this->get_site_information_transient(); + } + + if ( $this->site_information ) { + return $this->site_information; + } + + $this->site_information = $this->request_current_sites(); + if ( $this->site_information ) { + $this->site_information = $this->map_site_information( $this->site_information ); + + $this->set_site_information_transient( $this->site_information ); + + return $this->site_information; + } + + return $this->get_site_information_default(); + } + + /** + * Checks if the subscription for the given slug is valid. + * + * @param string $slug The plugin slug to retrieve. + * + * @return bool True when the subscription is valid. + */ + public function has_valid_subscription( $slug ) { + $subscription = $this->get_subscription( $slug ); + + // An non-existing subscription is never valid. + if ( ! $subscription ) { + return false; + } + + return ! $this->has_subscription_expired( $subscription ); + } + + /** + * Checks if there are addon updates. + * + * @param stdClass|mixed $data The current data for update_plugins. + * + * @return stdClass Extended data for update_plugins. + */ + public function check_for_updates( $data ) { + global $wp_version; + + if ( empty( $data ) ) { + return $data; + } + + // We have to figure out if we're safe to upgrade the add-ons, based on what the latest Yoast Free requirements for the WP version is. + $yoast_free_data = $this->extract_yoast_data( $data ); + + foreach ( $this->get_installed_addons() as $plugin_file => $installed_plugin ) { + $subscription_slug = $this->get_slug_by_plugin_file( $plugin_file ); + $subscription = $this->get_subscription( $subscription_slug ); + + if ( ! $subscription ) { + continue; + } + + $plugin_data = $this->convert_subscription_to_plugin( $subscription, $yoast_free_data, false, $plugin_file ); + + // Let's assume for now that it will get added in the 'no_update' key that we'll return to the WP API. + $is_no_update = true; + + // If the add-on's version is the latest, we have to do no further checks. + if ( version_compare( $installed_plugin['Version'], $plugin_data->new_version, '<' ) ) { + // If we haven't retrieved the Yoast Free requirements for the WP version yet, do nothing. The next run will probably get us that information. + if ( is_null( $plugin_data->requires ) ) { + continue; + } + + if ( version_compare( $plugin_data->requires, $wp_version, '<=' ) ) { + // The add-on has an available update *and* the Yoast Free requirements for the WP version are also met, so go ahead and show the upgrade info to the user. + $is_no_update = false; + $data->response[ $plugin_file ] = $plugin_data; + + if ( $this->has_subscription_expired( $subscription ) ) { + unset( $data->response[ $plugin_file ]->package, $data->response[ $plugin_file ]->download_link ); + } + } + } + + if ( $is_no_update ) { + // Still convert subscription when no updates is available. + $data->no_update[ $plugin_file ] = $plugin_data; + + if ( $this->has_subscription_expired( $subscription ) ) { + unset( $data->no_update[ $plugin_file ]->package, $data->no_update[ $plugin_file ]->download_link ); + } + } + } + + return $data; + } + + /** + * Extracts Yoast SEO Free's data from the wp.org API response. + * + * @param object $data The wp.org API response. + * + * @return object Yoast Free's data from wp.org. + */ + protected function extract_yoast_data( $data ) { + if ( isset( $data->response[ WPSEO_BASENAME ] ) ) { + return $data->response[ WPSEO_BASENAME ]; + } + + if ( isset( $data->no_update[ WPSEO_BASENAME ] ) ) { + return $data->no_update[ WPSEO_BASENAME ]; + } + + return (object) []; + } + + /** + * If the plugin is lacking an active subscription, throw a warning. + * + * @param array $plugin_data The data for the plugin in this row. + * + * @return void + */ + public function expired_subscription_warning( $plugin_data ) { + $subscription = $this->get_subscription( $plugin_data['slug'] ); + if ( $subscription && $this->has_subscription_expired( $subscription ) ) { + $addon_link = ( isset( $this->addon_details[ $plugin_data['slug'] ] ) ) ? $this->addon_details[ $plugin_data['slug'] ]['short_link_renewal'] : $this->addon_details[ self::PREMIUM_SLUG ]['short_link_renewal']; + + $sale_copy = ''; + if ( YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2023-promotion' ) ) { + $sale_copy = sprintf( + /* translators: %1$s is a
    tag. */ + esc_html__( '%1$s Now with 30%% Black Friday Discount!', 'wordpress-seo' ), + '
    ' + ); + } + echo '

    '; + echo ' ' + . sprintf( + /* translators: %1$s is the plugin name, %2$s and %3$s are a link. */ + esc_html__( '%1$s can\'t be updated because your product subscription is expired. %2$sRenew your product subscription%3$s to get updates again and use all the features of %1$s.', 'wordpress-seo' ), + esc_html( $plugin_data['name'] ), + '
    ', + '' + ) + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output is escaped above. + . $sale_copy + . ''; + } + } + + /** + * Checks if there are any installed addons. + * + * @return bool True when there are installed Yoast addons. + */ + public function has_installed_addons() { + $installed_addons = $this->get_installed_addons(); + + return ! empty( $installed_addons ); + } + + /** + * Checks if the plugin is installed and activated in WordPress. + * + * @param string $slug The class' slug. + * + * @return bool True when installed and activated. + */ + public function is_installed( $slug ) { + $slug_to_class_map = [ + static::PREMIUM_SLUG => 'WPSEO_Premium', + static::NEWS_SLUG => 'WPSEO_News', + static::WOOCOMMERCE_SLUG => 'Yoast_WooCommerce_SEO', + static::VIDEO_SLUG => 'WPSEO_Video_Sitemap', + static::LOCAL_SLUG => 'WPSEO_Local_Core', + ]; + + if ( ! isset( $slug_to_class_map[ $slug ] ) ) { + return false; + } + + return class_exists( $slug_to_class_map[ $slug ] ); + } + + /** + * Validates the addons and show a notice for the ones that are invalid. + * + * @return void + */ + public function validate_addons() { + $notification_center = Yoast_Notification_Center::get(); + + if ( $notification_center === null ) { + return; + } + + foreach ( $this->addon_details as $slug => $addon_info ) { + $notification = $this->create_notification( $addon_info['name'], $addon_info['short_link_activation'] ); + + // Add a notification when the installed plugin isn't activated in My Yoast. + if ( $this->is_installed( $slug ) && ! $this->has_valid_subscription( $slug ) ) { + $notification_center->add_notification( $notification ); + + continue; + } + + $notification_center->remove_notification( $notification ); + } + } + + /** + * Removes the site information transients. + * + * @codeCoverageIgnore + * + * @return void + */ + public function remove_site_information_transients() { + delete_transient( self::SITE_INFORMATION_TRANSIENT ); + delete_transient( self::SITE_INFORMATION_TRANSIENT_QUICK ); + } + + /** + * Creates an instance of Yoast_Notification. + * + * @param string $product_name The product to create the notification for. + * @param string $short_link The short link for the addon notification. + * + * @return Yoast_Notification The created notification. + */ + protected function create_notification( $product_name, $short_link ) { + $notification_options = [ + 'type' => Yoast_Notification::ERROR, + 'id' => 'wpseo-dismiss-' . sanitize_title_with_dashes( $product_name, null, 'save' ), + 'capabilities' => 'wpseo_manage_options', + ]; + + return new Yoast_Notification( + sprintf( + /* translators: %1$s expands to a strong tag, %2$s expands to the product name, %3$s expands to a closing strong tag, %4$s expands to an a tag. %5$s expands to MyYoast, %6$s expands to a closing a tag, %7$s expands to the product name */ + __( '%1$s %2$s isn\'t working as expected %3$s and you are not receiving updates or support! Make sure to %4$s activate your product subscription in %5$s%6$s to unlock all the features of %7$s.', 'wordpress-seo' ), + '', + $product_name, + '', + '', + 'MyYoast', + '', + $product_name + ), + $notification_options + ); + } + + /** + * Checks whether a plugin expiry date has been passed. + * + * @param stdClass $subscription Plugin subscription. + * + * @return bool Has the plugin expired. + */ + protected function has_subscription_expired( $subscription ) { + return ( strtotime( $subscription->expiry_date ) - time() ) < 0; + } + + /** + * Converts a subscription to plugin based format. + * + * @param stdClass $subscription The subscription to convert. + * @param stdClass|null $yoast_free_data The Yoast Free's data. + * @param bool $plugin_info Whether we're in the plugin information modal. + * @param string $plugin_file The plugin filename. + * + * @return stdClass The converted subscription. + */ + protected function convert_subscription_to_plugin( $subscription, $yoast_free_data = null, $plugin_info = false, $plugin_file = '' ) { + $changelog = ''; + if ( isset( $subscription->product->changelog ) ) { + // We need to replace h2's and h3's with h4's because the styling expects that. + $changelog = str_replace( 'product->changelog ) ); + $changelog = str_replace( ' ( $plugin_info ) ? YOAST_SEO_WP_REQUIRED : null, + ]; + + return (object) [ + 'new_version' => ( $subscription->product->version ?? '' ), + 'name' => $subscription->product->name, + 'slug' => $subscription->product->slug, + 'plugin' => $plugin_file, + 'url' => $subscription->product->store_url, + 'last_update' => $subscription->product->last_updated, + 'homepage' => $subscription->product->store_url, + 'download_link' => $subscription->product->download, + 'package' => $subscription->product->download, + 'sections' => [ + 'changelog' => $changelog, + 'support' => $this->get_support_section(), + ], + 'icons' => [ + '2x' => $this->get_icon( $subscription->product->slug ), + ], + 'update_supported' => true, + 'banners' => $this->get_banners( $subscription->product->slug ), + // If we have extracted Yoast Free's data before, use that. If not, resort to the defaults. + 'tested' => YOAST_SEO_WP_TESTED, + 'requires' => ( $yoast_free_data->requires ?? $defaults['requires'] ), + 'requires_php' => YOAST_SEO_PHP_REQUIRED, + ]; + } + + /** + * Returns the plugin's icon URL. + * + * @param string $slug The plugin slug. + * + * @return string The icon URL for this plugin. + */ + protected function get_icon( $slug ) { + switch ( $slug ) { + case self::LOCAL_SLUG: + return 'https://yoa.st/local-seo-icon'; + case self::NEWS_SLUG: + return 'https://yoa.st/news-seo-icon'; + case self::PREMIUM_SLUG: + return 'https://yoa.st/yoast-seo-icon'; + case self::VIDEO_SLUG: + return 'https://yoa.st/video-seo-icon'; + case self::WOOCOMMERCE_SLUG: + return 'https://yoa.st/woo-seo-icon'; + } + } + + /** + * Return an array of plugin banner URLs. + * + * @param string $slug The plugin slug. + * + * @return string[] + */ + protected function get_banners( $slug ) { + switch ( $slug ) { + case self::LOCAL_SLUG: + return [ + 'high' => 'https://yoa.st/yoast-seo-banner-local', + 'low' => 'https://yoa.st/yoast-seo-banner-low-local', + ]; + case self::NEWS_SLUG: + return [ + 'high' => 'https://yoa.st/yoast-seo-banner-news', + 'low' => 'https://yoa.st/yoast-seo-banner-low-news', + ]; + case self::PREMIUM_SLUG: + return [ + 'high' => 'https://yoa.st/yoast-seo-banner-premium', + 'low' => 'https://yoa.st/yoast-seo-banner-low-premium', + ]; + case self::VIDEO_SLUG: + return [ + 'high' => 'https://yoa.st/yoast-seo-banner-video', + 'low' => 'https://yoa.st/yoast-seo-banner-low-video', + ]; + case self::WOOCOMMERCE_SLUG: + return [ + 'high' => 'https://yoa.st/yoast-seo-banner-woo', + 'low' => 'https://yoa.st/yoast-seo-banner-low-woo', + ]; + } + } + + /** + * Checks if the given plugin_file belongs to a Yoast addon. + * + * @param string $plugin_file Path to the plugin. + * + * @return bool True when plugin file is for a Yoast addon. + */ + protected function is_yoast_addon( $plugin_file ) { + return $this->get_slug_by_plugin_file( $plugin_file ) !== ''; + } + + /** + * Retrieves the addon slug by given plugin file path. + * + * @param string $plugin_file The file path to the plugin. + * + * @return string The slug when found or empty string when not. + */ + protected function get_slug_by_plugin_file( $plugin_file ) { + $addons = self::$addons; + + // Yoast SEO Free isn't an addon, but we needed it in Premium to fetch translations. + if ( YoastSEO()->helpers->product->is_premium() ) { + $addons['wp-seo.php'] = self::FREE_SLUG; + } + + foreach ( $addons as $addon => $addon_slug ) { + if ( strpos( $plugin_file, $addon ) !== false ) { + return $addon_slug; + } + } + + return ''; + } + + /** + * Retrieves the installed Yoast addons. + * + * @return array The installed plugins. + */ + protected function get_installed_addons() { + return array_filter( $this->get_plugins(), [ $this, 'is_yoast_addon' ], ARRAY_FILTER_USE_KEY ); + } + + /** + * Retrieves a list of active addons. + * + * @return array The active addons. + */ + protected function get_active_addons() { + return array_filter( $this->get_installed_addons(), [ $this, 'is_plugin_active' ], ARRAY_FILTER_USE_KEY ); + } + + /** + * Retrieves the current sites from the API. + * + * @codeCoverageIgnore + * + * @return bool|stdClass Object when request is successful. False if not. + */ + protected function request_current_sites() { + $api_request = new WPSEO_MyYoast_Api_Request( 'sites/current' ); + if ( $api_request->fire() ) { + return $api_request->get_response(); + } + + return $this->get_site_information_default(); + } + + /** + * Retrieves the transient value with the site information. + * + * @codeCoverageIgnore + * + * @return stdClass|false The transient value. + */ + protected function get_site_information_transient() { + global $pagenow; + + // Force re-check on license & dashboard pages. + $current_page = null; + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. + if ( isset( $_GET['page'] ) && is_string( $_GET['page'] ) ) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information, We are only strictly comparing and thus no need to sanitize. + $current_page = wp_unslash( $_GET['page'] ); + } + + // Check whether the licenses are valid or whether we need to show notifications. + $quick = ( $current_page === 'wpseo_licenses' || $current_page === 'wpseo_dashboard' ); + + // Also do a fresh request on Plugins & Core Update pages. + $quick = $quick || $pagenow === 'plugins.php'; + $quick = $quick || $pagenow === 'update-core.php'; + + if ( $quick ) { + return get_transient( self::SITE_INFORMATION_TRANSIENT_QUICK ); + } + + return get_transient( self::SITE_INFORMATION_TRANSIENT ); + } + + /** + * Sets the site information transient. + * + * @codeCoverageIgnore + * + * @param stdClass $site_information The site information to save. + * + * @return void + */ + protected function set_site_information_transient( $site_information ) { + set_transient( self::SITE_INFORMATION_TRANSIENT, $site_information, DAY_IN_SECONDS ); + set_transient( self::SITE_INFORMATION_TRANSIENT_QUICK, $site_information, 60 ); + } + + /** + * Retrieves all installed WordPress plugins. + * + * @codeCoverageIgnore + * + * @return array The plugins. + */ + protected function get_plugins() { + if ( ! function_exists( 'get_plugins' ) ) { + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + } + + return get_plugins(); + } + + /** + * Checks if the given plugin file belongs to an active plugin. + * + * @codeCoverageIgnore + * + * @param string $plugin_file The file path to the plugin. + * + * @return bool True when plugin is active. + */ + protected function is_plugin_active( $plugin_file ) { + return is_plugin_active( $plugin_file ); + } + + /** + * Returns an object with no subscriptions. + * + * @codeCoverageIgnore + * + * @return stdClass Site information. + */ + protected function get_site_information_default() { + return (object) [ + 'url' => WPSEO_Utils::get_home_url(), + 'subscriptions' => [], + ]; + } + + /** + * Maps the plugin API response. + * + * @param object $site_information Site information as received from the API. + * + * @return stdClass Mapped site information. + */ + protected function map_site_information( $site_information ) { + return (object) [ + 'url' => $site_information->url, + 'subscriptions' => array_map( [ $this, 'map_subscription' ], $site_information->subscriptions ), + ]; + } + + /** + * Maps a plugin subscription. + * + * @param object $subscription Subscription information as received from the API. + * + * @return stdClass Mapped subscription. + */ + protected function map_subscription( $subscription ) { + // phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Not our properties. + return (object) [ + 'renewal_url' => $subscription->renewalUrl, + 'expiry_date' => $subscription->expiryDate, + 'product' => (object) [ + 'version' => $subscription->product->version, + 'name' => $subscription->product->name, + 'slug' => $subscription->product->slug, + 'last_updated' => $subscription->product->lastUpdated, + 'store_url' => $subscription->product->storeUrl, + // Ternary operator is necessary because download can be undefined. + 'download' => ( $subscription->product->download ?? null ), + 'changelog' => $subscription->product->changelog, + ], + ]; + // phpcs:enable + } + + /** + * Retrieves the site information. + * + * @return stdClass The site information. + */ + private function get_site_information() { + if ( ! $this->has_installed_addons() ) { + return $this->get_site_information_default(); + } + + return $this->get_myyoast_site_information(); + } + + /** + * Retrieves the contents for the support section. + * + * @return string The support section content. + */ + protected function get_support_section() { + return '

    ' . __( 'Need support?', 'wordpress-seo' ) . '

    ' + . '

    ' + /* translators: 1: expands to that refers to the help page, 2: closing tag. */ + . sprintf( __( 'You can probably find an answer to your question in our %1$shelp center%2$s.', 'wordpress-seo' ), '', '' ) + . ' ' + /* translators: %s expands to a mailto support link. */ + . sprintf( __( 'If you still need support and have an active subscription for this product, please email %s.', 'wordpress-seo' ), 'support@yoast.com' ) + . '

    '; + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/class-my-yoast-api-request.php b/wp-content/plugins/wordpress-seo/inc/class-my-yoast-api-request.php new file mode 100644 index 00000000..48d365c7 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/class-my-yoast-api-request.php @@ -0,0 +1,207 @@ + 'GET', + 'timeout' => 5, + 'headers' => [ + 'Accept-Encoding' => '*', + 'Expect' => '', + ], + ]; + + /** + * Contains the fetched response. + * + * @var stdClass + */ + protected $response; + + /** + * Contains the error message when request went wrong. + * + * @var string + */ + protected $error_message = ''; + + /** + * Constructor. + * + * @codeCoverageIgnore + * + * @param string $url The request url. + * @param array $args The request arguments. + */ + public function __construct( $url, array $args = [] ) { + $this->url = 'https://my.yoast.com/api/' . $url; + $this->args = wp_parse_args( $args, $this->args ); + } + + /** + * Fires the request. + * + * @return bool True when request is successful. + */ + public function fire() { + try { + $response = $this->do_request( $this->url, $this->args ); + $this->response = $this->decode_response( $response ); + + return true; + } + catch ( WPSEO_MyYoast_Bad_Request_Exception $bad_request_exception ) { + $this->error_message = $bad_request_exception->getMessage(); + + return false; + } + } + + /** + * Retrieves the error message. + * + * @return string The set error message. + */ + public function get_error_message() { + return $this->error_message; + } + + /** + * Retrieves the response. + * + * @return stdClass The response object. + */ + public function get_response() { + return $this->response; + } + + /** + * Performs the request using WordPress internals. + * + * @codeCoverageIgnore + * + * @param string $url The request URL. + * @param array $request_arguments The request arguments. + * + * @return string The retrieved body. + * @throws WPSEO_MyYoast_Bad_Request_Exception When request is invalid. + */ + protected function do_request( $url, $request_arguments ) { + $request_arguments = $this->enrich_request_arguments( $request_arguments ); + $response = wp_remote_request( $url, $request_arguments ); + + if ( is_wp_error( $response ) ) { + throw new WPSEO_MyYoast_Bad_Request_Exception( $response->get_error_message() ); + } + + $response_code = wp_remote_retrieve_response_code( $response ); + $response_message = wp_remote_retrieve_response_message( $response ); + + // Do nothing, response code is okay. + if ( $response_code === 200 || strpos( $response_code, '200' ) !== false ) { + return wp_remote_retrieve_body( $response ); + } + + throw new WPSEO_MyYoast_Bad_Request_Exception( esc_html( $response_message ), (int) $response_code ); + } + + /** + * Decodes the JSON encoded response. + * + * @param string $response The response to decode. + * + * @return stdClass The json decoded response. + * @throws WPSEO_MyYoast_Invalid_JSON_Exception When decoded string is not a JSON object. + */ + protected function decode_response( $response ) { + $response = json_decode( $response ); + + if ( ! is_object( $response ) ) { + throw new WPSEO_MyYoast_Invalid_JSON_Exception( + esc_html__( 'No JSON object was returned.', 'wordpress-seo' ) + ); + } + + return $response; + } + + /** + * Checks if MyYoast tokens are allowed and adds the token to the request body. + * + * When tokens are disallowed it will add the url to the request body. + * + * @param array $request_arguments The arguments to enrich. + * + * @return array The enriched arguments. + */ + protected function enrich_request_arguments( array $request_arguments ) { + $request_arguments = wp_parse_args( $request_arguments, [ 'headers' => [] ] ); + $addon_version_headers = $this->get_installed_addon_versions(); + + foreach ( $addon_version_headers as $addon => $version ) { + $request_arguments['headers'][ $addon . '-version' ] = $version; + } + + $request_body = $this->get_request_body(); + if ( $request_body !== [] ) { + $request_arguments['body'] = $request_body; + } + + return $request_arguments; + } + + /** + * Retrieves the request body based on URL or access token support. + * + * @codeCoverageIgnore + * + * @return array The request body. + */ + public function get_request_body() { + return [ 'url' => WPSEO_Utils::get_home_url() ]; + } + + /** + * Wraps the get current user id function. + * + * @codeCoverageIgnore + * + * @return int The user id. + */ + protected function get_current_user_id() { + return get_current_user_id(); + } + + /** + * Retrieves the installed addons as http headers. + * + * @codeCoverageIgnore + * + * @return array The installed addon versions. + */ + protected function get_installed_addon_versions() { + $addon_manager = new WPSEO_Addon_Manager(); + + return $addon_manager->get_installed_addons_versions(); + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/class-post-type.php b/wp-content/plugins/wordpress-seo/inc/class-post-type.php new file mode 100644 index 00000000..54085d58 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/class-post-type.php @@ -0,0 +1,131 @@ +helpers->post_type->get_accessible_post_types(); + } + + /** + * Returns whether the passed post type is considered accessible. + * + * @param string $post_type The post type to check. + * + * @return bool Whether or not the post type is considered accessible. + */ + public static function is_post_type_accessible( $post_type ) { + return in_array( $post_type, self::get_accessible_post_types(), true ); + } + + /** + * Checks if the request post type is public and indexable. + * + * @param string $post_type_name The name of the post type to lookup. + * + * @return bool True when post type is set to index. + */ + public static function is_post_type_indexable( $post_type_name ) { + return YoastSEO()->helpers->post_type->is_indexable( $post_type_name ); + } + + /** + * Filters the attachment post type from an array with post_types. + * + * @param array $post_types The array to filter the attachment post type from. + * + * @return array The filtered array. + */ + public static function filter_attachment_post_type( array $post_types ) { + unset( $post_types['attachment'] ); + + return $post_types; + } + + /** + * Checks if the post type is enabled in the REST API. + * + * @param string $post_type The post type to check. + * + * @return bool Whether or not the post type is available in the REST API. + */ + public static function is_rest_enabled( $post_type ) { + $post_type_object = get_post_type_object( $post_type ); + + if ( $post_type_object === null ) { + return false; + } + + return $post_type_object->show_in_rest === true; + } + + /** + * Checks if the current post type has an archive. + * + * Context: The has_archive value can be a string or a boolean. In most case it will be a boolean, + * but it can be defined as a string. When it is a string the archive_slug will be overwritten to + * define another endpoint. + * + * @param WP_Post_Type $post_type The post type object. + * + * @return bool True whether the post type has an archive. + */ + public static function has_archive( $post_type ) { + return YoastSEO()->helpers->post_type->has_archive( $post_type ); + } + + /** + * Checks if the Yoast Metabox has been enabled for the post type. + * + * @param string $post_type The post type name. + * + * @return bool True whether the metabox is enabled. + */ + public static function has_metabox_enabled( $post_type ) { + return WPSEO_Options::get( 'display-metabox-pt-' . $post_type, false ); + } + + /* ********************* DEPRECATED METHODS ********************* */ + + /** + * Removes the notification related to the post types which have been made public. + * + * @deprecated 20.10 + * @codeCoverageIgnore + * + * @return void + */ + public static function remove_post_types_made_public_notification() { + _deprecated_function( __METHOD__, 'Yoast SEO 20.10', 'Content_Type_Visibility_Dismiss_Notifications::dismiss_notifications' ); + $notification_center = Yoast_Notification_Center::get(); + $notification_center->remove_notification_by_id( 'post-types-made-public' ); + } + + /** + * Removes the notification related to the taxonomies which have been made public. + * + * @deprecated 20.10 + * @codeCoverageIgnore + * + * @return void + */ + public static function remove_taxonomies_made_public_notification() { + _deprecated_function( __METHOD__, 'Yoast SEO 20.10', 'Content_Type_Visibility_Dismiss_Notifications::dismiss_notifications' ); + $notification_center = Yoast_Notification_Center::get(); + $notification_center->remove_notification_by_id( 'taxonomies-made-public' ); + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/class-rewrite.php b/wp-content/plugins/wordpress-seo/inc/class-rewrite.php new file mode 100644 index 00000000..82ed1206 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/class-rewrite.php @@ -0,0 +1,231 @@ + $query_vars Main query vars to filter. + * + * @return array The query vars. + */ + public function query_vars( $query_vars ) { + if ( WPSEO_Options::get( 'stripcategorybase' ) === true ) { + $query_vars[] = 'wpseo_category_redirect'; + } + + return $query_vars; + } + + /** + * Checks whether the redirect needs to be created. + * + * @param array $query_vars Query vars to check for existence of redirect var. + * + * @return array The query vars. + */ + public function request( $query_vars ) { + if ( ! isset( $query_vars['wpseo_category_redirect'] ) ) { + return $query_vars; + } + + $this->redirect( $query_vars['wpseo_category_redirect'] ); + return []; + } + + /** + * This function taken and only slightly adapted from WP No Category Base plugin by Saurabh Gupta. + * + * @return array The category rewrite rules. + */ + public function category_rewrite_rules() { + global $wp_rewrite; + + $category_rewrite = []; + + $taxonomy = get_taxonomy( 'category' ); + $permalink_structure = get_option( 'permalink_structure' ); + + $blog_prefix = ''; + if ( strpos( $permalink_structure, '/blog/' ) === 0 ) { + if ( ( is_multisite() && ! is_subdomain_install() ) || is_main_site() || is_main_network() ) { + $blog_prefix = 'blog/'; + } + } + + $categories = get_categories( [ 'hide_empty' => false ] ); + if ( is_array( $categories ) && $categories !== [] ) { + foreach ( $categories as $category ) { + $category_nicename = $category->slug; + if ( $category->parent === $category->cat_ID ) { + // Recursive recursion. + $category->parent = 0; + } + elseif ( $taxonomy->rewrite['hierarchical'] !== false && $category->parent !== 0 ) { + $parents = get_category_parents( $category->parent, false, '/', true ); + if ( ! is_wp_error( $parents ) ) { + $category_nicename = $parents . $category_nicename; + } + unset( $parents ); + } + + $category_rewrite = $this->add_category_rewrites( $category_rewrite, $category_nicename, $blog_prefix, $wp_rewrite->pagination_base ); + + // Adds rules for the uppercase encoded URIs. + $category_nicename_filtered = $this->convert_encoded_to_upper( $category_nicename ); + + if ( $category_nicename_filtered !== $category_nicename ) { + $category_rewrite = $this->add_category_rewrites( $category_rewrite, $category_nicename_filtered, $blog_prefix, $wp_rewrite->pagination_base ); + } + } + unset( $categories, $category, $category_nicename, $category_nicename_filtered ); + } + + // Redirect support from Old Category Base. + $old_base = $wp_rewrite->get_category_permastruct(); + $old_base = str_replace( '%category%', '(.+)', $old_base ); + $old_base = trim( $old_base, '/' ); + $category_rewrite[ $old_base . '$' ] = 'index.php?wpseo_category_redirect=$matches[1]'; + + return $category_rewrite; + } + + /** + * Adds required category rewrites rules. + * + * @param array $rewrites The current set of rules. + * @param string $category_name Category nicename. + * @param string $blog_prefix Multisite blog prefix. + * @param string $pagination_base WP_Query pagination base. + * + * @return array The added set of rules. + */ + protected function add_category_rewrites( $rewrites, $category_name, $blog_prefix, $pagination_base ) { + $rewrite_name = $blog_prefix . '(' . $category_name . ')'; + + global $wp_rewrite; + $feed_regex = '(' . implode( '|', $wp_rewrite->feeds ) . ')'; + + $rewrites[ $rewrite_name . '/(?:feed/)?' . $feed_regex . '/?$' ] = 'index.php?category_name=$matches[1]&feed=$matches[2]'; + $rewrites[ $rewrite_name . '/' . $pagination_base . '/?([0-9]{1,})/?$' ] = 'index.php?category_name=$matches[1]&paged=$matches[2]'; + $rewrites[ $rewrite_name . '/?$' ] = 'index.php?category_name=$matches[1]'; + + return $rewrites; + } + + /** + * Walks through category nicename and convert encoded parts + * into uppercase using $this->encode_to_upper(). + * + * @param string $name The encoded category URI string. + * + * @return string The convered URI string. + */ + protected function convert_encoded_to_upper( $name ) { + // Checks if name has any encoding in it. + if ( strpos( $name, '%' ) === false ) { + return $name; + } + + $names = explode( '/', $name ); + $names = array_map( [ $this, 'encode_to_upper' ], $names ); + + return implode( '/', $names ); + } + + /** + * Converts the encoded URI string to uppercase. + * + * @param string $encoded The encoded string. + * + * @return string The uppercased string. + */ + public function encode_to_upper( $encoded ) { + if ( strpos( $encoded, '%' ) === false ) { + return $encoded; + } + + return strtoupper( $encoded ); + } + + /** + * Redirect the "old" category URL to the new one. + * + * @codeCoverageIgnore + * + * @param string $category_redirect The category page to redirect to. + * @return void + */ + protected function redirect( $category_redirect ) { + $catlink = trailingslashit( get_option( 'home' ) ) . user_trailingslashit( $category_redirect, 'category' ); + + wp_safe_redirect( $catlink, 301, 'Yoast SEO' ); + exit; + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/class-upgrade-history.php b/wp-content/plugins/wordpress-seo/inc/class-upgrade-history.php new file mode 100644 index 00000000..a72db83d --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/class-upgrade-history.php @@ -0,0 +1,136 @@ +option_name = $option_name; + } + } + + /** + * Retrieves the content of the history items currently stored. + * + * @return array> The contents of the history option. + */ + public function get() { + $data = get_option( $this->get_option_name(), [] ); + if ( ! is_array( $data ) ) { + return []; + } + + return $data; + } + + /** + * Adds a new history entry in the storage. + * + * @param string $old_version The version we are upgrading from. + * @param string $new_version The version we are upgrading to. + * @param array $option_names The options that need to be stored. + * + * @return void + */ + public function add( $old_version, $new_version, array $option_names ) { + $option_data = []; + if ( $option_names !== [] ) { + $option_data = $this->get_options_data( $option_names ); + } + + // Retrieve current history. + $data = $this->get(); + + // Add new entry. + $data[ time() ] = [ + 'options' => $option_data, + 'old_version' => $old_version, + 'new_version' => $new_version, + ]; + + // Store the data. + $this->set( $data ); + } + + /** + * Retrieves the data for the specified option names from the database. + * + * @param array $option_names The option names to retrieve. + * + * @return array> The retrieved data. + */ + protected function get_options_data( array $option_names ) { + $wpdb = $this->get_wpdb(); + + $results = $wpdb->get_results( + $wpdb->prepare( + ' + SELECT %i, %i FROM ' . $wpdb->options . ' WHERE + %i IN ( ' . implode( ',', array_fill( 0, count( $option_names ), '%s' ) ) . ' ) + ', + array_merge( [ 'option_value', 'option_name', 'option_name' ], $option_names ) + ), + ARRAY_A + ); + + $data = []; + foreach ( $results as $result ) { + $data[ $result['option_name'] ] = maybe_unserialize( $result['option_value'] ); + } + + return $data; + } + + /** + * Stores the new history state. + * + * @param array> $data The data to store. + * + * @return void + */ + protected function set( array $data ) { + // This should not be autoloaded! + update_option( $this->get_option_name(), $data, false ); + } + + /** + * Retrieves the WPDB object. + * + * @return wpdb The WPDB object to use. + */ + protected function get_wpdb() { + global $wpdb; + + return $wpdb; + } + + /** + * Retrieves the option name to store the history in. + * + * @return string The option name to store the history in. + */ + protected function get_option_name() { + return $this->option_name; + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/class-upgrade.php b/wp-content/plugins/wordpress-seo/inc/class-upgrade.php new file mode 100644 index 00000000..25936b54 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/class-upgrade.php @@ -0,0 +1,1831 @@ +taxonomy_helper = YoastSEO()->helpers->taxonomy; + + $version = WPSEO_Options::get( 'version' ); + + WPSEO_Options::maybe_set_multisite_defaults( false ); + + $routines = [ + '1.5.0' => 'upgrade_15', + '2.0' => 'upgrade_20', + '2.1' => 'upgrade_21', + '2.2' => 'upgrade_22', + '2.3' => 'upgrade_23', + '3.0' => 'upgrade_30', + '3.3' => 'upgrade_33', + '3.6' => 'upgrade_36', + '4.0' => 'upgrade_40', + '4.4' => 'upgrade_44', + '4.7' => 'upgrade_47', + '4.9' => 'upgrade_49', + '5.0' => 'upgrade_50', + '5.5' => 'upgrade_55', + '6.3' => 'upgrade_63', + '7.0-RC0' => 'upgrade_70', + '7.1-RC0' => 'upgrade_71', + '7.3-RC0' => 'upgrade_73', + '7.4-RC0' => 'upgrade_74', + '7.5.3' => 'upgrade_753', + '7.7-RC0' => 'upgrade_77', + '7.7.2-RC0' => 'upgrade_772', + '9.0-RC0' => 'upgrade_90', + '10.0-RC0' => 'upgrade_100', + '11.1-RC0' => 'upgrade_111', + // Reset notifications because we removed the AMP Glue plugin notification. + '12.1-RC0' => 'clean_all_notifications', + '12.3-RC0' => 'upgrade_123', + '12.4-RC0' => 'upgrade_124', + '12.8-RC0' => 'upgrade_128', + '13.2-RC0' => 'upgrade_132', + '14.0.3-RC0' => 'upgrade_1403', + '14.1-RC0' => 'upgrade_141', + '14.2-RC0' => 'upgrade_142', + '14.5-RC0' => 'upgrade_145', + '14.9-RC0' => 'upgrade_149', + '15.1-RC0' => 'upgrade_151', + '15.3-RC0' => 'upgrade_153', + '15.5-RC0' => 'upgrade_155', + '15.7-RC0' => 'upgrade_157', + '15.9.1-RC0' => 'upgrade_1591', + '16.2-RC0' => 'upgrade_162', + '16.5-RC0' => 'upgrade_165', + '17.2-RC0' => 'upgrade_172', + '17.7.1-RC0' => 'upgrade_1771', + '17.9-RC0' => 'upgrade_179', + '18.3-RC3' => 'upgrade_183', + '18.6-RC0' => 'upgrade_186', + '18.9-RC0' => 'upgrade_189', + '19.1-RC0' => 'upgrade_191', + '19.3-RC0' => 'upgrade_193', + '19.6-RC0' => 'upgrade_196', + '19.11-RC0' => 'upgrade_1911', + '20.2-RC0' => 'upgrade_202', + '20.5-RC0' => 'upgrade_205', + '20.7-RC0' => 'upgrade_207', + '20.8-RC0' => 'upgrade_208', + '22.6-RC0' => 'upgrade_226', + ]; + + array_walk( $routines, [ $this, 'run_upgrade_routine' ], $version ); + if ( version_compare( $version, '12.5-RC0', '<' ) ) { + /* + * We have to run this by hook, because otherwise: + * - the theme support check isn't available. + * - the notification center notifications are not filled yet. + */ + add_action( 'init', [ $this, 'upgrade_125' ] ); + } + + // Since 3.7. + $upsell_notice = new WPSEO_Product_Upsell_Notice(); + $upsell_notice->set_upgrade_notice(); + + /** + * Filter: 'wpseo_run_upgrade' - Runs the upgrade hook which are dependent on Yoast SEO. + * + * @param string $version The current version of Yoast SEO + */ + do_action( 'wpseo_run_upgrade', $version ); + + $this->finish_up( $version ); + } + + /** + * Runs the upgrade routine. + * + * @param string $routine The method to call. + * @param string $version The new version. + * @param string $current_version The current set version. + * + * @return void + */ + protected function run_upgrade_routine( $routine, $version, $current_version ) { + if ( version_compare( $current_version, $version, '<' ) ) { + $this->$routine( $current_version ); + } + } + + /** + * Adds a new upgrade history entry. + * + * @param string $current_version The old version from which we are upgrading. + * @param string $new_version The version we are upgrading to. + * + * @return void + */ + protected function add_upgrade_history( $current_version, $new_version ) { + $upgrade_history = new WPSEO_Upgrade_History(); + $upgrade_history->add( $current_version, $new_version, array_keys( WPSEO_Options::$options ) ); + } + + /** + * Runs the needed cleanup after an update, setting the DB version to latest version, flushing caches etc. + * + * @param string|null $previous_version The previous version. + * + * @return void + */ + protected function finish_up( $previous_version = null ) { + if ( $previous_version ) { + WPSEO_Options::set( 'previous_version', $previous_version ); + } + WPSEO_Options::set( 'version', WPSEO_VERSION ); + + // Just flush rewrites, always, to at least make them work after an upgrade. + add_action( 'shutdown', 'flush_rewrite_rules' ); + + // Flush the sitemap cache. + WPSEO_Sitemaps_Cache::clear(); + + // Make sure all our options always exist - issue #1245. + WPSEO_Options::ensure_options_exist(); + } + + /** + * Run the Yoast SEO 1.5 upgrade routine. + * + * @param string $version Current plugin version. + * + * @return void + */ + private function upgrade_15( $version ) { + // Clean up options and meta. + WPSEO_Options::clean_up( null, $version ); + WPSEO_Meta::clean_up(); + } + + /** + * Moves options that moved position in WPSEO 2.0. + * + * @return void + */ + private function upgrade_20() { + /** + * Clean up stray wpseo_ms options from the options table, option should only exist in the sitemeta table. + * This could have been caused in many version of Yoast SEO, so deleting it for everything below 2.0. + */ + delete_option( 'wpseo_ms' ); + + $wpseo = $this->get_option_from_database( 'wpseo' ); + $this->save_option_setting( $wpseo, 'pinterestverify' ); + + // Re-save option to trigger sanitization. + $this->cleanup_option_data( 'wpseo' ); + } + + /** + * Detects if taxonomy terms were split and updates the corresponding taxonomy meta's accordingly. + * + * @return void + */ + private function upgrade_21() { + $taxonomies = get_option( 'wpseo_taxonomy_meta', [] ); + + if ( ! empty( $taxonomies ) ) { + foreach ( $taxonomies as $taxonomy => $tax_metas ) { + foreach ( $tax_metas as $term_id => $tax_meta ) { + if ( function_exists( 'wp_get_split_term' ) ) { + $new_term_id = wp_get_split_term( $term_id, $taxonomy ); + if ( $new_term_id !== false ) { + $taxonomies[ $taxonomy ][ $new_term_id ] = $taxonomies[ $taxonomy ][ $term_id ]; + unset( $taxonomies[ $taxonomy ][ $term_id ] ); + } + } + } + } + + update_option( 'wpseo_taxonomy_meta', $taxonomies ); + } + } + + /** + * Performs upgrade functions to Yoast SEO 2.2. + * + * @return void + */ + private function upgrade_22() { + // Unschedule our tracking. + wp_clear_scheduled_hook( 'yoast_tracking' ); + + $this->cleanup_option_data( 'wpseo' ); + } + + /** + * Schedules upgrade function to Yoast SEO 2.3. + * + * @return void + */ + private function upgrade_23() { + add_action( 'wp', [ $this, 'upgrade_23_query' ], 90 ); + add_action( 'admin_head', [ $this, 'upgrade_23_query' ], 90 ); + } + + /** + * Performs upgrade query to Yoast SEO 2.3. + * + * @return void + */ + public function upgrade_23_query() { + // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key -- Reason: executed only during the upgrade routine. + // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value -- Reason: executed only during the upgrade routine. + $wp_query = new WP_Query( 'post_type=any&meta_key=_yoast_wpseo_sitemap-include&meta_value=never&order=ASC' ); + + if ( ! empty( $wp_query->posts ) ) { + $options = get_option( 'wpseo_xml' ); + + $excluded_posts = []; + if ( $options['excluded-posts'] !== '' ) { + $excluded_posts = explode( ',', $options['excluded-posts'] ); + } + + foreach ( $wp_query->posts as $post ) { + if ( ! in_array( (string) $post->ID, $excluded_posts, true ) ) { + $excluded_posts[] = $post->ID; + } + } + + // Updates the meta value. + $options['excluded-posts'] = implode( ',', $excluded_posts ); + + // Update the option. + update_option( 'wpseo_xml', $options ); + } + + // Remove the meta fields. + delete_post_meta_by_key( '_yoast_wpseo_sitemap-include' ); + } + + /** + * Performs upgrade functions to Yoast SEO 3.0. + * + * @return void + */ + private function upgrade_30() { + // Remove the meta fields for sitemap prio. + delete_post_meta_by_key( '_yoast_wpseo_sitemap-prio' ); + } + + /** + * Performs upgrade functions to Yoast SEO 3.3. + * + * @return void + */ + private function upgrade_33() { + // Notification dismissals have been moved to User Meta instead of global option. + delete_option( Yoast_Notification_Center::STORAGE_KEY ); + } + + /** + * Performs upgrade functions to Yoast SEO 3.6. + * + * @return void + */ + protected function upgrade_36() { + global $wpdb; + + // Between 3.2 and 3.4 the sitemap options were saved with autoloading enabled. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. + $wpdb->query( + $wpdb->prepare( + 'DELETE FROM %i WHERE %i LIKE %s AND autoload IN ("on", "yes")', + [ $wpdb->options, 'option_name', 'wpseo_sitemap_%' ] + ) + ); + } + + /** + * Removes the about notice when its still in the database. + * + * @return void + */ + private function upgrade_40() { + $center = Yoast_Notification_Center::get(); + $center->remove_notification_by_id( 'wpseo-dismiss-about' ); + } + + /** + * Moves the content-analysis-active and keyword-analysis-acive options from wpseo-titles to wpseo. + * + * @return void + */ + private function upgrade_44() { + $wpseo_titles = $this->get_option_from_database( 'wpseo_titles' ); + + $this->save_option_setting( $wpseo_titles, 'content-analysis-active', 'content_analysis_active' ); + $this->save_option_setting( $wpseo_titles, 'keyword-analysis-active', 'keyword_analysis_active' ); + + // Remove irrelevant content from the option. + $this->cleanup_option_data( 'wpseo_titles' ); + } + + /** + * Renames the meta name for the cornerstone content. It was a public meta field and it has to be private. + * + * @return void + */ + private function upgrade_47() { + global $wpdb; + + // The meta key has to be private, so prefix it. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. + $wpdb->query( + $wpdb->prepare( + 'UPDATE ' . $wpdb->postmeta . ' SET meta_key = %s WHERE meta_key = "yst_is_cornerstone"', + WPSEO_Cornerstone_Filter::META_NAME + ) + ); + } + + /** + * Removes the 'wpseo-dismiss-about' notice for every user that still has it. + * + * @return void + */ + protected function upgrade_49() { + global $wpdb; + + /* + * Using a filter to remove the notification for the current logged in user. The notification center is + * initializing the notifications before the upgrade routine has been executedd and is saving the stored + * notifications on shutdown. This causes the returning notification. By adding this filter the shutdown + * routine on the notification center will remove the notification. + */ + add_filter( 'yoast_notifications_before_storage', [ $this, 'remove_about_notice' ] ); + + $meta_key = $wpdb->get_blog_prefix() . Yoast_Notification_Center::STORAGE_KEY; + + // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. + $usermetas = $wpdb->get_results( + $wpdb->prepare( + ' + SELECT %i, %i + FROM %i + WHERE %i = %s AND %i LIKE %s + ', + [ 'user_id', 'meta_value', $wpdb->usermeta, 'meta_key', $meta_key, 'meta_value', '%wpseo-dismiss-about%' ] + ), + ARRAY_A + ); + + if ( empty( $usermetas ) ) { + return; + } + + foreach ( $usermetas as $usermeta ) { + $notifications = maybe_unserialize( $usermeta['meta_value'] ); + + foreach ( $notifications as $notification_key => $notification ) { + if ( ! empty( $notification['options']['id'] ) && $notification['options']['id'] === 'wpseo-dismiss-about' ) { + unset( $notifications[ $notification_key ] ); + } + } + + update_user_option( $usermeta['user_id'], Yoast_Notification_Center::STORAGE_KEY, array_values( $notifications ) ); + } + } + + /** + * Removes the wpseo-dismiss-about notice from a list of notifications. + * + * @param Yoast_Notification[] $notifications The notifications to filter. + * + * @return Yoast_Notification[] The filtered list of notifications. Excluding the wpseo-dismiss-about notification. + */ + public function remove_about_notice( $notifications ) { + foreach ( $notifications as $notification_key => $notification ) { + if ( $notification->get_id() === 'wpseo-dismiss-about' ) { + unset( $notifications[ $notification_key ] ); + } + } + + return $notifications; + } + + /** + * Adds the yoast_seo_links table to the database. + * + * @return void + */ + protected function upgrade_50() { + global $wpdb; + + // Deletes the post meta value, which might created in the RC. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. + $wpdb->query( + $wpdb->prepare( + "DELETE FROM %i + WHERE %i = '_yst_content_links_processed'", + [ $wpdb->postmeta, 'meta_key' ] + ) + ); + } + + /** + * Register new capabilities and roles. + * + * @return void + */ + private function upgrade_55() { + // Register roles. + do_action( 'wpseo_register_roles' ); + WPSEO_Role_Manager_Factory::get()->add(); + + // Register capabilities. + do_action( 'wpseo_register_capabilities' ); + WPSEO_Capability_Manager_Factory::get()->add(); + } + + /** + * Removes some no longer used options for noindexing subpages and for meta keywords and its associated templates. + * + * @return void + */ + private function upgrade_63() { + $this->cleanup_option_data( 'wpseo_titles' ); + } + + /** + * Perform the 7.0 upgrade, moves settings around, deletes several options. + * + * @return void + */ + private function upgrade_70() { + + $wpseo_permalinks = $this->get_option_from_database( 'wpseo_permalinks' ); + $wpseo_xml = $this->get_option_from_database( 'wpseo_xml' ); + $wpseo_rss = $this->get_option_from_database( 'wpseo_rss' ); + $wpseo = $this->get_option_from_database( 'wpseo' ); + $wpseo_internallinks = $this->get_option_from_database( 'wpseo_internallinks' ); + + // Move some permalink settings, then delete the option. + $this->save_option_setting( $wpseo_permalinks, 'redirectattachment', 'disable-attachment' ); + $this->save_option_setting( $wpseo_permalinks, 'stripcategorybase' ); + + // Move one XML sitemap setting, then delete the option. + $this->save_option_setting( $wpseo_xml, 'enablexmlsitemap', 'enable_xml_sitemap' ); + + // Move the RSS settings to the search appearance settings, then delete the RSS option. + $this->save_option_setting( $wpseo_rss, 'rssbefore' ); + $this->save_option_setting( $wpseo_rss, 'rssafter' ); + + $this->save_option_setting( $wpseo, 'company_logo' ); + $this->save_option_setting( $wpseo, 'company_name' ); + $this->save_option_setting( $wpseo, 'company_or_person' ); + $this->save_option_setting( $wpseo, 'person_name' ); + + // Remove the website name and altername name as we no longer need them. + $this->cleanup_option_data( 'wpseo' ); + + // All the breadcrumbs settings have moved to the search appearance settings. + foreach ( array_keys( $wpseo_internallinks ) as $key ) { + $this->save_option_setting( $wpseo_internallinks, $key ); + } + + // Convert hidden metabox options to display metabox options. + $title_options = get_option( 'wpseo_titles' ); + + foreach ( $title_options as $key => $value ) { + if ( strpos( $key, 'hideeditbox-tax-' ) === 0 ) { + $taxonomy = substr( $key, strlen( 'hideeditbox-tax-' ) ); + WPSEO_Options::set( 'display-metabox-tax-' . $taxonomy, ! $value ); + continue; + } + + if ( strpos( $key, 'hideeditbox-' ) === 0 ) { + $post_type = substr( $key, strlen( 'hideeditbox-' ) ); + WPSEO_Options::set( 'display-metabox-pt-' . $post_type, ! $value ); + continue; + } + } + + // Cleanup removed options. + delete_option( 'wpseo_xml' ); + delete_option( 'wpseo_permalinks' ); + delete_option( 'wpseo_rss' ); + delete_option( 'wpseo_internallinks' ); + + // Remove possibly present plugin conflict notice for plugin that was removed from the list of conflicting plugins. + $yoast_plugin_conflict = WPSEO_Plugin_Conflict::get_instance(); + $yoast_plugin_conflict->clear_error( 'header-footer/plugin.php' ); + + // Moves the user meta for excluding from the XML sitemap to a noindex. + global $wpdb; + // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. + $wpdb->query( "UPDATE $wpdb->usermeta SET meta_key = 'wpseo_noindex_author' WHERE meta_key = 'wpseo_excludeauthorsitemap'" ); + } + + /** + * Perform the 7.1 upgrade. + * + * @return void + */ + private function upgrade_71() { + $this->cleanup_option_data( 'wpseo_social' ); + + // Move the breadcrumbs setting and invert it. + $title_options = $this->get_option_from_database( 'wpseo_titles' ); + + if ( array_key_exists( 'breadcrumbs-blog-remove', $title_options ) ) { + WPSEO_Options::set( 'breadcrumbs-display-blog-page', ! $title_options['breadcrumbs-blog-remove'] ); + + $this->cleanup_option_data( 'wpseo_titles' ); + } + } + + /** + * Perform the 7.3 upgrade. + * + * @return void + */ + private function upgrade_73() { + global $wpdb; + // We've moved the cornerstone checkbox to our proper namespace. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. + $wpdb->query( "UPDATE $wpdb->postmeta SET meta_key = '_yoast_wpseo_is_cornerstone' WHERE meta_key = '_yst_is_cornerstone'" ); + + // Remove the previous Whip dismissed message, as this is a new one regarding PHP 5.2. + delete_option( 'whip_dismiss_timestamp' ); + } + + /** + * Performs the 7.4 upgrade. + * + * @return void + */ + protected function upgrade_74() { + $this->remove_sitemap_validators(); + } + + /** + * Performs the 7.5.3 upgrade. + * + * When upgrading purging media is potentially relevant. + * + * @return void + */ + private function upgrade_753() { + // Only when attachments are not disabled. + if ( WPSEO_Options::get( 'disable-attachment' ) === true ) { + return; + } + + // Only when attachments are not no-indexed. + if ( WPSEO_Options::get( 'noindex-attachment' ) === true ) { + return; + } + + // Set purging relevancy. + WPSEO_Options::set( 'is-media-purge-relevant', true ); + } + + /** + * Performs the 7.7 upgrade. + * + * @return void + */ + private function upgrade_77() { + // Remove all OpenGraph content image cache. + $this->delete_post_meta( '_yoast_wpseo_post_image_cache' ); + } + + /** + * Performs the 7.7.2 upgrade. + * + * @return void + */ + private function upgrade_772() { + if ( YoastSEO()->helpers->woocommerce->is_active() ) { + $this->migrate_woocommerce_archive_setting_to_shop_page(); + } + } + + /** + * Performs the 9.0 upgrade. + * + * @return void + */ + protected function upgrade_90() { + global $wpdb; + + // Invalidate all sitemap cache transients. + WPSEO_Sitemaps_Cache_Validator::cleanup_database(); + + // Removes all scheduled tasks for hitting the sitemap index. + wp_clear_scheduled_hook( 'wpseo_hit_sitemap_index' ); + + // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. + $wpdb->query( + $wpdb->prepare( + 'DELETE FROM %i + WHERE %i LIKE %s', + [ $wpdb->options, 'option_name', 'wpseo_sitemap_%' ] + ) + ); + } + + /** + * Performs the 10.0 upgrade. + * + * @return void + */ + private function upgrade_100() { + // Removes recalibration notifications. + $this->clean_all_notifications(); + + // Removes recalibration options. + WPSEO_Options::clean_up( 'wpseo' ); + delete_option( 'wpseo_recalibration_beta_mailinglist_subscription' ); + } + + /** + * Performs the 11.1 upgrade. + * + * @return void + */ + private function upgrade_111() { + // Set company_or_person to company when it's an invalid value. + $company_or_person = WPSEO_Options::get( 'company_or_person', '' ); + + if ( ! in_array( $company_or_person, [ 'company', 'person' ], true ) ) { + WPSEO_Options::set( 'company_or_person', 'company' ); + } + } + + /** + * Performs the 12.3 upgrade. + * + * Removes the about notice when its still in the database. + * + * @return void + */ + private function upgrade_123() { + $plugins = [ + 'yoast-seo-premium', + 'video-seo-for-wordpress-seo-by-yoast', + 'yoast-news-seo', + 'local-seo-for-yoast-seo', + 'yoast-woocommerce-seo', + 'yoast-acf-analysis', + ]; + + $center = Yoast_Notification_Center::get(); + foreach ( $plugins as $plugin ) { + $center->remove_notification_by_id( 'wpseo-outdated-yoast-seo-plugin-' . $plugin ); + } + } + + /** + * Performs the 12.4 upgrade. + * + * Removes the Google plus defaults from the database. + * + * @return void + */ + private function upgrade_124() { + $this->cleanup_option_data( 'wpseo_social' ); + } + + /** + * Performs the 12.5 upgrade. + * + * @return void + */ + public function upgrade_125() { + // Disables the force rewrite title when the theme supports it through WordPress. + if ( WPSEO_Options::get( 'forcerewritetitle', false ) && current_theme_supports( 'title-tag' ) ) { + WPSEO_Options::set( 'forcerewritetitle', false ); + } + + global $wpdb; + // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. + $wpdb->query( + $wpdb->prepare( + 'DELETE FROM %i + WHERE %i = %s', + [ $wpdb->usermeta, 'meta_key', 'wp_yoast_promo_hide_premium_upsell_admin_block' ] + ) + ); + + // Removes the WordPress update notification, because it is no longer necessary when WordPress 5.3 is released. + $center = Yoast_Notification_Center::get(); + $center->remove_notification_by_id( 'wpseo-dismiss-wordpress-upgrade' ); + } + + /** + * Performs the 12.8 upgrade. + * + * @return void + */ + private function upgrade_128() { + // Re-save wpseo to make sure bf_banner_2019_dismissed key is gone. + $this->cleanup_option_data( 'wpseo' ); + + Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-page_comments-notice' ); + Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-wordpress-upgrade' ); + } + + /** + * Performs the 13.2 upgrade. + * + * @return void + */ + private function upgrade_132() { + Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-tagline-notice' ); + Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-permalink-notice' ); + Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-onpageorg' ); + + // Transfers the onpage option value to the ryte option. + $ryte_option = get_option( 'wpseo_ryte' ); + $onpage_option = get_option( 'wpseo_onpage' ); + if ( ! $ryte_option && $onpage_option ) { + update_option( 'wpseo_ryte', $onpage_option ); + delete_option( 'wpseo_onpage' ); + } + + // Changes onpage_indexability to ryte_indexability. + $wpseo_option = get_option( 'wpseo' ); + if ( isset( $wpseo_option['onpage_indexability'] ) && ! isset( $wpseo_option['ryte_indexability'] ) ) { + $wpseo_option['ryte_indexability'] = $wpseo_option['onpage_indexability']; + unset( $wpseo_option['onpage_indexability'] ); + update_option( 'wpseo', $wpseo_option ); + } + + if ( wp_next_scheduled( 'wpseo_ryte_fetch' ) ) { + wp_clear_scheduled_hook( 'wpseo_ryte_fetch' ); + } + + /* + * Re-register capabilities to add the new `view_site_health_checks` + * capability to the SEO Manager role. + */ + do_action( 'wpseo_register_capabilities' ); + WPSEO_Capability_Manager_Factory::get()->add(); + } + + /** + * Perform the 14.0.3 upgrade. + * + * @return void + */ + private function upgrade_1403() { + WPSEO_Options::set( 'ignore_indexation_warning', false ); + } + + /** + * Performs the 14.1 upgrade. + * + * @return void + */ + private function upgrade_141() { + /* + * These notifications are retrieved from storage on the `init` hook with + * priority 1. We need to remove them after they're retrieved. + */ + add_action( 'init', [ $this, 'remove_notifications_for_141' ] ); + add_action( 'init', [ $this, 'clean_up_private_taxonomies_for_141' ] ); + + $this->reset_permalinks_of_attachments_for_141(); + } + + /** + * Performs the 14.2 upgrade. + * + * Removes the yoast-acf-analysis notice when it's still in the database. + * + * @return void + */ + private function upgrade_142() { + add_action( 'init', [ $this, 'remove_acf_notification_for_142' ] ); + } + + /** + * Performs the 14.5 upgrade. + * + * @return void + */ + private function upgrade_145() { + add_action( 'init', [ $this, 'set_indexation_completed_option_for_145' ] ); + } + + /** + * Performs the 14.9 upgrade. + * + * @return void + */ + private function upgrade_149() { + $version = get_option( 'wpseo_license_server_version', 2 ); + WPSEO_Options::set( 'license_server_version', $version ); + delete_option( 'wpseo_license_server_version' ); + } + + /** + * Performs the 15.1 upgrade. + * + * @return void + */ + private function upgrade_151() { + $this->set_home_url_for_151(); + $this->move_indexables_indexation_reason_for_151(); + + add_action( 'init', [ $this, 'set_permalink_structure_option_for_151' ] ); + add_action( 'init', [ $this, 'store_custom_taxonomy_slugs_for_151' ] ); + } + + /** + * Performs the 15.3 upgrade. + * + * @return void + */ + private function upgrade_153() { + WPSEO_Options::set( 'category_base_url', get_option( 'category_base' ) ); + WPSEO_Options::set( 'tag_base_url', get_option( 'tag_base' ) ); + + // Rename a couple of options. + $indexation_started_value = WPSEO_Options::get( 'indexation_started' ); + WPSEO_Options::set( 'indexing_started', $indexation_started_value ); + + $indexables_indexing_completed_value = WPSEO_Options::get( 'indexables_indexation_completed' ); + WPSEO_Options::set( 'indexables_indexing_completed', $indexables_indexing_completed_value ); + } + + /** + * Performs the 15.5 upgrade. + * + * @return void + */ + private function upgrade_155() { + // Unset the fbadminapp value in the wpseo_social option. + $wpseo_social_option = get_option( 'wpseo_social' ); + + if ( isset( $wpseo_social_option['fbadminapp'] ) ) { + unset( $wpseo_social_option['fbadminapp'] ); + update_option( 'wpseo_social', $wpseo_social_option ); + } + } + + /** + * Performs the 15.7 upgrade. + * + * @return void + */ + private function upgrade_157() { + add_action( 'init', [ $this, 'remove_plugin_updated_notification_for_157' ] ); + } + + /** + * Performs the 15.9.1 upgrade routine. + * + * @return void + */ + private function upgrade_1591() { + $enabled_auto_updates = get_option( 'auto_update_plugins' ); + $addon_update_watcher = YoastSEO()->classes->get( Addon_Update_Watcher::class ); + $addon_update_watcher->toggle_auto_updates_for_add_ons( 'auto_update_plugins', [], $enabled_auto_updates ); + } + + /** + * Performs the 16.2 upgrade routine. + * + * @return void + */ + private function upgrade_162() { + $enabled_auto_updates = get_site_option( 'auto_update_plugins' ); + $addon_update_watcher = YoastSEO()->classes->get( Addon_Update_Watcher::class ); + $addon_update_watcher->toggle_auto_updates_for_add_ons( 'auto_update_plugins', $enabled_auto_updates, [] ); + } + + /** + * Performs the 16.5 upgrade. + * + * @return void + */ + private function upgrade_165() { + add_action( 'init', [ $this, 'copy_og_settings_from_social_to_titles' ], 99 ); + + // Run after the WPSEO_Options::enrich_defaults method which has priority 99. + add_action( 'init', [ $this, 'reset_og_settings_to_default_values' ], 100 ); + } + + /** + * Performs the 17.2 upgrade. Cleans out any unnecessary indexables. See $cleanup_integration->get_cleanup_tasks() to see what will be cleaned out. + * + * @return void + */ + private function upgrade_172() { + wp_unschedule_hook( 'wpseo_cleanup_orphaned_indexables' ); + wp_unschedule_hook( 'wpseo_cleanup_indexables' ); + + if ( ! wp_next_scheduled( Cleanup_Integration::START_HOOK ) ) { + wp_schedule_single_event( ( time() + ( MINUTE_IN_SECONDS * 5 ) ), Cleanup_Integration::START_HOOK ); + } + } + + /** + * Performs the 17.7.1 upgrade routine. + * + * @return void + */ + private function upgrade_1771() { + $enabled_auto_updates = get_site_option( 'auto_update_plugins' ); + $addon_update_watcher = YoastSEO()->classes->get( Addon_Update_Watcher::class ); + $addon_update_watcher->toggle_auto_updates_for_add_ons( 'auto_update_plugins', $enabled_auto_updates, [] ); + } + + /** + * Performs the 17.9 upgrade routine. + * + * @return void + */ + private function upgrade_179() { + WPSEO_Options::set( 'wincher_integration_active', true ); + } + + /** + * Performs the 18.3 upgrade routine. + * + * @return void + */ + private function upgrade_183() { + $this->delete_post_meta( 'yoast-structured-data-blocks-images-cache' ); + } + + /** + * Performs the 18.6 upgrade routine. + * + * @return void + */ + private function upgrade_186() { + if ( is_multisite() ) { + WPSEO_Options::set( 'allow_wincher_integration_active', false ); + } + } + + /** + * Performs the 18.9 upgrade routine. + * + * @return void + */ + private function upgrade_189() { + // Make old users not get the Installation Success page after upgrading. + WPSEO_Options::set( 'should_redirect_after_install_free', false ); + // We're adding a hardcoded time here, so that in the future we can be able to identify whether the user did see the Installation Success page or not. + // If they did, they wouldn't have this hardcoded value in that option, but rather (roughly) the timestamp of the moment they saw it. + WPSEO_Options::set( 'activation_redirect_timestamp_free', 1652258756 ); + + // Transfer the Social URLs. + $other = []; + $other[] = WPSEO_Options::get( 'instagram_url' ); + $other[] = WPSEO_Options::get( 'linkedin_url' ); + $other[] = WPSEO_Options::get( 'myspace_url' ); + $other[] = WPSEO_Options::get( 'pinterest_url' ); + $other[] = WPSEO_Options::get( 'youtube_url' ); + $other[] = WPSEO_Options::get( 'wikipedia_url' ); + + WPSEO_Options::set( 'other_social_urls', array_values( array_unique( array_filter( $other ) ) ) ); + + // Transfer the progress of the old Configuration Workout. + $workout_data = WPSEO_Options::get( 'workouts_data' ); + $old_conf_progress = ( $workout_data['configuration']['finishedSteps'] ?? [] ); + + if ( in_array( 'optimizeSeoData', $old_conf_progress, true ) && in_array( 'siteRepresentation', $old_conf_progress, true ) ) { + // If completed ‘SEO optimization’ and ‘Site representation’ step, we assume the workout was completed. + $configuration_finished_steps = [ + 'siteRepresentation', + 'socialProfiles', + 'personalPreferences', + ]; + WPSEO_Options::set( 'configuration_finished_steps', $configuration_finished_steps ); + } + } + + /** + * Performs the 19.1 upgrade routine. + * + * @return void + */ + private function upgrade_191() { + if ( is_multisite() ) { + WPSEO_Options::set( 'allow_remove_feed_post_comments', true ); + } + } + + /** + * Performs the 19.3 upgrade routine. + * + * @return void + */ + private function upgrade_193() { + if ( empty( get_option( 'wpseo_premium', [] ) ) ) { + WPSEO_Options::set( 'enable_index_now', true ); + WPSEO_Options::set( 'enable_link_suggestions', true ); + } + } + + /** + * Performs the 19.6 upgrade routine. + * + * @return void + */ + private function upgrade_196() { + WPSEO_Options::set( 'ryte_indexability', false ); + WPSEO_Options::set( 'allow_ryte_indexability', false ); + wp_clear_scheduled_hook( 'wpseo_ryte_fetch' ); + } + + /** + * Performs the 19.11 upgrade routine. + * + * @return void + */ + private function upgrade_1911() { + add_action( 'shutdown', [ $this, 'remove_indexable_rows_for_non_public_post_types' ] ); + add_action( 'shutdown', [ $this, 'remove_indexable_rows_for_non_public_taxonomies' ] ); + $this->deduplicate_unindexed_indexable_rows(); + $this->remove_indexable_rows_for_disabled_authors_archive(); + if ( ! wp_next_scheduled( Cleanup_Integration::START_HOOK ) ) { + wp_schedule_single_event( ( time() + ( MINUTE_IN_SECONDS * 5 ) ), Cleanup_Integration::START_HOOK ); + } + } + + /** + * Performs the 20.2 upgrade routine. + * + * @return void + */ + private function upgrade_202() { + if ( WPSEO_Options::get( 'disable-attachment', true ) ) { + $attachment_cleanup_helper = YoastSEO()->helpers->attachment_cleanup; + + $attachment_cleanup_helper->remove_attachment_indexables( true ); + $attachment_cleanup_helper->clean_attachment_links_from_target_indexable_ids( true ); + } + + $this->clean_unindexed_indexable_rows_with_no_object_id(); + + if ( ! wp_next_scheduled( Cleanup_Integration::START_HOOK ) ) { + // This schedules the cleanup routine cron again, since in combination of premium cleans up the prominent words table. We also want to cleanup possible orphaned hierarchies from the above cleanups. + wp_schedule_single_event( ( time() + ( MINUTE_IN_SECONDS * 5 ) ), Cleanup_Integration::START_HOOK ); + } + } + + /** + * Performs the 20.5 upgrade routine. + * + * @return void + */ + private function upgrade_205() { + if ( ! wp_next_scheduled( Cleanup_Integration::START_HOOK ) ) { + wp_schedule_single_event( ( time() + ( MINUTE_IN_SECONDS * 5 ) ), Cleanup_Integration::START_HOOK ); + } + } + + /** + * Performs the 20.7 upgrade routine. + * Removes the metadata related to the settings page introduction modal for all the users. + * Also, schedules another cleanup scheduled action. + * + * @return void + */ + private function upgrade_207() { + add_action( 'shutdown', [ $this, 'delete_user_introduction_meta' ] ); + } + + /** + * Performs the 20.8 upgrade routine. + * Schedules another cleanup scheduled action. + * + * @return void + */ + private function upgrade_208() { + if ( ! wp_next_scheduled( Cleanup_Integration::START_HOOK ) ) { + wp_schedule_single_event( ( time() + ( MINUTE_IN_SECONDS * 5 ) ), Cleanup_Integration::START_HOOK ); + } + } + + /** + * Performs the 22.6 upgrade routine. + * Schedules another cleanup scheduled action, but starting from the last cleanup action we just added (if there aren't any running cleanups already). + * + * @return void + */ + private function upgrade_226() { + if ( get_option( Cleanup_Integration::CURRENT_TASK_OPTION ) === false ) { + $cleanup_integration = YoastSEO()->classes->get( Cleanup_Integration::class ); + $cleanup_integration->start_cron_job( 'clean_selected_empty_usermeta', DAY_IN_SECONDS ); + } + } + + /** + * Sets the home_url option for the 15.1 upgrade routine. + * + * @return void + */ + protected function set_home_url_for_151() { + $home_url = WPSEO_Options::get( 'home_url' ); + + if ( empty( $home_url ) ) { + WPSEO_Options::set( 'home_url', get_home_url() ); + } + } + + /** + * Moves the `indexables_indexation_reason` option to the + * renamed `indexing_reason` option. + * + * @return void + */ + protected function move_indexables_indexation_reason_for_151() { + $reason = WPSEO_Options::get( 'indexables_indexation_reason', '' ); + WPSEO_Options::set( 'indexing_reason', $reason ); + } + + /** + * Checks if the indexable indexation is completed. + * If so, sets the `indexables_indexation_completed` option to `true`, + * else to `false`. + * + * @return void + */ + public function set_indexation_completed_option_for_145() { + WPSEO_Options::set( 'indexables_indexation_completed', YoastSEO()->helpers->indexing->get_limited_filtered_unindexed_count( 1 ) === 0 ); + } + + /** + * Cleans up the private taxonomies from the indexables table for the upgrade routine to 14.1. + * + * @return void + */ + public function clean_up_private_taxonomies_for_141() { + global $wpdb; + + // If migrations haven't been completed successfully the following may give false errors. So suppress them. + $show_errors = $wpdb->show_errors; + $wpdb->show_errors = false; + + // Clean up indexables of private taxonomies. + $private_taxonomies = get_taxonomies( [ 'public' => false ], 'names' ); + + if ( empty( $private_taxonomies ) ) { + return; + } + + $replacements = array_merge( [ Model::get_table_name( 'Indexable' ), 'object_type', 'object_sub_type' ], $private_taxonomies ); + + // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. + $wpdb->query( + $wpdb->prepare( + "DELETE FROM %i + WHERE %i = 'term' + AND %i IN (" + . implode( ', ', array_fill( 0, count( $private_taxonomies ), '%s' ) ) + . ')', + $replacements + ) + ); + + $wpdb->show_errors = $show_errors; + } + + /** + * Resets the permalinks of attachments to `null` in the indexable table for the upgrade routine to 14.1. + * + * @return void + */ + private function reset_permalinks_of_attachments_for_141() { + global $wpdb; + + // If migrations haven't been completed succesfully the following may give false errors. So suppress them. + $show_errors = $wpdb->show_errors; + $wpdb->show_errors = false; + + // Reset the permalinks of the attachments in the indexable table. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. + $wpdb->query( + $wpdb->prepare( + "UPDATE %i SET %i = NULL WHERE %i = 'post' AND %i = 'attachment'", + [ Model::get_table_name( 'Indexable' ), 'permalink', 'object_type', 'object_sub_type' ] + ) + ); + + $wpdb->show_errors = $show_errors; + } + + /** + * Removes notifications from the Notification center for the 14.1 upgrade. + * + * @return void + */ + public function remove_notifications_for_141() { + Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-recalculate' ); + Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-blog-public-notice' ); + Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-links-table-not-accessible' ); + Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-post-type-archive-notification' ); + } + + /** + * Removes the wpseo-suggested-plugin-yoast-acf-analysis notification from the Notification center for the 14.2 upgrade. + * + * @return void + */ + public function remove_acf_notification_for_142() { + Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-suggested-plugin-yoast-acf-analysis' ); + } + + /** + * Removes the wpseo-plugin-updated notification from the Notification center for the 15.7 upgrade. + * + * @return void + */ + public function remove_plugin_updated_notification_for_157() { + Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-plugin-updated' ); + } + + /** + * Removes all notifications saved in the database under 'wp_yoast_notifications'. + * + * @return void + */ + private function clean_all_notifications() { + global $wpdb; + delete_metadata( 'user', 0, $wpdb->get_blog_prefix() . Yoast_Notification_Center::STORAGE_KEY, '', true ); + } + + /** + * Removes the post meta fields for a given meta key. + * + * @param string $meta_key The meta key. + * + * @return void + */ + private function delete_post_meta( $meta_key ) { + global $wpdb; + $deleted = $wpdb->delete( $wpdb->postmeta, [ 'meta_key' => $meta_key ], [ '%s' ] ); + + if ( $deleted ) { + wp_cache_set( 'last_changed', microtime(), 'posts' ); + } + } + + /** + * Removes all sitemap validators. + * + * This should be executed on every upgrade routine until we have removed the sitemap caching in the database. + * + * @return void + */ + private function remove_sitemap_validators() { + global $wpdb; + + // Remove all sitemap validators. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. + $wpdb->query( + $wpdb->prepare( + 'DELETE FROM %i WHERE %i LIKE %s', + [ $wpdb->options, 'option_name', 'wpseo_sitemap%validator%' ] + ) + ); + } + + /** + * Retrieves the option value directly from the database. + * + * @param string $option_name Option to retrieve. + * + * @return int|string|bool|float|array The content of the option if exists, otherwise an empty array. + */ + protected function get_option_from_database( $option_name ) { + global $wpdb; + + // Load option directly from the database, to avoid filtering and sanitization. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. + $results = $wpdb->get_results( + $wpdb->prepare( + 'SELECT %i FROM %i WHERE %i = %s', + [ 'option_value', $wpdb->options, 'option_name', $option_name ] + ), + ARRAY_A + ); + + if ( ! empty( $results ) ) { + return maybe_unserialize( $results[0]['option_value'] ); + } + + return []; + } + + /** + * Cleans the option to make sure only relevant settings are there. + * + * @param string $option_name Option name save. + * + * @return void + */ + protected function cleanup_option_data( $option_name ) { + $data = get_option( $option_name, [] ); + if ( ! is_array( $data ) || $data === [] ) { + return; + } + + /* + * Clean up the option by re-saving it. + * + * The option framework will remove any settings that are not configured + * for this option, removing any migrated settings. + */ + update_option( $option_name, $data ); + } + + /** + * Saves an option setting to where it should be stored. + * + * @param int|string|bool|float|array $source_data The option containing the value to be migrated. + * @param string $source_setting Name of the key in the "from" option. + * @param string|null $target_setting Name of the key in the "to" option. + * + * @return void + */ + protected function save_option_setting( $source_data, $source_setting, $target_setting = null ) { + if ( $target_setting === null ) { + $target_setting = $source_setting; + } + + if ( isset( $source_data[ $source_setting ] ) ) { + WPSEO_Options::set( $target_setting, $source_data[ $source_setting ] ); + } + } + + /** + * Migrates WooCommerce archive settings to the WooCommerce Shop page meta-data settings. + * + * If no Shop page is defined, nothing will be migrated. + * + * @return void + */ + private function migrate_woocommerce_archive_setting_to_shop_page() { + $shop_page_id = wc_get_page_id( 'shop' ); + + if ( $shop_page_id === -1 ) { + return; + } + + $title = WPSEO_Meta::get_value( 'title', $shop_page_id ); + + if ( empty( $title ) ) { + $option_title = WPSEO_Options::get( 'title-ptarchive-product' ); + + WPSEO_Meta::set_value( + 'title', + $option_title, + $shop_page_id + ); + + WPSEO_Options::set( 'title-ptarchive-product', '' ); + } + + $meta_description = WPSEO_Meta::get_value( 'metadesc', $shop_page_id ); + + if ( empty( $meta_description ) ) { + $option_metadesc = WPSEO_Options::get( 'metadesc-ptarchive-product' ); + + WPSEO_Meta::set_value( + 'metadesc', + $option_metadesc, + $shop_page_id + ); + + WPSEO_Options::set( 'metadesc-ptarchive-product', '' ); + } + + $bc_title = WPSEO_Meta::get_value( 'bctitle', $shop_page_id ); + + if ( empty( $bc_title ) ) { + $option_bctitle = WPSEO_Options::get( 'bctitle-ptarchive-product' ); + + WPSEO_Meta::set_value( + 'bctitle', + $option_bctitle, + $shop_page_id + ); + + WPSEO_Options::set( 'bctitle-ptarchive-product', '' ); + } + + $noindex = WPSEO_Meta::get_value( 'meta-robots-noindex', $shop_page_id ); + + if ( $noindex === '0' ) { + $option_noindex = WPSEO_Options::get( 'noindex-ptarchive-product' ); + + WPSEO_Meta::set_value( + 'meta-robots-noindex', + $option_noindex, + $shop_page_id + ); + + WPSEO_Options::set( 'noindex-ptarchive-product', false ); + } + } + + /** + * Stores the initial `permalink_structure` option. + * + * @return void + */ + public function set_permalink_structure_option_for_151() { + WPSEO_Options::set( 'permalink_structure', get_option( 'permalink_structure' ) ); + } + + /** + * Stores the initial slugs of custom taxonomies. + * + * @return void + */ + public function store_custom_taxonomy_slugs_for_151() { + $taxonomies = $this->taxonomy_helper->get_custom_taxonomies(); + + $custom_taxonomies = []; + + foreach ( $taxonomies as $taxonomy ) { + $slug = $this->taxonomy_helper->get_taxonomy_slug( $taxonomy ); + + $custom_taxonomies[ $taxonomy ] = $slug; + } + + WPSEO_Options::set( 'custom_taxonomy_slugs', $custom_taxonomies ); + } + + /** + * Copies the frontpage social settings to the titles options. + * + * @return void + */ + public function copy_og_settings_from_social_to_titles() { + $wpseo_social = get_option( 'wpseo_social' ); + $wpseo_titles = get_option( 'wpseo_titles' ); + + $copied_options = []; + // Reset to the correct default value. + $copied_options['open_graph_frontpage_title'] = '%%sitename%%'; + + $options = [ + 'og_frontpage_title' => 'open_graph_frontpage_title', + 'og_frontpage_desc' => 'open_graph_frontpage_desc', + 'og_frontpage_image' => 'open_graph_frontpage_image', + 'og_frontpage_image_id' => 'open_graph_frontpage_image_id', + ]; + + foreach ( $options as $social_option => $titles_option ) { + if ( ! empty( $wpseo_social[ $social_option ] ) ) { + $copied_options[ $titles_option ] = $wpseo_social[ $social_option ]; + } + } + + $wpseo_titles = array_merge( $wpseo_titles, $copied_options ); + + update_option( 'wpseo_titles', $wpseo_titles ); + } + + /** + * Reset the social options with the correct default values. + * + * @return void + */ + public function reset_og_settings_to_default_values() { + $wpseo_titles = get_option( 'wpseo_titles' ); + $updated_options = []; + + $updated_options['social-title-author-wpseo'] = '%%name%%'; + $updated_options['social-title-archive-wpseo'] = '%%date%%'; + + /* translators: %s expands to the name of a post type (plural). */ + $post_type_archive_default = sprintf( __( '%s Archive', 'wordpress-seo' ), '%%pt_plural%%' ); + + /* translators: %s expands to the variable used for term title. */ + $term_archive_default = sprintf( __( '%s Archives', 'wordpress-seo' ), '%%term_title%%' ); + + $post_type_objects = get_post_types( [ 'public' => true ], 'objects' ); + + if ( $post_type_objects ) { + foreach ( $post_type_objects as $pt ) { + // Post types. + if ( isset( $wpseo_titles[ 'social-title-' . $pt->name ] ) ) { + $updated_options[ 'social-title-' . $pt->name ] = '%%title%%'; + } + // Post type archives. + if ( isset( $wpseo_titles[ 'social-title-ptarchive-' . $pt->name ] ) ) { + $updated_options[ 'social-title-ptarchive-' . $pt->name ] = $post_type_archive_default; + } + } + } + + $taxonomy_objects = get_taxonomies( [ 'public' => true ], 'object' ); + + if ( $taxonomy_objects ) { + foreach ( $taxonomy_objects as $tax ) { + if ( isset( $wpseo_titles[ 'social-title-tax-' . $tax->name ] ) ) { + $updated_options[ 'social-title-tax-' . $tax->name ] = $term_archive_default; + } + } + } + + $wpseo_titles = array_merge( $wpseo_titles, $updated_options ); + + update_option( 'wpseo_titles', $wpseo_titles ); + } + + /** + * Removes all indexables for posts that are not publicly viewable. + * This method should be called after init, because post_types can still be registered. + * + * @return void + */ + public function remove_indexable_rows_for_non_public_post_types() { + global $wpdb; + + // If migrations haven't been completed successfully the following may give false errors. So suppress them. + $show_errors = $wpdb->show_errors; + $wpdb->show_errors = false; + + $indexable_table = Model::get_table_name( 'Indexable' ); + + $included_post_types = YoastSEO()->helpers->post_type->get_indexable_post_types(); + + if ( empty( $included_post_types ) ) { + // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. + $wpdb->query( + $wpdb->prepare( + "DELETE FROM %i + WHERE %i = 'post' + AND %i IS NOT NULL", + [ $indexable_table, 'object_type', 'object_sub_type' ] + ) + ); + } + else { + // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. + $wpdb->query( + $wpdb->prepare( + "DELETE FROM %i + WHERE %i = 'post' + AND %i IS NOT NULL + AND %i NOT IN ( " . implode( ', ', array_fill( 0, count( $included_post_types ), '%s' ) ) . ' )', + array_merge( [ $indexable_table, 'object_type', 'object_sub_type', 'object_sub_type' ], $included_post_types ) + ) + ); + } + + $wpdb->show_errors = $show_errors; + } + + /** + * Removes all indexables for terms that are not publicly viewable. + * This method should be called after init, because taxonomies can still be registered. + * + * @return void + */ + public function remove_indexable_rows_for_non_public_taxonomies() { + global $wpdb; + + // If migrations haven't been completed successfully the following may give false errors. So suppress them. + $show_errors = $wpdb->show_errors; + $wpdb->show_errors = false; + + $indexable_table = Model::get_table_name( 'Indexable' ); + + $included_taxonomies = YoastSEO()->helpers->taxonomy->get_indexable_taxonomies(); + + if ( empty( $included_taxonomies ) ) { + // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. + $wpdb->query( + $wpdb->prepare( + "DELETE FROM %i + WHERE %i = 'term' + AND %i IS NOT NULL", + [ $indexable_table, 'object_type', 'object_sub_type' ] + ) + ); + } + else { + // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. + $wpdb->query( + $wpdb->prepare( + "DELETE FROM %i + WHERE %i = 'term' + AND %i IS NOT NULL + AND %i NOT IN ( " . implode( ', ', array_fill( 0, count( $included_taxonomies ), '%s' ) ) . ' )', + array_merge( [ $indexable_table, 'object_type', 'object_sub_type', 'object_sub_type' ], $included_taxonomies ) + ) + ); + } + + $wpdb->show_errors = $show_errors; + } + + /** + * De-duplicates indexables that have more than one "unindexed" rows for the same object. Keeps the newest indexable. + * + * @return void + */ + protected function deduplicate_unindexed_indexable_rows() { + global $wpdb; + + // If migrations haven't been completed successfully the following may give false errors. So suppress them. + $show_errors = $wpdb->show_errors; + $wpdb->show_errors = false; + + // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. + $duplicates = $wpdb->get_results( + $wpdb->prepare( + " + SELECT + MAX(id) as newest_id, + object_id, + object_type + FROM + %i + WHERE + post_status = 'unindexed' + AND object_type IN ( 'term', 'post', 'user' ) + GROUP BY + object_id, + object_type + HAVING + count(*) > 1", + [ Model::get_table_name( 'Indexable' ) ] + ), + ARRAY_A + ); + + if ( empty( $duplicates ) ) { + $wpdb->show_errors = $show_errors; + + return; + } + + // Users, terms and posts may share the same object_id. So delete them in separate, more performant, queries. + $delete_queries = [ + $this->get_indexable_deduplication_query_for_type( 'post', $duplicates, $wpdb ), + $this->get_indexable_deduplication_query_for_type( 'term', $duplicates, $wpdb ), + $this->get_indexable_deduplication_query_for_type( 'user', $duplicates, $wpdb ), + ]; + + foreach ( $delete_queries as $delete_query ) { + if ( ! empty( $delete_query ) ) { + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared -- Reason: Is it prepared already. + $wpdb->query( $delete_query ); + // phpcs:enable + } + } + + $wpdb->show_errors = $show_errors; + } + + /** + * Cleans up "unindexed" indexable rows when appropriate, aka when there's no object ID even though it should. + * + * @return void + */ + protected function clean_unindexed_indexable_rows_with_no_object_id() { + global $wpdb; + + // If migrations haven't been completed successfully the following may give false errors. So suppress them. + $show_errors = $wpdb->show_errors; + $wpdb->show_errors = false; + + // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. + $wpdb->query( + $wpdb->prepare( + "DELETE FROM %i + WHERE %i = 'unindexed' + AND %i NOT IN ( 'home-page', 'date-archive', 'post-type-archive', 'system-page' ) + AND %i IS NULL", + [ Model::get_table_name( 'Indexable' ), 'post_status', 'object_type', 'object_id' ] + ) + ); + + $wpdb->show_errors = $show_errors; + } + + /** + * Removes all user indexable rows when the author archive is disabled. + * + * @return void + */ + protected function remove_indexable_rows_for_disabled_authors_archive() { + global $wpdb; + + if ( ! YoastSEO()->helpers->author_archive->are_disabled() ) { + return; + } + + // If migrations haven't been completed successfully the following may give false errors. So suppress them. + $show_errors = $wpdb->show_errors; + $wpdb->show_errors = false; + + // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. + $wpdb->query( + $wpdb->prepare( + "DELETE FROM %i WHERE %i = 'user'", + [ Model::get_table_name( 'Indexable' ), 'object_type' ] + ) + ); + + $wpdb->show_errors = $show_errors; + } + + /** + * Creates a query for de-duplicating indexables for a particular type. + * + * @param string $object_type The object type to deduplicate. + * @param string|array> $duplicates The result of the duplicate query. + * @param wpdb $wpdb The wpdb object. + * + * @return string The query that removes all but one duplicate for each object of the object type. + */ + protected function get_indexable_deduplication_query_for_type( $object_type, $duplicates, $wpdb ) { + $filtered_duplicates = array_filter( + $duplicates, + static function ( $duplicate ) use ( $object_type ) { + return $duplicate['object_type'] === $object_type; + } + ); + + if ( empty( $filtered_duplicates ) ) { + return ''; + } + + $object_ids = wp_list_pluck( $filtered_duplicates, 'object_id' ); + $newest_indexable_ids = wp_list_pluck( $filtered_duplicates, 'newest_id' ); + + $replacements = array_merge( [ Model::get_table_name( 'Indexable' ), 'object_id' ], array_values( $object_ids ), array_values( $newest_indexable_ids ) ); + $replacements[] = $object_type; + + // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way. + return $wpdb->prepare( + 'DELETE FROM + %i + WHERE + %i IN ( ' . implode( ', ', array_fill( 0, count( $filtered_duplicates ), '%d' ) ) . ' ) + AND id NOT IN ( ' . implode( ', ', array_fill( 0, count( $filtered_duplicates ), '%d' ) ) . ' ) + AND object_type = %s', + $replacements + ); + } + + /** + * Removes the settings' introduction modal data for users. + * + * @return void + */ + public function delete_user_introduction_meta() { + delete_metadata( 'user', 0, '_yoast_settings_introduction', '', true ); + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/class-wpseo-admin-bar-menu.php b/wp-content/plugins/wordpress-seo/inc/class-wpseo-admin-bar-menu.php new file mode 100644 index 00000000..e8c6f455 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/class-wpseo-admin-bar-menu.php @@ -0,0 +1,926 @@ +classes->get( Indexable_Repository::class ); + } + if ( ! $score_icon_helper ) { + $score_icon_helper = YoastSEO()->helpers->score_icon; + } + if ( ! $product_helper ) { + $product_helper = YoastSEO()->helpers->product; + } + if ( ! $shortlinker ) { + $shortlinker = new WPSEO_Shortlinker(); + } + + $this->product_helper = $product_helper; + $this->asset_manager = $asset_manager; + $this->indexable_repository = $indexable_repository; + $this->score_icon_helper = $score_icon_helper; + $this->shortlinker = $shortlinker; + } + + /** + * Gets whether SEO score is enabled, with cache applied. + * + * @return bool True if SEO score is enabled, false otherwise. + */ + protected function get_is_seo_enabled() { + if ( is_null( $this->is_seo_enabled ) ) { + $this->is_seo_enabled = ( new WPSEO_Metabox_Analysis_SEO() )->is_enabled(); + } + + return $this->is_seo_enabled; + } + + /** + * Gets whether readability is enabled, with cache applied. + * + * @return bool True if readability is enabled, false otherwise. + */ + protected function get_is_readability_enabled() { + if ( is_null( $this->is_readability_enabled ) ) { + $this->is_readability_enabled = ( new WPSEO_Metabox_Analysis_Readability() )->is_enabled(); + } + + return $this->is_readability_enabled; + } + + /** + * Returns the indexable for the current WordPress page, with cache applied. + * + * @return bool|Indexable The indexable, false if none could be found. + */ + protected function get_current_indexable() { + if ( is_null( $this->current_indexable ) ) { + $this->current_indexable = $this->indexable_repository->for_current_page(); + } + + return $this->current_indexable; + } + + /** + * Adds the admin bar menu. + * + * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to. + * + * @return void + */ + public function add_menu( WP_Admin_Bar $wp_admin_bar ) { + // On block editor pages, the admin bar only shows on mobile, where having this menu icon is not very helpful. + if ( is_admin() ) { + $screen = get_current_screen(); + if ( isset( $screen ) && $screen->is_block_editor() ) { + return; + } + } + + // If the current user can't write posts, this is all of no use, so let's not output an admin menu. + if ( ! current_user_can( 'edit_posts' ) ) { + return; + } + + $this->add_root_menu( $wp_admin_bar ); + + /** + * Adds a submenu item in the top of the adminbar. + * + * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to. + * @param string $menu_identifier The menu identifier. + */ + do_action( 'wpseo_add_adminbar_submenu', $wp_admin_bar, self::MENU_IDENTIFIER ); + + if ( ! is_admin() ) { + + if ( is_singular() || is_tag() || is_tax() || is_category() ) { + $is_seo_enabled = $this->get_is_seo_enabled(); + $is_readability_enabled = $this->get_is_readability_enabled(); + + $indexable = $this->get_current_indexable(); + + if ( $is_seo_enabled ) { + $focus_keyword = ( ! is_a( $indexable, 'Yoast\WP\SEO\Models\Indexable' ) || is_null( $indexable->primary_focus_keyword ) ) ? __( 'not set', 'wordpress-seo' ) : $indexable->primary_focus_keyword; + + $wp_admin_bar->add_menu( + [ + 'parent' => self::MENU_IDENTIFIER, + 'id' => 'wpseo-seo-focus-keyword', + 'title' => __( 'Focus keyphrase: ', 'wordpress-seo' ) . '' . $focus_keyword . '', + 'meta' => [ 'tabindex' => '0' ], + ] + ); + $wp_admin_bar->add_menu( + [ + 'parent' => self::MENU_IDENTIFIER, + 'id' => 'wpseo-seo-score', + 'title' => __( 'SEO score', 'wordpress-seo' ) . ': ' . $this->score_icon_helper->for_seo( $indexable, 'adminbar-sub-menu-score' ) + ->present(), + 'meta' => [ 'tabindex' => '0' ], + ] + ); + } + + if ( $is_readability_enabled ) { + $wp_admin_bar->add_menu( + [ + 'parent' => self::MENU_IDENTIFIER, + 'id' => 'wpseo-readability-score', + 'title' => __( 'Readability', 'wordpress-seo' ) . ': ' . $this->score_icon_helper->for_readability( $indexable->readability_score, 'adminbar-sub-menu-score' ) + ->present(), + 'meta' => [ 'tabindex' => '0' ], + ] + ); + } + + if ( ! $this->product_helper->is_premium() ) { + $wp_admin_bar->add_menu( + [ + 'parent' => self::MENU_IDENTIFIER, + 'id' => 'wpseo-frontend-inspector', + 'href' => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-frontend-inspector' ), + 'title' => __( 'Front-end SEO inspector', 'wordpress-seo' ) . new Premium_Badge_Presenter( 'wpseo-frontend-inspector-badge' ), + 'meta' => [ + 'tabindex' => '0', + 'target' => '_blank', + ], + ] + ); + } + } + $this->add_analysis_submenu( $wp_admin_bar ); + $this->add_seo_tools_submenu( $wp_admin_bar ); + $this->add_how_to_submenu( $wp_admin_bar ); + $this->add_get_help_submenu( $wp_admin_bar ); + } + + if ( ! is_admin() || is_blog_admin() ) { + $this->add_settings_submenu( $wp_admin_bar ); + } + elseif ( is_network_admin() ) { + $this->add_network_settings_submenu( $wp_admin_bar ); + } + + if ( ! $this->product_helper->is_premium() ) { + $this->add_premium_link( $wp_admin_bar ); + } + } + + /** + * Enqueues admin bar assets. + * + * @return void + */ + public function enqueue_assets() { + if ( ! is_admin_bar_showing() ) { + return; + } + + // If the current user can't write posts, this is all of no use, so let's not output an admin menu. + if ( ! current_user_can( 'edit_posts' ) ) { + return; + } + + $this->asset_manager->register_assets(); + $this->asset_manager->enqueue_style( 'adminbar' ); + } + + /** + * Registers the hooks. + * + * @return void + */ + public function register_hooks() { + if ( ! $this->meets_requirements() ) { + return; + } + + add_action( 'admin_bar_menu', [ $this, 'add_menu' ], 95 ); + + add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_assets' ] ); + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] ); + } + + /** + * Checks whether the requirements to use this class are met. + * + * @return bool True if requirements are met, false otherwise. + */ + public function meets_requirements() { + if ( is_network_admin() ) { + return WPSEO_Utils::is_plugin_network_active(); + } + + if ( WPSEO_Options::get( 'enable_admin_bar_menu' ) !== true ) { + return false; + } + + return ! is_admin() || is_blog_admin(); + } + + /** + * Adds the admin bar root menu. + * + * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to. + * + * @return void + */ + protected function add_root_menu( WP_Admin_Bar $wp_admin_bar ) { + $title = $this->get_title(); + + $score = ''; + $settings_url = ''; + $counter = ''; + $notification_popup = ''; + + $post = $this->get_singular_post(); + if ( $post ) { + $score = $this->get_post_score( $post ); + } + + $term = $this->get_singular_term(); + if ( $term ) { + $score = $this->get_term_score( $term ); + } + + $can_manage_options = $this->can_manage_options(); + + if ( $can_manage_options ) { + $settings_url = $this->get_settings_page_url(); + } + + if ( empty( $score ) && ! is_network_admin() && $can_manage_options ) { + $counter = $this->get_notification_counter(); + $notification_popup = $this->get_notification_popup(); + } + + $admin_bar_menu_args = [ + 'id' => self::MENU_IDENTIFIER, + 'title' => $title . $score . $counter . $notification_popup, + 'href' => $settings_url, + 'meta' => [ 'tabindex' => ! empty( $settings_url ) ? false : '0' ], + ]; + $wp_admin_bar->add_menu( $admin_bar_menu_args ); + + if ( ! empty( $counter ) ) { + $admin_bar_menu_args = [ + 'parent' => self::MENU_IDENTIFIER, + 'id' => 'wpseo-notifications', + 'title' => __( 'Notifications', 'wordpress-seo' ) . $counter, + 'href' => $settings_url, + 'meta' => [ 'tabindex' => ! empty( $settings_url ) ? false : '0' ], + ]; + $wp_admin_bar->add_menu( $admin_bar_menu_args ); + } + } + + /** + * Adds the admin bar analysis submenu. + * + * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to. + * + * @return void + */ + protected function add_analysis_submenu( WP_Admin_Bar $wp_admin_bar ) { + try { + $url = YoastSEO()->meta->for_current_page()->canonical; + } catch ( Exception $e ) { + // This is not the type of error we can handle here. + return; + } + + if ( ! $url ) { + return; + } + + $menu_args = [ + 'parent' => self::MENU_IDENTIFIER, + 'id' => self::ANALYSIS_SUBMENU_IDENTIFIER, + 'title' => __( 'Analyze this page', 'wordpress-seo' ), + 'meta' => [ 'tabindex' => '0' ], + ]; + $wp_admin_bar->add_menu( $menu_args ); + + $encoded_url = rawurlencode( $url ); + $submenu_items = [ + [ + 'id' => 'wpseo-inlinks', + 'title' => __( 'Check links to this URL', 'wordpress-seo' ), + 'href' => 'https://search.google.com/search-console/links/drilldown?resource_id=' . rawurlencode( get_option( 'siteurl' ) ) . '&type=EXTERNAL&target=' . $encoded_url . '&domain=', + ], + [ + 'id' => 'wpseo-structureddata', + 'title' => __( 'Google Rich Results Test', 'wordpress-seo' ), + 'href' => 'https://search.google.com/test/rich-results?url=' . $encoded_url, + ], + [ + 'id' => 'wpseo-facebookdebug', + 'title' => __( 'Facebook Debugger', 'wordpress-seo' ), + 'href' => '//developers.facebook.com/tools/debug/?q=' . $encoded_url, + ], + [ + 'id' => 'wpseo-pagespeed', + 'title' => __( 'Google Page Speed Test', 'wordpress-seo' ), + 'href' => '//developers.google.com/speed/pagespeed/insights/?url=' . $encoded_url, + ], + ]; + + $this->add_submenu_items( $submenu_items, $wp_admin_bar, self::ANALYSIS_SUBMENU_IDENTIFIER ); + } + + /** + * Adds the admin bar tools submenu. + * + * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to. + * + * @return void + */ + protected function add_seo_tools_submenu( WP_Admin_Bar $wp_admin_bar ) { + $menu_args = [ + 'parent' => self::MENU_IDENTIFIER, + 'id' => 'wpseo-sub-tools', + 'title' => __( 'SEO Tools', 'wordpress-seo' ), + 'meta' => [ 'tabindex' => '0' ], + ]; + $wp_admin_bar->add_menu( $menu_args ); + + $submenu_items = [ + [ + 'id' => 'wpseo-semrush', + 'title' => 'Semrush', + 'href' => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-semrush' ), + ], + [ + 'id' => 'wpseo-wincher', + 'title' => 'Wincher', + 'href' => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-wincher' ), + ], + [ + 'id' => 'wpseo-google-trends', + 'title' => 'Google trends', + 'href' => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-gtrends' ), + ], + ]; + + $this->add_submenu_items( $submenu_items, $wp_admin_bar, 'wpseo-sub-tools' ); + } + + /** + * Adds the admin bar How To submenu. + * + * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to. + * + * @return void + */ + protected function add_how_to_submenu( WP_Admin_Bar $wp_admin_bar ) { + $menu_args = [ + 'parent' => self::MENU_IDENTIFIER, + 'id' => 'wpseo-sub-howto', + 'title' => __( 'How to', 'wordpress-seo' ), + 'meta' => [ 'tabindex' => '0' ], + ]; + $wp_admin_bar->add_menu( $menu_args ); + + $submenu_items = [ + [ + 'id' => 'wpseo-learn-seo', + 'title' => __( 'Learn more SEO', 'wordpress-seo' ), + 'href' => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-learn-more-seo' ), + ], + [ + 'id' => 'wpseo-improve-blogpost', + 'title' => __( 'Improve your blog post', 'wordpress-seo' ), + 'href' => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-improve-blog-post' ), + ], + [ + 'id' => 'wpseo-write-better-content', + 'title' => __( 'Write better content', 'wordpress-seo' ), + 'href' => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-write-better' ), + ], + ]; + + $this->add_submenu_items( $submenu_items, $wp_admin_bar, 'wpseo-sub-howto' ); + } + + /** + * Adds the admin bar How To submenu. + * + * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to. + * + * @return void + */ + protected function add_get_help_submenu( WP_Admin_Bar $wp_admin_bar ) { + $menu_args = [ + 'parent' => self::MENU_IDENTIFIER, + 'id' => 'wpseo-sub-get-help', + 'title' => __( 'Help', 'wordpress-seo' ), + 'meta' => [ 'tabindex' => '0' ], + ]; + + if ( current_user_can( Support_Integration::CAPABILITY ) ) { + $menu_args['href'] = admin_url( 'admin.php?page=' . Support_Integration::PAGE ); + $wp_admin_bar->add_menu( $menu_args ); + + return; + } + $wp_admin_bar->add_menu( $menu_args ); + + $submenu_items = [ + [ + 'id' => 'wpseo-yoast-help', + 'title' => __( 'Yoast.com help section', 'wordpress-seo' ), + 'href' => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-yoast-help' ), + ], + [ + 'id' => 'wpseo-premium-support', + 'title' => __( 'Yoast Premium support', 'wordpress-seo' ), + 'href' => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-premium-support' ), + ], + [ + 'id' => 'wpseo-wp-support-forums', + 'title' => __( 'WordPress.org support forums', 'wordpress-seo' ), + 'href' => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-wp-support-forums' ), + ], + [ + 'id' => 'wpseo-learn-seo-2', + 'title' => __( 'Learn more SEO', 'wordpress-seo' ), + 'href' => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-learn-more-seo-help' ), + ], + ]; + + $this->add_submenu_items( $submenu_items, $wp_admin_bar, 'wpseo-sub-get-help' ); + } + + /** + * Adds the admin bar How To submenu. + * + * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to. + * + * @return void + */ + protected function add_premium_link( WP_Admin_Bar $wp_admin_bar ) { + $sale_percentage = ''; + if ( YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2023-promotion' ) ) { + $sale_percentage = sprintf( + '%1$s', + esc_html__( '-30%', 'wordpress-seo' ) + ); + } + $wp_admin_bar->add_menu( + [ + 'parent' => self::MENU_IDENTIFIER, + 'id' => 'wpseo-get-premium', + // Circumvent an issue in the WP admin bar API in order to pass `data` attributes. See https://core.trac.wordpress.org/ticket/38636. + 'title' => sprintf( + '%2$s » %3$s', + esc_url( $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-get-premium' ) ), + esc_html__( 'Get Yoast SEO Premium', 'wordpress-seo' ), + $sale_percentage + ), + 'meta' => [ + 'tabindex' => '0', + ], + ] + ); + } + + /** + * Adds the admin bar settings submenu. + * + * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to. + * + * @return void + */ + protected function add_settings_submenu( WP_Admin_Bar $wp_admin_bar ) { + if ( ! $this->can_manage_options() ) { + return; + } + + $admin_menu = new WPSEO_Admin_Menu( new WPSEO_Menu() ); + $submenu_pages = $admin_menu->get_submenu_pages(); + + $menu_args = [ + 'parent' => self::MENU_IDENTIFIER, + 'id' => self::SETTINGS_SUBMENU_IDENTIFIER, + 'title' => __( 'SEO Settings', 'wordpress-seo' ), + 'meta' => [ 'tabindex' => '0' ], + ]; + $wp_admin_bar->add_menu( $menu_args ); + + foreach ( $submenu_pages as $submenu_page ) { + if ( ! current_user_can( $submenu_page[3] ) ) { + continue; + } + + // Don't add the Google Search Console menu item. + if ( $submenu_page[4] === 'wpseo_search_console' ) { + continue; + } + + $id = 'wpseo-' . str_replace( '_', '-', str_replace( 'wpseo_', '', $submenu_page[4] ) ); + if ( $id === 'wpseo-dashboard' ) { + $id = 'wpseo-general'; + } + + $menu_args = [ + 'parent' => self::SETTINGS_SUBMENU_IDENTIFIER, + 'id' => $id, + 'title' => $submenu_page[2], + 'href' => admin_url( 'admin.php?page=' . rawurlencode( $submenu_page[4] ) ), + ]; + $wp_admin_bar->add_menu( $menu_args ); + } + } + + /** + * Adds the admin bar network settings submenu. + * + * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to. + * + * @return void + */ + protected function add_network_settings_submenu( WP_Admin_Bar $wp_admin_bar ) { + if ( ! $this->can_manage_options() ) { + return; + } + + $network_admin_menu = new WPSEO_Network_Admin_Menu( new WPSEO_Menu() ); + $submenu_pages = $network_admin_menu->get_submenu_pages(); + + $menu_args = [ + 'parent' => self::MENU_IDENTIFIER, + 'id' => self::NETWORK_SETTINGS_SUBMENU_IDENTIFIER, + 'title' => __( 'SEO Settings', 'wordpress-seo' ), + 'meta' => [ 'tabindex' => '0' ], + ]; + $wp_admin_bar->add_menu( $menu_args ); + + foreach ( $submenu_pages as $submenu_page ) { + if ( ! current_user_can( $submenu_page[3] ) ) { + continue; + } + + $id = 'wpseo-' . str_replace( '_', '-', str_replace( 'wpseo_', '', $submenu_page[4] ) ); + if ( $id === 'wpseo-dashboard' ) { + $id = 'wpseo-general'; + } + + $menu_args = [ + 'parent' => self::NETWORK_SETTINGS_SUBMENU_IDENTIFIER, + 'id' => $id, + 'title' => $submenu_page[2], + 'href' => network_admin_url( 'admin.php?page=' . rawurlencode( $submenu_page[4] ) ), + ]; + $wp_admin_bar->add_menu( $menu_args ); + } + } + + /** + * Gets the menu title markup. + * + * @return string Admin bar title markup. + */ + protected function get_title() { + return ''; + } + + /** + * Gets the current post if in a singular post context. + * + * @global string $pagenow Current page identifier. + * @global WP_Post|null $post Current post object, or null if none available. + * + * @return WP_Post|null Post object, or null if not in singular context. + */ + protected function get_singular_post() { + global $pagenow, $post; + + if ( ! is_singular() && ( ! is_blog_admin() || ! WPSEO_Metabox::is_post_edit( $pagenow ) ) ) { + return null; + } + + if ( ! isset( $post ) || ! is_object( $post ) || ! $post instanceof WP_Post ) { + return null; + } + + return $post; + } + + /** + * Gets the focus keyword for a given post. + * + * @param WP_Post $post Post object to get its focus keyword. + * + * @return string Focus keyword, or empty string if none available. + */ + protected function get_post_focus_keyword( $post ) { + if ( ! is_object( $post ) || ! property_exists( $post, 'ID' ) ) { + return ''; + } + + /** + * Filter: 'wpseo_use_page_analysis' Determines if the analysis should be enabled. + * + * @param bool $enabled Determines if the analysis should be enabled. + */ + if ( apply_filters( 'wpseo_use_page_analysis', true ) !== true ) { + return ''; + } + + return WPSEO_Meta::get_value( 'focuskw', $post->ID ); + } + + /** + * Gets the score for a given post. + * + * @param WP_Post $post Post object to get its score. + * + * @return string Score markup, or empty string if none available. + */ + protected function get_post_score( $post ) { + if ( ! is_object( $post ) || ! property_exists( $post, 'ID' ) ) { + return ''; + } + + if ( apply_filters( 'wpseo_use_page_analysis', true ) !== true ) { + return ''; + } + + return $this->get_score_icon(); + } + + /** + * Gets the current term if in a singular term context. + * + * @global string $pagenow Current page identifier. + * @global WP_Query $wp_query Current query object. + * @global WP_Term|null $tag Current term object, or null if none available. + * + * @return WP_Term|null Term object, or null if not in singular context. + */ + protected function get_singular_term() { + global $pagenow, $wp_query, $tag; + + if ( is_category() || is_tag() || is_tax() ) { + return $wp_query->get_queried_object(); + } + + if ( WPSEO_Taxonomy::is_term_edit( $pagenow ) && ! WPSEO_Taxonomy::is_term_overview( $pagenow ) && isset( $tag ) && is_object( $tag ) && ! is_wp_error( $tag ) ) { + return get_term( $tag->term_id ); + } + + return null; + } + + /** + * Gets the score for a given term. + * + * @param WP_Term $term Term object to get its score. + * + * @return string Score markup, or empty string if none available. + */ + protected function get_term_score( $term ) { + if ( ! is_object( $term ) || ! property_exists( $term, 'term_id' ) || ! property_exists( $term, 'taxonomy' ) ) { + return ''; + } + + return $this->get_score_icon(); + } + + /** + * Create the score icon. + * + * @return string The score icon, or empty string. + */ + protected function get_score_icon() { + $is_seo_enabled = $this->get_is_seo_enabled(); + $is_readability_enabled = $this->get_is_readability_enabled(); + + $indexable = $this->get_current_indexable(); + + if ( $is_seo_enabled ) { + return $this->score_icon_helper->for_seo( $indexable, 'adminbar-seo-score' )->present(); + } + + if ( $is_readability_enabled ) { + return $this->score_icon_helper->for_readability( $indexable->readability_score, 'adminbar-seo-score' ) + ->present(); + } + + return ''; + } + + /** + * Gets the URL to the main admin settings page. + * + * @return string Admin settings page URL. + */ + protected function get_settings_page_url() { + return self_admin_url( 'admin.php?page=' . WPSEO_Admin::PAGE_IDENTIFIER ); + } + + /** + * Gets the notification counter if in a valid context. + * + * @return string Notification counter markup, or empty string if not available. + */ + protected function get_notification_counter() { + $notification_center = Yoast_Notification_Center::get(); + $notification_count = $notification_center->get_notification_count(); + + if ( ! $notification_count ) { + return ''; + } + + /* translators: Hidden accessibility text; %s: number of notifications. */ + $counter_screen_reader_text = sprintf( _n( '%s notification', '%s notifications', $notification_count, 'wordpress-seo' ), number_format_i18n( $notification_count ) ); + + return sprintf( '
    %s
    ', $notification_count, $counter_screen_reader_text ); + } + + /** + * Gets the notification popup if in a valid context. + * + * @return string Notification popup markup, or empty string if not available. + */ + protected function get_notification_popup() { + $notification_center = Yoast_Notification_Center::get(); + $new_notifications = $notification_center->get_new_notifications(); + $new_notifications_count = count( $new_notifications ); + + if ( ! $new_notifications_count ) { + return ''; + } + + $notification = sprintf( + _n( + 'There is a new notification.', + 'There are new notifications.', + $new_notifications_count, + 'wordpress-seo' + ), + $new_notifications_count + ); + + return '
    ' . $notification . '
    '; + } + + /** + * Checks whether the current user can manage options in the current context. + * + * @return bool True if capabilities are sufficient, false otherwise. + */ + protected function can_manage_options() { + return ( is_network_admin() && current_user_can( 'wpseo_manage_network_options' ) ) + || ( ! is_network_admin() && WPSEO_Capability_Utils::current_user_can( 'wpseo_manage_options' ) ); + } + + /** + * Add submenu items to a menu item. + * + * @param array $submenu_items Submenu items array. + * @param WP_Admin_Bar $wp_admin_bar Admin bar object. + * @param string $parent_id Parent menu item ID. + * + * @return void + */ + protected function add_submenu_items( array $submenu_items, WP_Admin_Bar $wp_admin_bar, $parent_id ) { + foreach ( $submenu_items as $menu_item ) { + $menu_args = [ + 'parent' => $parent_id, + 'id' => $menu_item['id'], + 'title' => $menu_item['title'], + 'href' => $menu_item['href'], + 'meta' => [ 'target' => '_blank' ], + ]; + $wp_admin_bar->add_menu( $menu_args ); + } + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/class-wpseo-content-images.php b/wp-content/plugins/wordpress-seo/inc/class-wpseo-content-images.php new file mode 100644 index 00000000..6218c004 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/class-wpseo-content-images.php @@ -0,0 +1,112 @@ +get_images_from_content( $this->get_post_content( $post_id, $post ) ); + } + + /** + * Grabs the images from the content. + * + * @param string $content The post content string. + * + * @return array An array of image URLs. + */ + public function get_images_from_content( $content ) { + if ( ! is_string( $content ) ) { + return []; + } + + $content_images = $this->get_img_tags_from_content( $content ); + $images = array_map( [ $this, 'get_img_tag_source' ], $content_images ); + $images = array_filter( $images ); + $images = array_unique( $images ); + $images = array_values( $images ); // Reset the array keys. + + return $images; + } + + /** + * Gets the image tags from a given content string. + * + * @param string $content The content to search for image tags. + * + * @return array An array of `` tags. + */ + private function get_img_tags_from_content( $content ) { + if ( strpos( $content, ']+>`', $content, $matches ); + if ( isset( $matches[0] ) ) { + return $matches[0]; + } + + return []; + } + + /** + * Retrieves the image URL from an image tag. + * + * @param string $image Image HTML element. + * + * @return string|bool The image URL on success, false on failure. + */ + private function get_img_tag_source( $image ) { + preg_match( '`src=(["\'])(.*?)\1`', $image, $matches ); + if ( isset( $matches[2] ) && filter_var( $matches[2], FILTER_VALIDATE_URL ) ) { + return $matches[2]; + } + return false; + } + + /** + * Retrieves the post content we want to work with. + * + * @param int $post_id The post ID. + * @param WP_Post|array|null $post The post. + * + * @return string The content of the supplied post. + */ + private function get_post_content( $post_id, $post ) { + if ( $post === null ) { + $post = get_post( $post_id ); + } + + if ( $post === null ) { + return ''; + } + + /** + * Filter: 'wpseo_pre_analysis_post_content' - Allow filtering the content before analysis. + * + * @param string $post_content The Post content string. + * @param WP_Post $post The current post. + */ + $content = apply_filters( 'wpseo_pre_analysis_post_content', $post->post_content, $post ); + + if ( ! is_string( $content ) ) { + $content = ''; + } + + return $content; + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/class-wpseo-custom-fields.php b/wp-content/plugins/wordpress-seo/inc/class-wpseo-custom-fields.php new file mode 100644 index 00000000..07771ccb --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/class-wpseo-custom-fields.php @@ -0,0 +1,75 @@ +postmeta + WHERE meta_key NOT BETWEEN '_' AND '_z' AND SUBSTRING(meta_key, 1, 1) != '_' + LIMIT %d"; + $fields = $wpdb->get_col( $wpdb->prepare( $sql, $limit ) ); + + /** + * Filters the custom fields that are auto-completed and replaced as replacement variables + * in the meta box and sidebar. + * + * @param string[] $fields The custom field names. + */ + $fields = apply_filters( 'wpseo_replacement_variables_custom_fields', $fields ); + + if ( is_array( $fields ) ) { + self::$custom_fields = array_map( [ 'WPSEO_Custom_Fields', 'add_custom_field_prefix' ], $fields ); + } + + return self::$custom_fields; + } + + /** + * Adds the cf_ prefix to a field. + * + * @param string $field The field to prefix. + * + * @return string The prefixed field. + */ + private static function add_custom_field_prefix( $field ) { + return 'cf_' . $field; + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/class-wpseo-custom-taxonomies.php b/wp-content/plugins/wordpress-seo/inc/class-wpseo-custom-taxonomies.php new file mode 100644 index 00000000..40b8ba23 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/class-wpseo-custom-taxonomies.php @@ -0,0 +1,72 @@ + true, + '_builtin' => false, + ]; + $custom_taxonomies = get_taxonomies( $args, 'names', 'and' ); + + if ( is_array( $custom_taxonomies ) ) { + foreach ( $custom_taxonomies as $custom_taxonomy ) { + array_push( + self::$custom_taxonomies, + self::add_custom_taxonomies_prefix( $custom_taxonomy ), + self::add_custom_taxonomies_description_prefix( $custom_taxonomy ) + ); + } + } + + return self::$custom_taxonomies; + } + + /** + * Adds the ct_ prefix to a taxonomy. + * + * @param string $taxonomy The taxonomy to prefix. + * + * @return string The prefixed taxonomy. + */ + private static function add_custom_taxonomies_prefix( $taxonomy ) { + return 'ct_' . $taxonomy; + } + + /** + * Adds the ct_desc_ prefix to a taxonomy. + * + * @param string $taxonomy The taxonomy to prefix. + * + * @return string The prefixed taxonomy. + */ + private static function add_custom_taxonomies_description_prefix( $taxonomy ) { + return 'ct_desc_' . $taxonomy; + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/class-wpseo-image-utils.php b/wp-content/plugins/wordpress-seo/inc/class-wpseo-image-utils.php new file mode 100644 index 00000000..4b606130 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/class-wpseo-image-utils.php @@ -0,0 +1,537 @@ + $sizes The array of image sizes to loop through. + */ + return apply_filters( 'wpseo_image_sizes', [ 'full', 'large', 'medium_large' ] ); + } + + /** + * Grabs an image alt text. + * + * @param int $attachment_id The attachment ID. + * + * @return string The image alt text. + */ + public static function get_alt_tag( $attachment_id ) { + return (string) get_post_meta( $attachment_id, '_wp_attachment_image_alt', true ); + } + + /** + * Checks whether an img sizes up to the parameters. + * + * @param array $dimensions The image values. + * @param array $usable_dimensions The parameters to check against. + * + * @return bool True if the image has usable measurements, false if not. + */ + private static function has_usable_dimensions( $dimensions, $usable_dimensions ) { + foreach ( [ 'width', 'height' ] as $param ) { + $minimum = $usable_dimensions[ 'min_' . $param ]; + $maximum = $usable_dimensions[ 'max_' . $param ]; + + $current = $dimensions[ $param ]; + if ( ( $current < $minimum ) || ( $current > $maximum ) ) { + return false; + } + } + + return true; + } + + /** + * Gets the post's first usable content image. Null if none is available. + * + * @param int|null $post_id The post id. + * + * @return string|null The image URL. + */ + public static function get_first_usable_content_image_for_post( $post_id = null ) { + $post = get_post( $post_id ); + + // We know get_post() returns the post or null. + if ( ! $post ) { + return null; + } + + $image_finder = new WPSEO_Content_Images(); + $images = $image_finder->get_images( $post->ID, $post ); + + return self::get_first_image( $images ); + } + + /** + * Gets the term's first usable content image. Null if none is available. + * + * @param int $term_id The term id. + * + * @return string|null The image URL. + */ + public static function get_first_content_image_for_term( $term_id ) { + $term_description = term_description( $term_id ); + + // We know term_description() returns a string which may be empty. + if ( $term_description === '' ) { + return null; + } + + $image_finder = new WPSEO_Content_Images(); + $images = $image_finder->get_images_from_content( $term_description ); + + return self::get_first_image( $images ); + } + + /** + * Retrieves an attachment ID for an image uploaded in the settings. + * + * Due to self::get_attachment_by_url returning 0 instead of false. + * 0 is also a possibility when no ID is available. + * + * @param string $setting The setting the image is stored in. + * + * @return int|bool The attachment id, or false or 0 if no ID is available. + */ + public static function get_attachment_id_from_settings( $setting ) { + $image_id = WPSEO_Options::get( $setting . '_id', false ); + if ( $image_id ) { + return $image_id; + } + + $image = WPSEO_Options::get( $setting, false ); + if ( $image ) { + // There is not an option to put a URL in an image field in the settings anymore, only to upload it through the media manager. + // This means an attachment always exists, so doing this is only needed once. + $image_id = self::get_attachment_by_url( $image ); + } + + // Only store a new ID if it is not 0, to prevent an update loop. + if ( $image_id ) { + WPSEO_Options::set( $setting . '_id', $image_id ); + } + + return $image_id; + } + + /** + * Retrieves the first possible image url from an array of images. + * + * @param array $images The array to extract image url from. + * + * @return string|null The extracted image url when found, null when not found. + */ + protected static function get_first_image( $images ) { + if ( ! is_array( $images ) ) { + return null; + } + + $images = array_filter( $images ); + if ( empty( $images ) ) { + return null; + } + + return reset( $images ); + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/class-wpseo-installation.php b/wp-content/plugins/wordpress-seo/inc/class-wpseo-installation.php new file mode 100644 index 00000000..71f6a1a9 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/class-wpseo-installation.php @@ -0,0 +1,48 @@ +is_first_install(); + + if ( $is_first_install && WPSEO_Utils::is_api_available() ) { + add_action( 'wpseo_activate', [ $this, 'set_first_install_options' ] ); + } + } + + /** + * When the option doesn't exist, it should be a new install. + * + * @return bool + */ + private function is_first_install() { + return ( get_option( 'wpseo' ) === false ); + } + + /** + * Sets the options on first install for showing the installation notice and disabling of the settings pages. + * + * @return void + */ + public function set_first_install_options() { + $options = get_option( 'wpseo' ); + + $options['show_onboarding_notice'] = true; + $options['first_activated_on'] = time(); + + update_option( 'wpseo', $options ); + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/class-wpseo-meta.php b/wp-content/plugins/wordpress-seo/inc/class-wpseo-meta.php new file mode 100644 index 00000000..65e2cd9b --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/class-wpseo-meta.php @@ -0,0 +1,1090 @@ + (string) field type. i.e. text / textarea / checkbox / + * radio / select / multiselect / upload etc. + * (required) 'title' => (string) table row title. + * (recommended) 'default_value' => (string|array) default value for the field. + * IMPORTANT: + * - if the field has options, the default has to be the + * key of one of the options. + * - if the field is a text field, the default **has** to be + * an empty string as otherwise the user can't save + * an empty value/delete the meta value. + * - if the field is a checkbox, the only valid values + * are 'on' or 'off'. + * (semi-required) 'options' => (array) options for used with (multi-)select and radio + * fields, required if that's the field type. + * key = (string) value which will be saved to db. + * value = (string) text label for the option. + * (optional) 'autocomplete' => (bool) whether autocomplete is on for text fields, + * defaults to true. + * (optional) 'class' => (string) classname(s) to add to the actual tag. + * (optional) 'description' => (string) description to show underneath the field. + * (optional) 'expl' => (string) label for a checkbox. + * (optional) 'help' => (string) help text to show on mouse over ? image. + * (optional) 'rows' => (int) number of rows for a textarea, defaults to 3. + * (optional) 'placeholder' => (string) Currently only used by add-on plugins. + * (optional) 'serialized' => (bool) whether the value is expected to be serialized, + * i.e. an array or object, defaults to false. + * Currently only used by add-on plugins. + */ + public static $meta_fields = [ + 'general' => [ + 'focuskw' => [ + 'type' => 'hidden', + 'title' => '', + ], + 'title' => [ + 'type' => 'hidden', + 'title' => '', // Translation added later. + 'default_value' => '', + 'description' => '', // Translation added later. + 'help' => '', // Translation added later. + ], + 'metadesc' => [ + 'type' => 'hidden', + 'title' => '', // Translation added later. + 'default_value' => '', + 'class' => 'metadesc', + 'rows' => 2, + 'description' => '', // Translation added later. + 'help' => '', // Translation added later. + ], + 'linkdex' => [ + 'type' => 'hidden', + 'title' => 'linkdex', + 'default_value' => '0', + 'description' => '', + ], + 'content_score' => [ + 'type' => 'hidden', + 'title' => 'content_score', + 'default_value' => '0', + 'description' => '', + ], + 'inclusive_language_score' => [ + 'type' => 'hidden', + 'title' => 'inclusive_language_score', + 'default_value' => '0', + 'description' => '', + ], + 'is_cornerstone' => [ + 'type' => 'hidden', + 'title' => 'is_cornerstone', + 'default_value' => 'false', + 'description' => '', + ], + ], + 'advanced' => [ + 'meta-robots-noindex' => [ + 'type' => 'hidden', + 'title' => '', // Translation added later. + 'default_value' => '0', // = post-type default. + 'options' => [ + '0' => '', // Post type default - translation added later. + '2' => '', // Index - translation added later. + '1' => '', // No-index - translation added later. + ], + ], + 'meta-robots-nofollow' => [ + 'type' => 'hidden', + 'title' => '', // Translation added later. + 'default_value' => '0', // = follow. + 'options' => [ + '0' => '', // Follow - translation added later. + '1' => '', // No-follow - translation added later. + ], + ], + 'meta-robots-adv' => [ + 'type' => 'hidden', + 'title' => '', // Translation added later. + 'default_value' => '', + 'description' => '', // Translation added later. + 'options' => [ + 'noimageindex' => '', // Translation added later. + 'noarchive' => '', // Translation added later. + 'nosnippet' => '', // Translation added later. + ], + ], + 'bctitle' => [ + 'type' => 'hidden', + 'title' => '', // Translation added later. + 'default_value' => '', + 'description' => '', // Translation added later. + ], + 'canonical' => [ + 'type' => 'hidden', + 'title' => '', // Translation added later. + 'default_value' => '', + 'description' => '', // Translation added later. + ], + 'redirect' => [ + 'type' => 'url', + 'title' => '', // Translation added later. + 'default_value' => '', + 'description' => '', // Translation added later. + ], + ], + 'social' => [], + 'schema' => [ + 'schema_page_type' => [ + 'type' => 'hidden', + 'title' => '', + 'options' => Schema_Types::PAGE_TYPES, + ], + 'schema_article_type' => [ + 'type' => 'hidden', + 'title' => '', + 'hide_on_pages' => true, + 'options' => Schema_Types::ARTICLE_TYPES, + ], + ], + /* Fields we should validate & save, but not show on any form. */ + 'non_form' => [ + 'linkdex' => [ + 'type' => null, + 'default_value' => '0', + ], + 'zapier_trigger_sent' => [ + 'type' => null, + 'default_value' => '0', + ], + ], + ]; + + /** + * Helper property - reverse index of the definition array. + * + * Format: [full meta key including prefix] => array + * ['subset'] => (string) primary index + * ['key'] => (string) internal key + * + * @var array + */ + public static $fields_index = []; + + /** + * Helper property - array containing only the defaults in the format: + * [full meta key including prefix] => (string) default value + * + * @var array + */ + public static $defaults = []; + + /** + * Helper property to define the social network meta field definitions - networks. + * + * @var array + */ + private static $social_networks = [ + 'opengraph' => 'opengraph', + 'twitter' => 'twitter', + ]; + + /** + * Helper property to define the social network meta field definitions - fields and their type. + * + * @var array + */ + private static $social_fields = [ + 'title' => 'hidden', + 'description' => 'hidden', + 'image' => 'hidden', + 'image-id' => 'hidden', + ]; + + /** + * Register our actions and filters. + * + * @return void + */ + public static function init() { + foreach ( self::$social_networks as $option => $network ) { + if ( WPSEO_Options::get( $option, false ) === true ) { + foreach ( self::$social_fields as $box => $type ) { + self::$meta_fields['social'][ $network . '-' . $box ] = [ + 'type' => $type, + 'title' => '', // Translation added later. + 'default_value' => '', + 'description' => '', // Translation added later. + ]; + } + } + } + unset( $option, $network, $box, $type ); + + /** + * Allow add-on plugins to register their meta fields for management by this class. + * Calls to add_filter() must be made before plugins_loaded prio 14. + */ + $extra_fields = apply_filters( 'add_extra_wpseo_meta_fields', [] ); + if ( is_array( $extra_fields ) ) { + self::$meta_fields = self::array_merge_recursive_distinct( $extra_fields, self::$meta_fields ); + } + unset( $extra_fields ); + + foreach ( self::$meta_fields as $subset => $field_group ) { + foreach ( $field_group as $key => $field_def ) { + + register_meta( + 'post', + self::$meta_prefix . $key, + [ 'sanitize_callback' => [ self::class, 'sanitize_post_meta' ] ] + ); + + // Set the $fields_index property for efficiency. + self::$fields_index[ self::$meta_prefix . $key ] = [ + 'subset' => $subset, + 'key' => $key, + ]; + + // Set the $defaults property for efficiency. + if ( isset( $field_def['default_value'] ) ) { + self::$defaults[ self::$meta_prefix . $key ] = $field_def['default_value']; + } + else { + // Meta will always be a string, so let's make the meta meta default also a string. + self::$defaults[ self::$meta_prefix . $key ] = ''; + } + } + } + unset( $subset, $field_group, $key, $field_def ); + + self::filter_schema_article_types(); + + add_filter( 'update_post_metadata', [ self::class, 'remove_meta_if_default' ], 10, 5 ); + add_filter( 'add_post_metadata', [ self::class, 'dont_save_meta_if_default' ], 10, 4 ); + } + + /** + * Retrieve the meta box form field definitions for the given tab and post type. + * + * @param string $tab Tab for which to retrieve the field definitions. + * @param string $post_type Post type of the current post. + * + * @return array Array containing the meta box field definitions. + */ + public static function get_meta_field_defs( $tab, $post_type = 'post' ) { + if ( ! isset( self::$meta_fields[ $tab ] ) ) { + return []; + } + + $field_defs = self::$meta_fields[ $tab ]; + + switch ( $tab ) { + case 'non-form': + // Prevent non-form fields from being passed to forms. + $field_defs = []; + break; + + case 'advanced': + global $post; + + if ( ! WPSEO_Capability_Utils::current_user_can( 'wpseo_edit_advanced_metadata' ) && WPSEO_Options::get( 'disableadvanced_meta' ) ) { + return []; + } + + $post_type = ''; + if ( isset( $post->post_type ) ) { + $post_type = $post->post_type; + } + elseif ( ! isset( $post->post_type ) && isset( $_GET['post_type'] ) ) { + $post_type = sanitize_text_field( $_GET['post_type'] ); + } + + if ( $post_type === '' ) { + return []; + } + + /* Adjust the no-index text strings based on the post type. */ + $post_type_object = get_post_type_object( $post_type ); + + $field_defs['meta-robots-noindex']['title'] = sprintf( $field_defs['meta-robots-noindex']['title'], $post_type_object->labels->singular_name ); + $field_defs['meta-robots-noindex']['options']['0'] = sprintf( $field_defs['meta-robots-noindex']['options']['0'], ( ( WPSEO_Options::get( 'noindex-' . $post_type, false ) === true ) ? $field_defs['meta-robots-noindex']['options']['1'] : $field_defs['meta-robots-noindex']['options']['2'] ), $post_type_object->label ); + $field_defs['meta-robots-nofollow']['title'] = sprintf( $field_defs['meta-robots-nofollow']['title'], $post_type_object->labels->singular_name ); + + /* Don't show the breadcrumb title field if breadcrumbs aren't enabled. */ + if ( WPSEO_Options::get( 'breadcrumbs-enable', false ) !== true && ! current_theme_supports( 'yoast-seo-breadcrumbs' ) ) { + unset( $field_defs['bctitle'] ); + } + + if ( empty( $post->ID ) || ( ! empty( $post->ID ) && self::get_value( 'redirect', $post->ID ) === '' ) ) { + unset( $field_defs['redirect'] ); + } + break; + + case 'schema': + if ( ! WPSEO_Capability_Utils::current_user_can( 'wpseo_edit_advanced_metadata' ) && WPSEO_Options::get( 'disableadvanced_meta' ) ) { + return []; + } + + $field_defs['schema_page_type']['default'] = WPSEO_Options::get( 'schema-page-type-' . $post_type ); + + $article_helper = new Article_Helper(); + if ( $article_helper->is_article_post_type( $post_type ) ) { + $default_schema_article_type = WPSEO_Options::get( 'schema-article-type-' . $post_type ); + + /** This filter is documented in inc/options/class-wpseo-option-titles.php */ + $allowed_article_types = apply_filters( 'wpseo_schema_article_types', Schema_Types::ARTICLE_TYPES ); + + if ( ! array_key_exists( $default_schema_article_type, $allowed_article_types ) ) { + $default_schema_article_type = WPSEO_Options::get_default( 'wpseo_titles', 'schema-article-type-' . $post_type ); + } + $field_defs['schema_article_type']['default'] = $default_schema_article_type; + } + else { + unset( $field_defs['schema_article_type'] ); + } + + break; + } + + /** + * Filter the WPSEO metabox form field definitions for a tab. + * {tab} can be 'general', 'advanced' or 'social'. + * + * @param array $field_defs Metabox form field definitions. + * @param string $post_type Post type of the post the metabox is for, defaults to 'post'. + * + * @return array + */ + return apply_filters( 'wpseo_metabox_entries_' . $tab, $field_defs, $post_type ); + } + + /** + * Validate the post meta values. + * + * @param mixed $meta_value The new value. + * @param string $meta_key The full meta key (including prefix). + * + * @return string Validated meta value. + */ + public static function sanitize_post_meta( $meta_value, $meta_key ) { + $field_def = self::$meta_fields[ self::$fields_index[ $meta_key ]['subset'] ][ self::$fields_index[ $meta_key ]['key'] ]; + $clean = self::$defaults[ $meta_key ]; + + switch ( true ) { + case ( $meta_key === self::$meta_prefix . 'linkdex' ): + $int = WPSEO_Utils::validate_int( $meta_value ); + if ( $int !== false && $int >= 0 ) { + $clean = strval( $int ); // Convert to string to make sure default check works. + } + break; + + case ( $field_def['type'] === 'checkbox' ): + // Only allow value if it's one of the predefined options. + if ( in_array( $meta_value, [ 'on', 'off' ], true ) ) { + $clean = $meta_value; + } + break; + + case ( $field_def['type'] === 'select' || $field_def['type'] === 'radio' ): + // Only allow value if it's one of the predefined options. + if ( isset( $field_def['options'][ $meta_value ] ) ) { + $clean = $meta_value; + } + break; + + case ( $field_def['type'] === 'hidden' && $meta_key === self::$meta_prefix . 'meta-robots-adv' ): + $clean = self::validate_meta_robots_adv( $meta_value ); + break; + + case ( $field_def['type'] === 'url' || $meta_key === self::$meta_prefix . 'canonical' ): + // Validate as url(-part). + $url = WPSEO_Utils::sanitize_url( $meta_value ); + if ( $url !== '' ) { + $clean = $url; + } + break; + + case ( $field_def['type'] === 'upload' && in_array( $meta_key, [ self::$meta_prefix . 'opengraph-image', self::$meta_prefix . 'twitter-image' ], true ) ): + // Validate as url. + $url = WPSEO_Utils::sanitize_url( $meta_value, [ 'http', 'https', 'ftp', 'ftps' ] ); + if ( $url !== '' ) { + $clean = $url; + } + break; + + case ( $field_def['type'] === 'hidden' && $meta_key === self::$meta_prefix . 'is_cornerstone' ): + $clean = $meta_value; + + /* + * This used to be a checkbox, then became a hidden input. + * To make sure the value remains consistent, we cast 'true' to '1'. + */ + if ( $meta_value === 'true' ) { + $clean = '1'; + } + break; + + case ( $field_def['type'] === 'hidden' && isset( $field_def['options'] ) ): + // Only allow value if it's one of the predefined options. + if ( isset( $field_def['options'][ $meta_value ] ) ) { + $clean = $meta_value; + } + break; + + case ( $field_def['type'] === 'textarea' ): + if ( is_string( $meta_value ) ) { + // Remove line breaks and tabs. + // @todo [JRF => Yoast] Verify that line breaks and the likes aren't allowed/recommended in meta header fields. + $meta_value = str_replace( [ "\n", "\r", "\t", ' ' ], ' ', $meta_value ); + $clean = WPSEO_Utils::sanitize_text_field( trim( $meta_value ) ); + } + break; + + case ( $field_def['type'] === 'multiselect' ): + $clean = $meta_value; + break; + + case ( $field_def['type'] === 'text' ): + default: + if ( is_string( $meta_value ) ) { + $clean = WPSEO_Utils::sanitize_text_field( trim( $meta_value ) ); + } + + break; + } + + $clean = apply_filters( 'wpseo_sanitize_post_meta_' . $meta_key, $clean, $meta_value, $field_def, $meta_key ); + + return $clean; + } + + /** + * Validate a meta-robots-adv meta value. + * + * @todo [JRF => Yoast] Verify that this logic for the prioritisation is correct. + * + * @param array|string $meta_value The value to validate. + * + * @return string Clean value. + */ + public static function validate_meta_robots_adv( $meta_value ) { + $clean = self::$meta_fields['advanced']['meta-robots-adv']['default_value']; + $options = self::$meta_fields['advanced']['meta-robots-adv']['options']; + + if ( is_string( $meta_value ) ) { + $meta_value = explode( ',', $meta_value ); + } + + if ( is_array( $meta_value ) && $meta_value !== [] ) { + $meta_value = array_map( 'trim', $meta_value ); + + // Individual selected entries. + $cleaning = []; + foreach ( $meta_value as $value ) { + if ( isset( $options[ $value ] ) ) { + $cleaning[] = $value; + } + } + + if ( $cleaning !== [] ) { + $clean = implode( ',', $cleaning ); + } + unset( $cleaning, $value ); + } + + return $clean; + } + + /** + * Prevent saving of default values and remove potential old value from the database if replaced by a default. + * + * @param bool $check The current status to allow updating metadata for the given type. + * @param int $object_id ID of the current object for which the meta is being updated. + * @param string $meta_key The full meta key (including prefix). + * @param string $meta_value New meta value. + * @param string $prev_value The old meta value. + * + * @return bool|null True = stop saving, null = continue saving. + */ + public static function remove_meta_if_default( $check, $object_id, $meta_key, $meta_value, $prev_value = '' ) { + /* If it's one of our meta fields, check against default. */ + if ( isset( self::$fields_index[ $meta_key ] ) && self::meta_value_is_default( $meta_key, $meta_value ) === true ) { + if ( $prev_value !== '' ) { + delete_post_meta( $object_id, $meta_key, $prev_value ); + } + else { + delete_post_meta( $object_id, $meta_key ); + } + + return true; // Stop saving the value. + } + + return $check; // Go on with the normal execution (update) in meta.php. + } + + /** + * Prevent adding of default values to the database. + * + * @param bool $check The current status to allow adding metadata for the given type. + * @param int $object_id ID of the current object for which the meta is being added. + * @param string $meta_key The full meta key (including prefix). + * @param string $meta_value New meta value. + * + * @return bool|null True = stop saving, null = continue saving. + */ + public static function dont_save_meta_if_default( $check, $object_id, $meta_key, $meta_value ) { + /* If it's one of our meta fields, check against default. */ + if ( isset( self::$fields_index[ $meta_key ] ) && self::meta_value_is_default( $meta_key, $meta_value ) === true ) { + return true; // Stop saving the value. + } + + return $check; // Go on with the normal execution (add) in meta.php. + } + + /** + * Is the given meta value the same as the default value ? + * + * @param string $meta_key The full meta key (including prefix). + * @param mixed $meta_value The value to check. + * + * @return bool + */ + public static function meta_value_is_default( $meta_key, $meta_value ) { + return ( isset( self::$defaults[ $meta_key ] ) && $meta_value === self::$defaults[ $meta_key ] ); + } + + /** + * Get a custom post meta value. + * + * Returns the default value if the meta value has not been set. + * + * {@internal Unfortunately there isn't a filter available to hook into before returning + * the results for get_post_meta(), get_post_custom() and the likes. That + * would have been the preferred solution.}} + * + * @param string $key Internal key of the value to get (without prefix). + * @param int $postid Post ID of the post to get the value for. + * + * @return string All 'normal' values returned from get_post_meta() are strings. + * Objects and arrays are possible, but not used by this plugin + * and therefore discarted (except when the special 'serialized' field def + * value is set to true - only used by add-on plugins for now). + * Will return the default value if no value was found. + * Will return empty string if no default was found (not one of our keys) or + * if the post does not exist. + */ + public static function get_value( $key, $postid = 0 ) { + global $post; + + $postid = absint( $postid ); + if ( $postid === 0 ) { + if ( ( isset( $post ) && is_object( $post ) ) && ( isset( $post->post_status ) && $post->post_status !== 'auto-draft' ) ) { + $postid = $post->ID; + } + else { + return ''; + } + } + + $custom = get_post_custom( $postid ); // Array of strings or empty array. + $table_key = self::$meta_prefix . $key; + + // Populate the field_def using the field_index lookup array. + $field_def = []; + if ( isset( self::$fields_index[ $table_key ] ) ) { + $field_def = self::$meta_fields[ self::$fields_index[ $table_key ]['subset'] ][ self::$fields_index[ $table_key ]['key'] ]; + } + + // Check if we have a custom post meta entry. + if ( isset( $custom[ $table_key ][0] ) ) { + $unserialized = maybe_unserialize( $custom[ $table_key ][0] ); + + // Check if it is already unserialized. + if ( $custom[ $table_key ][0] === $unserialized ) { + return $custom[ $table_key ][0]; + } + + // Check whether we need to unserialize it. + if ( isset( $field_def['serialized'] ) && $field_def['serialized'] === true ) { + // Ok, serialize value expected/allowed. + return $unserialized; + } + } + + // Meta was either not found or found, but object/array while not allowed to be. + if ( isset( self::$defaults[ self::$meta_prefix . $key ] ) ) { + // Update the default value to the current post type. + switch ( $key ) { + case 'schema_page_type': + case 'schema_article_type': + return ''; + } + + return self::$defaults[ self::$meta_prefix . $key ]; + } + + /* + * Shouldn't ever happen, means not one of our keys as there will always be a default available + * for all our keys. + */ + return ''; + } + + /** + * Update a meta value for a post. + * + * @param string $key The internal key of the meta value to change (without prefix). + * @param mixed $meta_value The value to set the meta to. + * @param int $post_id The ID of the post to change the meta for. + * + * @return bool Whether the value was changed. + */ + public static function set_value( $key, $meta_value, $post_id ) { + /* + * Slash the data, because `update_metadata` will unslash it and we have already unslashed it. + * Related issue: https://github.com/Yoast/YoastSEO.js/issues/2158 + */ + $meta_value = wp_slash( $meta_value ); + + return update_post_meta( $post_id, self::$meta_prefix . $key, $meta_value ); + } + + /** + * Deletes a meta value for a post. + * + * @param string $key The internal key of the meta value to change (without prefix). + * @param int $post_id The ID of the post to delete the meta for. + * + * @return bool Whether the delete was successful or not. + */ + public static function delete( $key, $post_id ) { + return delete_post_meta( $post_id, self::$meta_prefix . $key ); + } + + /** + * Used for imports, this functions imports the value of $old_metakey into $new_metakey for those post + * where no WPSEO meta data has been set. + * Optionally deletes the $old_metakey values. + * + * @param string $old_metakey The old key of the meta value. + * @param string $new_metakey The new key, usually the WPSEO meta key (including prefix). + * @param bool $delete_old Whether to delete the old meta key/value-sets. + * + * @return void + */ + public static function replace_meta( $old_metakey, $new_metakey, $delete_old = false ) { + global $wpdb; + + /* + * Get only those rows where no wpseo meta values exist for the same post + * (with the exception of linkdex as that will be set independently of whether the post has been edited). + * + * {@internal Query is pretty well optimized this way.}} + */ + $query = $wpdb->prepare( + " + SELECT `a`.* + FROM {$wpdb->postmeta} AS a + WHERE `a`.`meta_key` = %s + AND NOT EXISTS ( + SELECT DISTINCT `post_id` , count( `meta_id` ) AS count + FROM {$wpdb->postmeta} AS b + WHERE `a`.`post_id` = `b`.`post_id` + AND `meta_key` LIKE %s + AND `meta_key` <> %s + GROUP BY `post_id` + ) + ;", + $old_metakey, + $wpdb->esc_like( self::$meta_prefix . '%' ), + self::$meta_prefix . 'linkdex' + ); + $oldies = $wpdb->get_results( $query ); + + if ( is_array( $oldies ) && $oldies !== [] ) { + foreach ( $oldies as $old ) { + update_post_meta( $old->post_id, $new_metakey, $old->meta_value ); + } + } + + // Delete old keys. + if ( $delete_old === true ) { + delete_post_meta_by_key( $old_metakey ); + } + } + + /** + * General clean-up of the saved meta values. + * - Remove potentially lingering old meta keys; + * - Remove all default and invalid values. + * + * @return void + */ + public static function clean_up() { + global $wpdb; + + /* + * Clean up '_yoast_wpseo_meta-robots'. + * + * Retrieve all '_yoast_wpseo_meta-robots' meta values and convert if no new values found. + * + * {@internal Query is pretty well optimized this way.}} + * + * @todo [JRF => Yoast] Find out all possible values which the old '_yoast_wpseo_meta-robots' could contain + * to convert the data correctly. + */ + $query = $wpdb->prepare( + " + SELECT `a`.* + FROM {$wpdb->postmeta} AS a + WHERE `a`.`meta_key` = %s + AND NOT EXISTS ( + SELECT DISTINCT `post_id` , count( `meta_id` ) AS count + FROM {$wpdb->postmeta} AS b + WHERE `a`.`post_id` = `b`.`post_id` + AND ( `meta_key` = %s + OR `meta_key` = %s ) + GROUP BY `post_id` + ) + ;", + self::$meta_prefix . 'meta-robots', + self::$meta_prefix . 'meta-robots-noindex', + self::$meta_prefix . 'meta-robots-nofollow' + ); + $oldies = $wpdb->get_results( $query ); + + if ( is_array( $oldies ) && $oldies !== [] ) { + foreach ( $oldies as $old ) { + $old_values = explode( ',', $old->meta_value ); + foreach ( $old_values as $value ) { + if ( $value === 'noindex' ) { + update_post_meta( $old->post_id, self::$meta_prefix . 'meta-robots-noindex', 1 ); + } + elseif ( $value === 'nofollow' ) { + update_post_meta( $old->post_id, self::$meta_prefix . 'meta-robots-nofollow', 1 ); + } + } + } + } + unset( $query, $oldies, $old, $old_values, $value ); + + // Delete old keys. + delete_post_meta_by_key( self::$meta_prefix . 'meta-robots' ); + + /* + * Remove all default values and (most) invalid option values. + * Invalid option values for the multiselect (meta-robots-adv) field will be dealt with seperately. + * + * {@internal Some of the defaults have changed in v1.5, but as the defaults will + * be removed and new defaults will now automatically be passed when no + * data found, this update is automatic (as long as we remove the old + * values which we do in the below routine).}} + * + * {@internal Unfortunately we can't use the normal delete_meta() with key/value combination + * as '' (empty string) values will be ignored and would result in all metas + * with that key being deleted, not just the empty fields. + * Still, the below implementation is largely based on the delete_meta() function.}} + */ + $query = []; + + foreach ( self::$meta_fields as $subset => $field_group ) { + foreach ( $field_group as $key => $field_def ) { + if ( ! isset( $field_def['default_value'] ) ) { + continue; + } + + if ( isset( $field_def['options'] ) && is_array( $field_def['options'] ) && $field_def['options'] !== [] ) { + $valid = $field_def['options']; + // Remove the default value from the valid options. + unset( $valid[ $field_def['default_value'] ] ); + $valid = array_keys( $valid ); + + $query[] = $wpdb->prepare( + "( meta_key = %s AND meta_value NOT IN ( '" . implode( "','", esc_sql( $valid ) ) . "' ) )", + self::$meta_prefix . $key + ); + unset( $valid ); + } + elseif ( is_string( $field_def['default_value'] ) && $field_def['default_value'] !== '' ) { + $query[] = $wpdb->prepare( + '( meta_key = %s AND meta_value = %s )', + self::$meta_prefix . $key, + $field_def['default_value'] + ); + } + else { + $query[] = $wpdb->prepare( + "( meta_key = %s AND meta_value = '' )", + self::$meta_prefix . $key + ); + } + } + } + unset( $subset, $field_group, $key, $field_def ); + + $query = "SELECT meta_id FROM {$wpdb->postmeta} WHERE " . implode( ' OR ', $query ) . ';'; + $meta_ids = $wpdb->get_col( $query ); + + if ( is_array( $meta_ids ) && $meta_ids !== [] ) { + // WP native action. + do_action( 'delete_post_meta', $meta_ids, null, null, null ); + + $query = "DELETE FROM {$wpdb->postmeta} WHERE meta_id IN( " . implode( ',', $meta_ids ) . ' )'; + $count = $wpdb->query( $query ); + + if ( $count ) { + foreach ( $meta_ids as $object_id ) { + wp_cache_delete( $object_id, 'post_meta' ); + } + + // WP native action. + do_action( 'deleted_post_meta', $meta_ids, null, null, null ); + } + } + unset( $query, $meta_ids, $count, $object_id ); + + /* + * Deal with the multiselect (meta-robots-adv) field. + * + * Removes invalid option combinations, such as 'none,noarchive'. + * + * Default values have already been removed, so we should have a small result set and + * (hopefully) even smaller set of invalid results. + */ + $query = $wpdb->prepare( + "SELECT meta_id, meta_value FROM {$wpdb->postmeta} WHERE meta_key = %s", + self::$meta_prefix . 'meta-robots-adv' + ); + $oldies = $wpdb->get_results( $query ); + + if ( is_array( $oldies ) && $oldies !== [] ) { + foreach ( $oldies as $old ) { + $clean = self::validate_meta_robots_adv( $old->meta_value ); + + if ( $clean !== $old->meta_value ) { + if ( $clean !== self::$meta_fields['advanced']['meta-robots-adv']['default_value'] ) { + update_metadata_by_mid( 'post', $old->meta_id, $clean ); + } + else { + delete_metadata_by_mid( 'post', $old->meta_id ); + } + } + } + } + unset( $query, $oldies, $old, $clean ); + + do_action( 'wpseo_meta_clean_up' ); + } + + /** + * Recursively merge a variable number of arrays, using the left array as base, + * giving priority to the right array. + * + * Difference with native array_merge_recursive(): + * array_merge_recursive converts values with duplicate keys to arrays rather than + * overwriting the value in the first array with the duplicate value in the second array. + * + * array_merge_recursive_distinct does not change the data types of the values in the arrays. + * Matching keys' values in the second array overwrite those in the first array, as is the + * case with array_merge. + * + * Freely based on information found on http://www.php.net/manual/en/function.array-merge-recursive.php + * + * {@internal Should be moved to a general utility class.}} + * + * @return array + */ + public static function array_merge_recursive_distinct() { + + $arrays = func_get_args(); + if ( count( $arrays ) < 2 ) { + if ( $arrays === [] ) { + return []; + } + else { + return $arrays[0]; + } + } + + $merged = array_shift( $arrays ); + + foreach ( $arrays as $array ) { + foreach ( $array as $key => $value ) { + if ( is_array( $value ) && ( isset( $merged[ $key ] ) && is_array( $merged[ $key ] ) ) ) { + $merged[ $key ] = self::array_merge_recursive_distinct( $merged[ $key ], $value ); + } + else { + $merged[ $key ] = $value; + } + } + unset( $key, $value ); + } + + return $merged; + } + + /** + * Counts the total of all the keywords being used for posts except the given one. + * + * @param string $keyword The keyword to be counted. + * @param int $post_id The id of the post to which the keyword belongs. + * + * @return array + */ + public static function keyword_usage( $keyword, $post_id ) { + + if ( empty( $keyword ) ) { + return []; + } + + /** + * The indexable repository. + * + * @var Indexable_Repository + */ + $repository = YoastSEO()->classes->get( Indexable_Repository::class ); + + $post_ids = $repository->query() + ->select( 'object_id' ) + ->where( 'primary_focus_keyword', $keyword ) + ->where( 'object_type', 'post' ) + ->where_not_equal( 'object_id', $post_id ) + ->where_not_equal( 'post_status', 'trash' ) + ->limit( 2 ) // Limit to 2 results to save time and resources. + ->find_array(); + + // Get object_id from each subarray in $post_ids. + $post_ids = ( is_array( $post_ids ) ) ? array_column( $post_ids, 'object_id' ) : []; + + /* + * If Premium is installed, get the additional keywords as well. + * We only check for the additional keywords if we've not already found two. + * In that case there's no use for an additional query as we already know + * that the keyword has been used multiple times before. + */ + if ( count( $post_ids ) < 2 ) { + /** + * Allows enhancing the array of posts' that share their focus keywords with the post's focus keywords. + * + * @param array $post_ids The array of posts' ids that share their related keywords with the post. + * @param string $keyword The keyword to search for. + * @param int $post_id The id of the post the keyword is associated to. + */ + $post_ids = apply_filters( 'wpseo_posts_for_focus_keyword', $post_ids, $keyword, $post_id ); + } + + return $post_ids; + } + + /** + * Returns the post types for the given post ids. + * + * @param array $post_ids The post ids to get the post types for. + * + * @return array The post types. + */ + public static function post_types_for_ids( $post_ids ) { + + /** + * The indexable repository. + * + * @var Indexable_Repository + */ + $repository = YoastSEO()->classes->get( Indexable_Repository::class ); + + // Check if post ids is not empty. + if ( ! empty( $post_ids ) ) { + // Get the post subtypes for the posts that share the keyword. + $post_types = $repository->query() + ->select( 'object_sub_type' ) + ->where_in( 'object_id', $post_ids ) + ->find_array(); + + // Get object_sub_type from each subarray in $post_ids. + $post_types = array_column( $post_types, 'object_sub_type' ); + } + else { + $post_types = []; + } + + return $post_types; + } + + /** + * Filter the schema article types. + * + * @return void + */ + public static function filter_schema_article_types() { + /** This filter is documented in inc/options/class-wpseo-option-titles.php */ + self::$meta_fields['schema']['schema_article_type']['options'] = apply_filters( 'wpseo_schema_article_types', self::$meta_fields['schema']['schema_article_type']['options'] ); + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/class-wpseo-primary-term.php b/wp-content/plugins/wordpress-seo/inc/class-wpseo-primary-term.php new file mode 100644 index 00000000..f5a5ccc2 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/class-wpseo-primary-term.php @@ -0,0 +1,86 @@ +taxonomy_name = $taxonomy_name; + $this->post_ID = $post_id; + } + + /** + * Returns the primary term ID. + * + * @return int|bool + */ + public function get_primary_term() { + $primary_term = get_post_meta( $this->post_ID, WPSEO_Meta::$meta_prefix . 'primary_' . $this->taxonomy_name, true ); + + if ( ! $primary_term ) { + return false; + } + + $terms = $this->get_terms(); + + if ( ! in_array( (int) $primary_term, wp_list_pluck( $terms, 'term_id' ), true ) ) { + $primary_term = false; + } + + $primary_term = (int) $primary_term; + return ( $primary_term ) ? ( $primary_term ) : false; + } + + /** + * Sets the new primary term ID. + * + * @param int $new_primary_term New primary term ID. + * + * @return void + */ + public function set_primary_term( $new_primary_term ) { + update_post_meta( $this->post_ID, WPSEO_Meta::$meta_prefix . 'primary_' . $this->taxonomy_name, $new_primary_term ); + } + + /** + * Get the terms for the current post ID. + * When $terms is not an array, set $terms to an array. + * + * @return array + */ + protected function get_terms() { + $terms = get_the_terms( $this->post_ID, $this->taxonomy_name ); + + if ( ! is_array( $terms ) ) { + $terms = []; + } + + return $terms; + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/class-wpseo-rank.php b/wp-content/plugins/wordpress-seo/inc/class-wpseo-rank.php new file mode 100644 index 00000000..e44c1e3c --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/class-wpseo-rank.php @@ -0,0 +1,338 @@ + [ + 'start' => 0, + 'end' => 0, + ], + self::BAD => [ + 'start' => 1, + 'end' => 40, + ], + self::OK => [ + 'start' => 41, + 'end' => 70, + ], + self::GOOD => [ + 'start' => 71, + 'end' => 100, + ], + ]; + + /** + * The current rank. + * + * @var int + */ + protected $rank; + + /** + * WPSEO_Rank constructor. + * + * @param int $rank The actual rank. + */ + public function __construct( $rank ) { + if ( ! in_array( $rank, self::$ranks, true ) ) { + $rank = self::BAD; + } + + $this->rank = $rank; + } + + /** + * Returns the saved rank for this rank. + * + * @return string + */ + public function get_rank() { + return $this->rank; + } + + /** + * Returns a CSS class for this rank. + * + * @return string + */ + public function get_css_class() { + $labels = [ + self::NO_FOCUS => 'na', + self::NO_INDEX => 'noindex', + self::BAD => 'bad', + self::OK => 'ok', + self::GOOD => 'good', + ]; + + return $labels[ $this->rank ]; + } + + /** + * Returns a label for this rank. + * + * @return string + */ + public function get_label() { + $labels = [ + self::NO_FOCUS => __( 'Not available', 'wordpress-seo' ), + self::NO_INDEX => __( 'No index', 'wordpress-seo' ), + self::BAD => __( 'Needs improvement', 'wordpress-seo' ), + self::OK => __( 'OK', 'wordpress-seo' ), + self::GOOD => __( 'Good', 'wordpress-seo' ), + ]; + + return $labels[ $this->rank ]; + } + + /** + * Returns an inclusive language label for this rank. + * The only difference with get_label above is that we return "Potentially non-inclusive" for an OK rank. + * + * @return string + */ + public function get_inclusive_language_label() { + if ( $this->rank === self::OK ) { + return __( 'Potentially non-inclusive', 'wordpress-seo' ); + } + return $this->get_label(); + } + + /** + * Returns a label for use in a drop down. + * + * @return mixed + */ + public function get_drop_down_label() { + $labels = [ + self::NO_FOCUS => sprintf( + /* translators: %s expands to the SEO score */ + __( 'SEO: %s', 'wordpress-seo' ), + __( 'No Focus Keyphrase', 'wordpress-seo' ) + ), + self::BAD => sprintf( + /* translators: %s expands to the SEO score */ + __( 'SEO: %s', 'wordpress-seo' ), + __( 'Needs improvement', 'wordpress-seo' ) + ), + self::OK => sprintf( + /* translators: %s expands to the SEO score */ + __( 'SEO: %s', 'wordpress-seo' ), + __( 'OK', 'wordpress-seo' ) + ), + self::GOOD => sprintf( + /* translators: %s expands to the SEO score */ + __( 'SEO: %s', 'wordpress-seo' ), + __( 'Good', 'wordpress-seo' ) + ), + self::NO_INDEX => sprintf( + /* translators: %s expands to the SEO score */ + __( 'SEO: %s', 'wordpress-seo' ), + __( 'Post Noindexed', 'wordpress-seo' ) + ), + ]; + + return $labels[ $this->rank ]; + } + + /** + * Gets the drop down labels for the readability score. + * + * @return string The readability rank label. + */ + public function get_drop_down_readability_labels() { + $labels = [ + self::BAD => sprintf( + /* translators: %s expands to the readability score */ + __( 'Readability: %s', 'wordpress-seo' ), + __( 'Needs improvement', 'wordpress-seo' ) + ), + self::OK => sprintf( + /* translators: %s expands to the readability score */ + __( 'Readability: %s', 'wordpress-seo' ), + __( 'OK', 'wordpress-seo' ) + ), + self::GOOD => sprintf( + /* translators: %s expands to the readability score */ + __( 'Readability: %s', 'wordpress-seo' ), + __( 'Good', 'wordpress-seo' ) + ), + ]; + + return $labels[ $this->rank ]; + } + + /** + * Gets the drop down labels for the inclusive language score. + * + * @return string The inclusive language rank label. + */ + public function get_drop_down_inclusive_language_labels() { + $labels = [ + self::BAD => sprintf( + /* translators: %s expands to the inclusive language score */ + __( 'Inclusive language: %s', 'wordpress-seo' ), + __( 'Needs improvement', 'wordpress-seo' ) + ), + self::OK => sprintf( + /* translators: %s expands to the inclusive language score */ + __( 'Inclusive language: %s', 'wordpress-seo' ), + __( 'Potentially non-inclusive', 'wordpress-seo' ) + ), + self::GOOD => sprintf( + /* translators: %s expands to the inclusive language score */ + __( 'Inclusive language: %s', 'wordpress-seo' ), + __( 'Good', 'wordpress-seo' ) + ), + ]; + + return $labels[ $this->rank ]; + } + + /** + * Get the starting score for this rank. + * + * @return int The start score. + */ + public function get_starting_score() { + // No index does not have a starting score. + if ( $this->rank === self::NO_INDEX ) { + return -1; + } + + return self::$ranges[ $this->rank ]['start']; + } + + /** + * Get the ending score for this rank. + * + * @return int The end score. + */ + public function get_end_score() { + // No index does not have an end score. + if ( $this->rank === self::NO_INDEX ) { + return -1; + } + + return self::$ranges[ $this->rank ]['end']; + } + + /** + * Returns a rank for a specific numeric score. + * + * @param int $score The score to determine a rank for. + * + * @return self + */ + public static function from_numeric_score( $score ) { + // Set up the default value. + $rank = new self( self::BAD ); + + foreach ( self::$ranges as $rank_index => $range ) { + if ( $range['start'] <= $score && $score <= $range['end'] ) { + $rank = new self( $rank_index ); + break; + } + } + + return $rank; + } + + /** + * Returns a list of all possible SEO Ranks. + * + * @return WPSEO_Rank[] + */ + public static function get_all_ranks() { + return array_map( [ 'WPSEO_Rank', 'create_rank' ], self::$ranks ); + } + + /** + * Returns a list of all possible Readability Ranks. + * + * @return WPSEO_Rank[] + */ + public static function get_all_readability_ranks() { + return array_map( [ 'WPSEO_Rank', 'create_rank' ], [ self::BAD, self::OK, self::GOOD ] ); + } + + /** + * Returns a list of all possible Inclusive Language Ranks. + * + * @return WPSEO_Rank[] + */ + public static function get_all_inclusive_language_ranks() { + return array_map( [ 'WPSEO_Rank', 'create_rank' ], [ self::BAD, self::OK, self::GOOD ] ); + } + + /** + * Converts a numeric rank into a WPSEO_Rank object, for use in functional array_* functions. + * + * @param string $rank SEO Rank. + * + * @return WPSEO_Rank + */ + private static function create_rank( $rank ) { + return new self( $rank ); + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/class-wpseo-replace-vars.php b/wp-content/plugins/wordpress-seo/inc/class-wpseo-replace-vars.php new file mode 100644 index 00000000..5dd81d78 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/class-wpseo-replace-vars.php @@ -0,0 +1,1646 @@ + '', + 'name' => '', + 'post_author' => '', + 'post_content' => '', + 'post_date' => '', + 'post_excerpt' => '', + 'post_modified' => '', + 'post_title' => '', + 'taxonomy' => '', + 'term_id' => '', + 'term404' => '', + ]; + + /** + * Current post/page/cpt information. + * + * @var stdClass + */ + protected $args; + + /** + * Help texts for use in WPSEO -> Search appearance tabs. + * + * @var array + */ + protected static $help_texts = []; + + /** + * Register of additional variable replacements registered by other plugins/themes. + * + * @var array + */ + protected static $external_replacements = []; + + /** + * Setup the help texts and external replacements as statics so they will be available to all instances. + * + * @return void + */ + public static function setup_statics_once() { + if ( self::$help_texts === [] ) { + self::set_basic_help_texts(); + self::set_advanced_help_texts(); + } + + if ( self::$external_replacements === [] ) { + /** + * Action: 'wpseo_register_extra_replacements' - Allows for registration of additional + * variables to replace. + */ + do_action( 'wpseo_register_extra_replacements' ); + } + } + + /** + * Register new replacement %%variables%%. + * For use by other plugins/themes to register extra variables. + * + * @see wpseo_register_var_replacement() for a usage example. + * + * @param string $var_to_replace The name of the variable to replace, i.e. '%%var%%'. + * Note: the surrounding %% are optional. + * @param mixed $replace_function Function or method to call to retrieve the replacement value for the variable. + * Uses the same format as add_filter/add_action function parameter and + * should *return* the replacement value. DON'T echo it. + * @param string $type Type of variable: 'basic' or 'advanced', defaults to 'advanced'. + * @param string $help_text Help text to be added to the help tab for this variable. + * + * @return bool Whether the replacement function was succesfully registered. + */ + public static function register_replacement( $var_to_replace, $replace_function, $type = 'advanced', $help_text = '' ) { + $success = false; + + if ( is_string( $var_to_replace ) && $var_to_replace !== '' ) { + $var_to_replace = self::remove_var_delimiter( $var_to_replace ); + + if ( preg_match( '`^[A-Z0-9_-]+$`i', $var_to_replace ) === false ) { + trigger_error( esc_html__( 'A replacement variable can only contain alphanumeric characters, an underscore or a dash. Try renaming your variable.', 'wordpress-seo' ), E_USER_WARNING ); + } + elseif ( strpos( $var_to_replace, 'cf_' ) === 0 || strpos( $var_to_replace, 'ct_' ) === 0 ) { + trigger_error( esc_html__( 'A replacement variable can not start with "%%cf_" or "%%ct_" as these are reserved for the WPSEO standard variable variables for custom fields and custom taxonomies. Try making your variable name unique.', 'wordpress-seo' ), E_USER_WARNING ); + } + elseif ( ! method_exists( self::class, 'retrieve_' . $var_to_replace ) ) { + if ( $var_to_replace !== '' && ! isset( self::$external_replacements[ $var_to_replace ] ) ) { + self::$external_replacements[ $var_to_replace ] = $replace_function; + $replacement_variable = new WPSEO_Replacement_Variable( $var_to_replace, $var_to_replace, $help_text ); + self::register_help_text( $type, $replacement_variable ); + $success = true; + } + else { + trigger_error( esc_html__( 'A replacement variable with the same name has already been registered. Try making your variable name unique.', 'wordpress-seo' ), E_USER_WARNING ); + } + } + else { + trigger_error( esc_html__( 'You cannot overrule a WPSEO standard variable replacement by registering a variable with the same name. Use the "wpseo_replacements" filter instead to adjust the replacement value.', 'wordpress-seo' ), E_USER_WARNING ); + } + } + + return $success; + } + + /** + * Replace `%%variable_placeholders%%` with their real value based on the current requested page/post/cpt/etc. + * + * @param string $text The string to replace the variables in. + * @param array $args The object some of the replacement values might come from, + * could be a post, taxonomy or term. + * @param array $omit Variables that should not be replaced by this function. + * + * @return string + */ + public function replace( $text, $args, $omit = [] ) { + + $text = wp_strip_all_tags( $text ); + + // Let's see if we can bail super early. + if ( strpos( $text, '%%' ) === false ) { + return YoastSEO()->helpers->string->standardize_whitespace( $text ); + } + + $args = (array) $args; + if ( isset( $args['post_content'] ) && ! empty( $args['post_content'] ) ) { + $args['post_content'] = YoastSEO()->helpers->string->strip_shortcode( $args['post_content'] ); + } + if ( isset( $args['post_excerpt'] ) && ! empty( $args['post_excerpt'] ) ) { + $args['post_excerpt'] = YoastSEO()->helpers->string->strip_shortcode( $args['post_excerpt'] ); + } + $this->args = (object) wp_parse_args( $args, $this->defaults ); + + // Clean $omit array. + if ( is_array( $omit ) && $omit !== [] ) { + $omit = array_map( [ self::class, 'remove_var_delimiter' ], $omit ); + } + + $replacements = []; + if ( preg_match_all( '`%%([^%]+(%%single)?)%%?`iu', $text, $matches ) ) { + $replacements = $this->set_up_replacements( $matches, $omit ); + } + + /** + * Filter: 'wpseo_replacements' - Allow customization of the replacements before they are applied. + * + * @param array $replacements The replacements. + * @param array $args The object some of the replacement values might come from, + * could be a post, taxonomy or term. + */ + $replacements = apply_filters( 'wpseo_replacements', $replacements, $this->args ); + + // Do the actual replacements. + if ( is_array( $replacements ) && $replacements !== [] ) { + $text = str_replace( + array_keys( $replacements ), + // Make sure to exclude replacement values that are arrays e.g. coming from a custom field serialized value. + array_filter( array_values( $replacements ), 'is_scalar' ), + $text + ); + } + + /** + * Filter: 'wpseo_replacements_final' - Allow overruling of whether or not to remove placeholders + * which didn't yield a replacement. + * + * @example add_filter( 'wpseo_replacements_final', '__return_false' ); + * + * @param bool $final + */ + if ( apply_filters( 'wpseo_replacements_final', true ) === true && ( isset( $matches[1] ) && is_array( $matches[1] ) ) ) { + // Remove non-replaced variables. + $remove = array_diff( $matches[1], $omit ); // Make sure the $omit variables do not get removed. + $remove = array_map( [ self::class, 'add_var_delimiter' ], $remove ); + $text = str_replace( $remove, '', $text ); + } + + // Undouble separators which have nothing between them, i.e. where a non-replaced variable was removed. + if ( isset( $replacements['%%sep%%'] ) && ( is_string( $replacements['%%sep%%'] ) && $replacements['%%sep%%'] !== '' ) ) { + $q_sep = preg_quote( $replacements['%%sep%%'], '`' ); + $text = preg_replace( '`' . $q_sep . '(?:\s*' . $q_sep . ')*`u', $replacements['%%sep%%'], $text ); + } + + // Remove superfluous whitespace. + $text = YoastSEO()->helpers->string->standardize_whitespace( $text ); + + return $text; + } + + /** + * Register a new replacement variable if it has not been registered already. + * + * @param string $var_to_replace The name of the variable to replace, i.e. '%%var%%'. + * Note: the surrounding %% are optional. + * @param mixed $replace_function Function or method to call to retrieve the replacement value for the variable. + * Uses the same format as add_filter/add_action function parameter and + * should *return* the replacement value. DON'T echo it. + * @param string $type Type of variable: 'basic' or 'advanced', defaults to 'advanced'. + * @param string $help_text Help text to be added to the help tab for this variable. + * + * @return bool `true` if the replace var has been registered, `false` if not. + */ + public function safe_register_replacement( $var_to_replace, $replace_function, $type = 'advanced', $help_text = '' ) { + if ( ! $this->has_been_registered( $var_to_replace ) ) { + return self::register_replacement( $var_to_replace, $replace_function, $type, $help_text ); + } + return false; + } + + /** + * Checks whether the given replacement variable has already been registered or not. + * + * @param string $replacement_variable The replacement variable to check, including the variable delimiter (e.g. `%%var%%`). + * + * @return bool `true` if the replacement variable has already been registered. + */ + public function has_been_registered( $replacement_variable ) { + $replacement_variable = self::remove_var_delimiter( $replacement_variable ); + + return isset( self::$external_replacements[ $replacement_variable ] ); + } + + /** + * Returns the list of hidden replace vars. + * + * E.g. the replace vars that should work, but are not advertised. + * + * @return string[] The list of hidden replace vars. + */ + public function get_hidden_replace_vars() { + return [ + 'currentdate', + 'currentyear', + 'currentmonth', + 'currentday', + 'post_year', + 'post_month', + 'post_day', + 'author_first_name', + 'author_last_name', + 'permalink', + 'post_content', + 'category_title', + ]; + } + + /** + * Retrieve the replacements for the variables found. + * + * @param array $matches Variables found in the original string - regex result. + * @param array $omit Variables that should not be replaced by this function. + * + * @return array Retrieved replacements - this might be a smaller array as some variables + * may not yield a replacement in certain contexts. + */ + private function set_up_replacements( $matches, $omit ) { + + $replacements = []; + + // @todo Figure out a way to deal with external functions starting with cf_/ct_. + foreach ( $matches[1] as $k => $var ) { + + // Don't set up replacements which should be omitted. + if ( in_array( $var, $omit, true ) ) { + continue; + } + + // Deal with variable variable names first. + if ( strpos( $var, 'cf_' ) === 0 ) { + $replacement = $this->retrieve_cf_custom_field_name( $var ); + } + elseif ( strpos( $var, 'ct_desc_' ) === 0 ) { + $replacement = $this->retrieve_ct_desc_custom_tax_name( $var ); + } + elseif ( strpos( $var, 'ct_' ) === 0 ) { + $single = ( isset( $matches[2][ $k ] ) && $matches[2][ $k ] !== '' ); + $replacement = $this->retrieve_ct_custom_tax_name( $var, $single ); + } + // Deal with non-variable variable names. + elseif ( method_exists( $this, 'retrieve_' . $var ) ) { + $method_name = 'retrieve_' . $var; + $replacement = $this->$method_name(); + } + // Deal with externally defined variable names. + elseif ( isset( self::$external_replacements[ $var ] ) && ! is_null( self::$external_replacements[ $var ] ) ) { + $replacement = call_user_func( self::$external_replacements[ $var ], $var, $this->args ); + } + + // Replacement retrievals can return null if no replacement can be determined, root those outs. + if ( isset( $replacement ) ) { + $var = self::add_var_delimiter( $var ); + $replacements[ $var ] = $replacement; + } + unset( $replacement, $single, $method_name ); + } + + return $replacements; + } + + /* *********************** BASIC VARIABLES ************************** */ + + /** + * Retrieve the post/cpt categories (comma separated) for use as replacement string. + * + * @return string|null + */ + private function retrieve_category() { + $replacement = null; + + if ( ! empty( $this->args->ID ) ) { + $cat = $this->get_terms( $this->args->ID, 'category' ); + if ( $cat !== '' ) { + return $cat; + } + } + + if ( isset( $this->args->cat_name ) && ! empty( $this->args->cat_name ) ) { + $replacement = $this->args->cat_name; + } + + return $replacement; + } + + /** + * Retrieve the category description for use as replacement string. + * + * @return string|null + */ + private function retrieve_category_description() { + return $this->retrieve_term_description(); + } + + /** + * Retrieve the date of the post/page/cpt for use as replacement string. + * + * @return string|null + */ + private function retrieve_date() { + $replacement = null; + + if ( $this->args->post_date !== '' ) { + // Returns a string. + $replacement = YoastSEO()->helpers->date->format_translated( $this->args->post_date, get_option( 'date_format' ) ); + } + elseif ( get_query_var( 'day' ) && get_query_var( 'day' ) !== '' ) { + // Returns a string. + $replacement = get_the_date(); + } + elseif ( single_month_title( ' ', false ) && single_month_title( ' ', false ) !== '' ) { + // Returns a string. + $replacement = single_month_title( ' ', false ); + } + elseif ( get_query_var( 'year' ) !== '' ) { + // Returns an integer, let's cast to string. + $replacement = (string) get_query_var( 'year' ); + } + + return $replacement; + } + + /** + * Retrieve the post/page/cpt excerpt for use as replacement string. + * The excerpt will be auto-generated if it does not exist. + * + * @return string|null + */ + private function retrieve_excerpt() { + $replacement = null; + $locale = get_locale(); + + // Japanese doesn't have a jp_JP variant in WP. + $limit = ( $locale === 'ja' ) ? 80 : 156; + + // The check `post_password_required` is because excerpt must be hidden for a post with a password. + if ( ! empty( $this->args->ID ) && ! post_password_required( $this->args->ID ) ) { + if ( $this->args->post_excerpt !== '' ) { + $replacement = wp_strip_all_tags( $this->args->post_excerpt ); + } + elseif ( $this->args->post_content !== '' ) { + $content = strip_shortcodes( $this->args->post_content ); + $content = wp_strip_all_tags( $content ); + + if ( mb_strlen( $content ) <= $limit ) { + return $content; + } + + $replacement = wp_html_excerpt( $content, $limit ); + + // Check if the description has space and trim the auto-generated string to a word boundary. + if ( strrpos( $replacement, ' ' ) ) { + $replacement = substr( $replacement, 0, strrpos( $replacement, ' ' ) ); + } + } + } + + return $replacement; + } + + /** + * Retrieve the post/page/cpt excerpt for use as replacement string (without auto-generation). + * + * @return string|null + */ + private function retrieve_excerpt_only() { + $replacement = null; + + // The check `post_password_required` is because excerpt must be hidden for a post with a password. + if ( ! empty( $this->args->ID ) && $this->args->post_excerpt !== '' && ! post_password_required( $this->args->ID ) ) { + $replacement = wp_strip_all_tags( $this->args->post_excerpt ); + } + + return $replacement; + } + + /** + * Retrieve the title of the parent page of the current page/cpt for use as replacement string. + * Only applicable for hierarchical post types. + * + * @todo Check: shouldn't this use $this->args as well ? + * + * @return string|null + */ + private function retrieve_parent_title() { + $replacement = null; + + if ( ! empty( $this->args->ID ) ) { + $parent_id = wp_get_post_parent_id( $this->args->ID ); + if ( $parent_id ) { + $replacement = get_the_title( $parent_id ); + } + } + + return $replacement; + } + + /** + * Retrieve the current search phrase for use as replacement string. + * + * @return string|null + */ + private function retrieve_searchphrase() { + $replacement = null; + + $search = get_query_var( 's' ); + if ( $search !== '' ) { + $replacement = esc_html( $search ); + } + + return $replacement; + } + + /** + * Retrieve the separator for use as replacement string. + * + * @return string Retrieves the title separator. + */ + private function retrieve_sep() { + return YoastSEO()->helpers->options->get_title_separator(); + } + + /** + * Retrieve the site's tag line / description for use as replacement string. + * + * The `$replacement` variable is static because it doesn't change depending + * on the context. See https://github.com/Yoast/wordpress-seo/pull/1172#issuecomment-46019482. + * + * @return string|null + */ + private function retrieve_sitedesc() { + static $replacement; + + if ( ! isset( $replacement ) ) { + $description = wp_strip_all_tags( get_bloginfo( 'description' ) ); + if ( $description !== '' ) { + $replacement = $description; + } + } + + return $replacement; + } + + /** + * Retrieve the site's name for use as replacement string. + * + * The `$replacement` variable is static because it doesn't change depending + * on the context. See https://github.com/Yoast/wordpress-seo/pull/1172#issuecomment-46019482. + * + * @return string|null + */ + private function retrieve_sitename() { + static $replacement; + + if ( ! isset( $replacement ) ) { + $sitename = YoastSEO()->helpers->site->get_site_name(); + if ( $sitename !== '' ) { + $replacement = $sitename; + } + } + + return $replacement; + } + + /** + * Retrieve the current tag/tags for use as replacement string. + * + * @return string|null + */ + private function retrieve_tag() { + $replacement = null; + + if ( ! empty( $this->args->ID ) ) { + $tags = $this->get_terms( $this->args->ID, 'post_tag' ); + if ( $tags !== '' ) { + $replacement = $tags; + } + } + + return $replacement; + } + + /** + * Retrieve the tag description for use as replacement string. + * + * @return string|null + */ + private function retrieve_tag_description() { + return $this->retrieve_term_description(); + } + + /** + * Retrieve the term description for use as replacement string. + * + * @return string|null + */ + private function retrieve_term_description() { + $replacement = null; + + if ( ! empty( $this->args->term_id ) && ! empty( $this->args->taxonomy ) ) { + $term_desc = get_term_field( 'description', $this->args->term_id, $this->args->taxonomy ); + if ( $term_desc !== '' ) { + $replacement = wp_strip_all_tags( $term_desc ); + } + } + + return $replacement; + } + + /** + * Retrieve the term name for use as replacement string. + * + * @return string|null + */ + private function retrieve_term_title() { + $replacement = null; + + if ( ! empty( $this->args->taxonomy ) && ! empty( $this->args->name ) ) { + $replacement = $this->args->name; + } + + return $replacement; + } + + /** + * Retrieve the title of the post/page/cpt for use as replacement string. + * + * @return string|null + */ + private function retrieve_title() { + $replacement = null; + + if ( is_string( $this->args->post_title ) && $this->args->post_title !== '' ) { + $replacement = $this->args->post_title; + } + + return $replacement; + } + + /** + * Retrieve primary category for use as replacement string. + * + * @return bool|int|null + */ + private function retrieve_primary_category() { + $primary_category = null; + + if ( ! empty( $this->args->ID ) ) { + $wpseo_primary_category = new WPSEO_Primary_Term( 'category', $this->args->ID ); + + $term_id = $wpseo_primary_category->get_primary_term(); + $term = get_term( $term_id ); + + if ( ! is_wp_error( $term ) && ! empty( $term ) ) { + $primary_category = $term->name; + } + } + + return $primary_category; + } + + /** + * Retrieve the string generated by get_the_archive_title(). + * + * @return string|null + */ + private function retrieve_archive_title() { + return get_the_archive_title(); + } + + /* *********************** ADVANCED VARIABLES ************************** */ + + /** + * Determine the page numbering of the current post/page/cpt. + * + * @param string $request Either 'nr'|'max' - whether to return the page number or the max number of pages. + * + * @return int|null + */ + private function determine_pagenumbering( $request = 'nr' ) { + global $wp_query, $post; + $max_num_pages = null; + $page_number = null; + + $max_num_pages = 1; + + if ( ! is_singular() ) { + $page_number = get_query_var( 'paged' ); + if ( $page_number === 0 || $page_number === '' ) { + $page_number = 1; + } + + if ( ! empty( $wp_query->max_num_pages ) ) { + $max_num_pages = $wp_query->max_num_pages; + } + } + else { + $page_number = get_query_var( 'page' ); + if ( $page_number === 0 || $page_number === '' ) { + $page_number = 1; + } + + if ( isset( $post->post_content ) ) { + $max_num_pages = ( substr_count( $post->post_content, '' ) + 1 ); + } + } + + $return = null; + + switch ( $request ) { + case 'nr': + $return = $page_number; + break; + case 'max': + $return = $max_num_pages; + break; + } + + return $return; + } + + /** + * Determine the post type names for the current post/page/cpt. + * + * @param string $request Either 'single'|'plural' - whether to return the single or plural form. + * + * @return string|null + */ + private function determine_pt_names( $request = 'single' ) { + global $wp_query; + $pt_single = null; + $pt_plural = null; + $post_type = ''; + + if ( isset( $wp_query->query_vars['post_type'] ) && ( ( is_string( $wp_query->query_vars['post_type'] ) && $wp_query->query_vars['post_type'] !== '' ) || ( is_array( $wp_query->query_vars['post_type'] ) && $wp_query->query_vars['post_type'] !== [] ) ) ) { + $post_type = $wp_query->query_vars['post_type']; + } + elseif ( isset( $this->args->post_type ) && ( is_string( $this->args->post_type ) && $this->args->post_type !== '' ) ) { + $post_type = $this->args->post_type; + } + else { + // Make it work in preview mode. + $post = $wp_query->get_queried_object(); + if ( $post instanceof WP_Post ) { + $post_type = $post->post_type; + } + } + + if ( is_array( $post_type ) ) { + $post_type = reset( $post_type ); + } + + if ( $post_type !== '' ) { + $pt = get_post_type_object( $post_type ); + $pt_single = $pt->name; + $pt_plural = $pt->name; + if ( isset( $pt->labels->singular_name ) ) { + $pt_single = $pt->labels->singular_name; + } + if ( isset( $pt->labels->name ) ) { + $pt_plural = $pt->labels->name; + } + } + + $return = null; + + switch ( $request ) { + case 'single': + $return = $pt_single; + break; + case 'plural': + $return = $pt_plural; + break; + } + + return $return; + } + + /** + * Retrieve the attachment caption for use as replacement string. + * + * @return string|null + */ + private function retrieve_caption() { + return $this->retrieve_excerpt_only(); + } + + /** + * Retrieve a post/page/cpt's custom field value for use as replacement string. + * + * @param string $var_to_replace The complete variable to replace which includes the name of + * the custom field which value is to be retrieved. + * + * @return string|null + */ + private function retrieve_cf_custom_field_name( $var_to_replace ) { + $replacement = null; + + if ( is_string( $var_to_replace ) && $var_to_replace !== '' ) { + $field = substr( $var_to_replace, 3 ); + if ( ! empty( $this->args->ID ) ) { + // Post meta can be arrays and in this case we need to exclude them. + $name = get_post_meta( $this->args->ID, $field, true ); + if ( $name !== '' && ! is_array( $name ) ) { + $replacement = $name; + } + } + elseif ( ! empty( $this->args->term_id ) ) { + $name = get_term_meta( $this->args->term_id, $field, true ); + if ( $name !== '' ) { + $replacement = $name; + } + } + } + + return $replacement; + } + + /** + * Retrieve a post/page/cpt's custom taxonomies for use as replacement string. + * + * @param string $var_to_replace The complete variable to replace which includes the name of + * the custom taxonomy which value(s) is to be retrieved. + * @param bool $single Whether to retrieve only the first or all values for the taxonomy. + * + * @return string|null + */ + private function retrieve_ct_custom_tax_name( $var_to_replace, $single = false ) { + $replacement = null; + + if ( ( is_string( $var_to_replace ) && $var_to_replace !== '' ) && ! empty( $this->args->ID ) ) { + $tax = substr( $var_to_replace, 3 ); + $name = $this->get_terms( $this->args->ID, $tax, $single ); + if ( $name !== '' ) { + $replacement = $name; + } + } + + return $replacement; + } + + /** + * Retrieve a post/page/cpt's custom taxonomies description for use as replacement string. + * + * @param string $var_to_replace The complete variable to replace which includes the name of + * the custom taxonomy which description is to be retrieved. + * + * @return string|null + */ + private function retrieve_ct_desc_custom_tax_name( $var_to_replace ) { + $replacement = null; + + if ( is_string( $var_to_replace ) && $var_to_replace !== '' ) { + $tax = substr( $var_to_replace, 8 ); + if ( ! empty( $this->args->ID ) ) { + $terms = get_the_terms( $this->args->ID, $tax ); + if ( is_array( $terms ) && $terms !== [] ) { + $term = current( $terms ); + $term_desc = get_term_field( 'description', $term->term_id, $tax ); + if ( $term_desc !== '' ) { + $replacement = wp_strip_all_tags( $term_desc ); + } + } + } + } + + return $replacement; + } + + /** + * Retrieve the current date for use as replacement string. + * + * The `$replacement` variable is static because it doesn't change depending + * on the context. See https://github.com/Yoast/wordpress-seo/pull/1172#issuecomment-46019482. + * + * @return string The formatted current date. + */ + private function retrieve_currentdate() { + static $replacement; + + if ( ! isset( $replacement ) ) { + $replacement = date_i18n( get_option( 'date_format' ) ); + } + + return $replacement; + } + + /** + * Retrieve the current day for use as replacement string. + * + * The `$replacement` variable is static because it doesn't change depending + * on the context. See https://github.com/Yoast/wordpress-seo/pull/1172#issuecomment-46019482. + * + * @return string The current day. + */ + private function retrieve_currentday() { + static $replacement; + + if ( ! isset( $replacement ) ) { + $replacement = date_i18n( 'j' ); + } + + return $replacement; + } + + /** + * Retrieve the current month for use as replacement string. + * + * The `$replacement` variable is static because it doesn't change depending + * on the context. See https://github.com/Yoast/wordpress-seo/pull/1172#issuecomment-46019482. + * + * @return string The current month. + */ + private function retrieve_currentmonth() { + static $replacement; + + if ( ! isset( $replacement ) ) { + $replacement = date_i18n( 'F' ); + } + + return $replacement; + } + + /** + * Retrieve the current time for use as replacement string. + * + * The `$replacement` variable is static because it doesn't change depending + * on the context. See https://github.com/Yoast/wordpress-seo/pull/1172#issuecomment-46019482. + * + * @return string The formatted current time. + */ + private function retrieve_currenttime() { + static $replacement; + + if ( ! isset( $replacement ) ) { + $replacement = date_i18n( get_option( 'time_format' ) ); + } + + return $replacement; + } + + /** + * Retrieve the current year for use as replacement string. + * + * The `$replacement` variable is static because it doesn't change depending + * on the context. See https://github.com/Yoast/wordpress-seo/pull/1172#issuecomment-46019482. + * + * @return string The current year. + */ + private function retrieve_currentyear() { + static $replacement; + + if ( ! isset( $replacement ) ) { + $replacement = date_i18n( 'Y' ); + } + + return $replacement; + } + + /** + * Retrieve the post/page/cpt's focus keyword for use as replacement string. + * + * @return string|null + */ + private function retrieve_focuskw() { + // Retrieve focuskw from a Post. + if ( ! empty( $this->args->ID ) ) { + $focus_kw = WPSEO_Meta::get_value( 'focuskw', $this->args->ID ); + if ( $focus_kw !== '' ) { + return $focus_kw; + } + + return null; + } + + // Retrieve focuskw from a Term. + if ( ! empty( $this->args->term_id ) ) { + $focus_kw = WPSEO_Taxonomy_Meta::get_term_meta( $this->args->term_id, $this->args->taxonomy, 'focuskw' ); + if ( $focus_kw !== '' ) { + return $focus_kw; + } + } + + return null; + } + + /** + * Retrieve the post/page/cpt ID for use as replacement string. + * + * @return string|null + */ + private function retrieve_id() { + $replacement = null; + + if ( ! empty( $this->args->ID ) ) { + // The post/page/cpt ID is an integer, let's cast to string. + $replacement = (string) $this->args->ID; + } + + return $replacement; + } + + /** + * Retrieve the post/page/cpt modified time for use as replacement string. + * + * @return string|null + */ + private function retrieve_modified() { + $replacement = null; + + if ( ! empty( $this->args->post_modified ) ) { + $replacement = YoastSEO()->helpers->date->format_translated( $this->args->post_modified, get_option( 'date_format' ) ); + } + + return $replacement; + } + + /** + * Retrieve the post/page/cpt author's "nice name" for use as replacement string. + * + * @return string|null + */ + private function retrieve_name() { + $replacement = null; + + $user_id = (int) $this->retrieve_userid(); + $name = get_the_author_meta( 'display_name', $user_id ); + if ( $name !== '' ) { + $replacement = $name; + } + + return $replacement; + } + + /** + * Retrieve the post/page/cpt author's users description for use as a replacement string. + * + * @return string|null + */ + private function retrieve_user_description() { + $replacement = null; + + $user_id = (int) $this->retrieve_userid(); + $description = get_the_author_meta( 'description', $user_id ); + if ( $description !== '' ) { + $replacement = $description; + } + + return $replacement; + } + + /** + * Retrieve the current page number with context (i.e. 'page 2 of 4') for use as replacement string. + * + * @return string + */ + private function retrieve_page() { + $replacement = null; + + $max = $this->determine_pagenumbering( 'max' ); + $nr = $this->determine_pagenumbering( 'nr' ); + $sep = $this->retrieve_sep(); + + if ( $max > 1 && $nr > 1 ) { + /* translators: 1: current page number, 2: total number of pages. */ + $replacement = sprintf( $sep . ' ' . __( 'Page %1$d of %2$d', 'wordpress-seo' ), $nr, $max ); + } + + return $replacement; + } + + /** + * Retrieve the current page number for use as replacement string. + * + * @return string|null + */ + private function retrieve_pagenumber() { + $replacement = null; + + $nr = $this->determine_pagenumbering( 'nr' ); + if ( isset( $nr ) && $nr > 0 ) { + $replacement = (string) $nr; + } + + return $replacement; + } + + /** + * Retrieve the current page total for use as replacement string. + * + * @return string|null + */ + private function retrieve_pagetotal() { + $replacement = null; + + $max = $this->determine_pagenumbering( 'max' ); + if ( isset( $max ) && $max > 0 ) { + $replacement = (string) $max; + } + + return $replacement; + } + + /** + * Retrieve the post type plural label for use as replacement string. + * + * @return string|null + */ + private function retrieve_pt_plural() { + $replacement = null; + + $name = $this->determine_pt_names( 'plural' ); + if ( isset( $name ) && $name !== '' ) { + $replacement = $name; + } + + return $replacement; + } + + /** + * Retrieve the post type single label for use as replacement string. + * + * @return string|null + */ + private function retrieve_pt_single() { + $replacement = null; + + $name = $this->determine_pt_names( 'single' ); + if ( isset( $name ) && $name !== '' ) { + $replacement = $name; + } + + return $replacement; + } + + /** + * Retrieve the slug which caused the 404 for use as replacement string. + * + * @return string|null + */ + private function retrieve_term404() { + $replacement = null; + + if ( $this->args->term404 !== '' ) { + $replacement = sanitize_text_field( str_replace( '-', ' ', $this->args->term404 ) ); + } + else { + $error_request = get_query_var( 'pagename' ); + if ( $error_request !== '' ) { + $replacement = sanitize_text_field( str_replace( '-', ' ', $error_request ) ); + } + else { + $error_request = get_query_var( 'name' ); + if ( $error_request !== '' ) { + $replacement = sanitize_text_field( str_replace( '-', ' ', $error_request ) ); + } + } + } + + return $replacement; + } + + /** + * Retrieve the post/page/cpt author's user id for use as replacement string. + * + * @return string + */ + private function retrieve_userid() { + // The user ID is an integer, let's cast to string. + $replacement = ! empty( $this->args->post_author ) ? (string) $this->args->post_author : (string) get_query_var( 'author' ); + + return $replacement; + } + + /** + * Retrieve the post/page/cpt's published year for use as replacement string. + * + * @return string|null + */ + private function retrieve_post_year() { + if ( empty( $this->args->ID ) ) { + return null; + } + + return get_the_date( 'Y', $this->args->ID ); + } + + /** + * Retrieve the post/page/cpt's published month for use as replacement string. + * + * @return string|null + */ + private function retrieve_post_month() { + if ( empty( $this->args->ID ) ) { + return null; + } + + return get_the_date( 'F', $this->args->ID ); + } + + /** + * Retrieve the post/page/cpt's published day for use as replacement string. + * + * @return string|null + */ + private function retrieve_post_day() { + if ( empty( $this->args->ID ) ) { + return null; + } + + return get_the_date( 'd', $this->args->ID ); + } + + /** + * Retrieve the post/page/cpt author's first name for use as replacement string. + * + * @return string|null + */ + private function retrieve_author_first_name() { + $replacement = null; + + $user_id = (int) $this->retrieve_userid(); + $name = get_the_author_meta( 'first_name', $user_id ); + if ( $name !== '' ) { + $replacement = $name; + } + + return $replacement; + } + + /** + * Retrieve the post/page/cpt author's last name for use as replacement string. + * + * @return string|null + */ + private function retrieve_author_last_name() { + $replacement = null; + + $user_id = (int) $this->retrieve_userid(); + $name = get_the_author_meta( 'last_name', $user_id ); + if ( $name !== '' ) { + $replacement = $name; + } + + return $replacement; + } + + /** + * Retrieve the post/page/cpt permalink for use as replacement string. + * + * @return string|null + */ + private function retrieve_permalink() { + if ( empty( $this->args->ID ) ) { + return null; + } + + return get_permalink( $this->args->ID ); + } + + /** + * Retrieve the post/page/cpt content for use as replacement string. + * + * @return string|null + */ + private function retrieve_post_content() { + $replacement = null; + + // The check `post_password_required` is because content must be hidden for a post with a password. + if ( ! empty( $this->args->ID ) && $this->args->post_content !== '' && ! post_password_required( $this->args->ID ) ) { + $content = strip_shortcodes( $this->args->post_content ); + $replacement = wp_strip_all_tags( $content ); + } + + return $replacement; + } + + /** + * Retrieve the current or first category title. To be used for import data from AIOSEO. + * The code derives from AIOSEO's way of dealing with that var, so we can ensure 100% seamless transition. + * + * @return string|null + */ + private function retrieve_category_title() { + if ( empty( $this->args ) || empty( $this->args->ID ) ) { + return null; + } + $post_id = $this->args->ID; + + $post = get_post( $post_id ); + $taxonomies = get_object_taxonomies( $post, 'objects' ); + + foreach ( $taxonomies as $taxonomy_slug => $taxonomy ) { + if ( ! $taxonomy->hierarchical ) { + continue; + } + $post_terms = get_the_terms( $post_id, $taxonomy_slug ); + if ( is_array( $post_terms ) && count( $post_terms ) > 0 ) { + // AiOSEO takes the name of whatever the first hierarchical taxonomy is. + $term = $post_terms[0]; + if ( $term ) { + return $term->name; + } + } + } + + return null; + } + + /* *********************** HELP TEXT RELATED ************************** */ + + /** + * Set the help text for a user/plugin/theme defined extra variable. + * + * @param string $type Type of variable: 'basic' or 'advanced'. + * @param WPSEO_Replacement_Variable $replacement_variable The replacement variable to register. + * + * @return void + */ + private static function register_help_text( $type, WPSEO_Replacement_Variable $replacement_variable ) { + $identifier = $replacement_variable->get_variable(); + + if ( ( is_string( $type ) && in_array( $type, [ 'basic', 'advanced' ], true ) ) + && ( $identifier !== '' && ! isset( self::$help_texts[ $type ][ $identifier ] ) ) + ) { + self::$help_texts[ $type ][ $identifier ] = $replacement_variable; + } + } + + /** + * Generates a list of replacement variables based on the help texts. + * + * @return array List of replace vars. + */ + public function get_replacement_variables_with_labels() { + self::setup_statics_once(); + + $custom_variables = []; + foreach ( array_merge( WPSEO_Custom_Fields::get_custom_fields(), WPSEO_Custom_Taxonomies::get_custom_taxonomies() ) as $custom_variable ) { + $custom_variables[ $custom_variable ] = new WPSEO_Replacement_Variable( $custom_variable, $this->get_label( $custom_variable ), '' ); + } + + $replacement_variables = array_filter( + array_merge( self::$help_texts['basic'], self::$help_texts['advanced'] ), + [ $this, 'is_not_prefixed' ], + ARRAY_FILTER_USE_KEY + ); + + $hidden = $this->get_hidden_replace_vars(); + + return array_values( + array_map( + static function ( WPSEO_Replacement_Variable $replacement_variable ) use ( $hidden ) { + $name = $replacement_variable->get_variable(); + + return [ + 'name' => $name, + 'value' => '', + 'label' => $replacement_variable->get_label(), + 'hidden' => in_array( $name, $hidden, true ), + ]; + }, + array_merge( $replacement_variables, $custom_variables ) + ) + ); + } + + /** + * Generates a list of replacement variables based on the help texts. + * + * @return array List of replace vars. + */ + public function get_replacement_variables_list() { + self::setup_statics_once(); + + $replacement_variables = array_merge( + $this->get_replacement_variables(), + WPSEO_Custom_Fields::get_custom_fields(), + WPSEO_Custom_Taxonomies::get_custom_taxonomies() + ); + + return array_map( [ $this, 'format_replacement_variable' ], $replacement_variables ); + } + + /** + * Creates a merged associative array of both the basic and advanced help texts. + * + * @return array Array with the replacement variables. + */ + private function get_replacement_variables() { + $help_texts = array_merge( self::$help_texts['basic'], self::$help_texts['advanced'] ); + + return array_filter( array_keys( $help_texts ), [ $this, 'is_not_prefixed' ] ); + } + + /** + * Checks whether the replacement variable contains a `ct_` or `cf_` prefix, because they follow different logic. + * + * @param string $replacement_variable The replacement variable. + * + * @return bool True when the replacement variable is not prefixed. + */ + private function is_not_prefixed( $replacement_variable ) { + $prefixes = [ 'cf_', 'ct_' ]; + $prefix = $this->get_prefix( $replacement_variable ); + + return ! in_array( $prefix, $prefixes, true ); + } + + /** + * Strip the prefix from a replacement variable name. + * + * @param string $replacement_variable The replacement variable. + * + * @return string The replacement variable name without the prefix. + */ + private function strip_prefix( $replacement_variable ) { + return substr( $replacement_variable, 3 ); + } + + /** + * Gets the prefix from a replacement variable name. + * + * @param string $replacement_variable The replacement variable. + * + * @return string The prefix of the replacement variable. + */ + private function get_prefix( $replacement_variable ) { + return substr( $replacement_variable, 0, 3 ); + } + + /** + * Strips 'desc_' if present, and appends ' description' at the end. + * + * @param string $label The replacement variable. + * + * @return string The altered replacement variable name. + */ + private function handle_description( $label ) { + if ( strpos( $label, 'desc_' ) === 0 ) { + return substr( $label, 5 ) . ' description'; + } + + return $label; + } + + /** + * Creates a label for prefixed replacement variables that matches the format in the editors. + * + * @param string $replacement_variable The replacement variable. + * + * @return string The replacement variable label. + */ + private function get_label( $replacement_variable ) { + $prefix = $this->get_prefix( $replacement_variable ); + if ( $prefix === 'cf_' ) { + return $this->strip_prefix( $replacement_variable ) . ' (custom field)'; + } + + if ( $prefix === 'ct_' ) { + $label = $this->strip_prefix( $replacement_variable ); + $label = $this->handle_description( $label ); + return ucfirst( $label . ' (custom taxonomy)' ); + } + + if ( $prefix === 'pt_' ) { + if ( $replacement_variable === 'pt_single' ) { + return 'Post type (singular)'; + } + + return 'Post type (plural)'; + } + + return ''; + } + + /** + * Formats the replacement variables. + * + * @param string $replacement_variable The replacement variable to format. + * + * @return array The formatted replacement variable. + */ + private function format_replacement_variable( $replacement_variable ) { + return [ + 'name' => $replacement_variable, + 'value' => '', + 'label' => $this->get_label( $replacement_variable ), + ]; + } + + /** + * Set/translate the help texts for the WPSEO standard basic variables. + * + * @return void + */ + private static function set_basic_help_texts() { + /* translators: %s: wp_title() function. */ + $separator_description = __( 'The separator defined in your theme\'s %s tag.', 'wordpress-seo' ); + $separator_description = sprintf( + $separator_description, + // 'wp_title()' + 'wp_title()' + ); + + $replacement_variables = [ + new WPSEO_Replacement_Variable( 'date', __( 'Date', 'wordpress-seo' ), __( 'Replaced with the date of the post/page', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'title', __( 'Title', 'wordpress-seo' ), __( 'Replaced with the title of the post/page', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'parent_title', __( 'Parent title', 'wordpress-seo' ), __( 'Replaced with the title of the parent page of the current page', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'archive_title', __( 'Archive title', 'wordpress-seo' ), __( 'Replaced with the normal title for an archive generated by WordPress', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'sitename', __( 'Site title', 'wordpress-seo' ), __( 'The site\'s name', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'sitedesc', __( 'Tagline', 'wordpress-seo' ), __( 'The site\'s tagline', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'excerpt', __( 'Excerpt', 'wordpress-seo' ), __( 'Replaced with the post/page excerpt (or auto-generated if it does not exist)', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'excerpt_only', __( 'Excerpt only', 'wordpress-seo' ), __( 'Replaced with the post/page excerpt (without auto-generation)', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'tag', __( 'Tag', 'wordpress-seo' ), __( 'Replaced with the current tag/tags', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'category', __( 'Category', 'wordpress-seo' ), __( 'Replaced with the post categories (comma separated)', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'primary_category', __( 'Primary category', 'wordpress-seo' ), __( 'Replaced with the primary category of the post/page', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'category_description', __( 'Category description', 'wordpress-seo' ), __( 'Replaced with the category description', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'tag_description', __( 'Tag description', 'wordpress-seo' ), __( 'Replaced with the tag description', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'term_description', __( 'Term description', 'wordpress-seo' ), __( 'Replaced with the term description', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'term_title', __( 'Term title', 'wordpress-seo' ), __( 'Replaced with the term name', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'searchphrase', __( 'Search phrase', 'wordpress-seo' ), __( 'Replaced with the current search phrase', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'term_hierarchy', __( 'Term hierarchy', 'wordpress-seo' ), __( 'Replaced with the term ancestors hierarchy', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'sep', __( 'Separator', 'wordpress-seo' ), $separator_description ), + new WPSEO_Replacement_Variable( 'currentdate', __( 'Current date', 'wordpress-seo' ), __( 'Replaced with the current date', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'currentyear', __( 'Current year', 'wordpress-seo' ), __( 'Replaced with the current year', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'currentmonth', __( 'Current month', 'wordpress-seo' ), __( 'Replaced with the current month', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'currentday', __( 'Current day', 'wordpress-seo' ), __( 'Replaced with the current day', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'post_year', __( 'Post year', 'wordpress-seo' ), __( 'Replaced with the year the post was published', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'post_month', __( 'Post month', 'wordpress-seo' ), __( 'Replaced with the month the post was published', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'post_day', __( 'Post day', 'wordpress-seo' ), __( 'Replaced with the day the post was published', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'author_first_name', __( 'Author first name', 'wordpress-seo' ), __( 'Replaced with the first name of the author', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'author_last_name', __( 'Author last name', 'wordpress-seo' ), __( 'Replaced with the last name of the author', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'permalink', __( 'Permalink', 'wordpress-seo' ), __( 'Replaced with the permalink', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'post_content', __( 'Post Content', 'wordpress-seo' ), __( 'Replaced with the post content', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'category_title', __( 'Category Title', 'wordpress-seo' ), __( 'Current or first category title', 'wordpress-seo' ) ), + ]; + + foreach ( $replacement_variables as $replacement_variable ) { + self::register_help_text( 'basic', $replacement_variable ); + } + } + + /** + * Set/translate the help texts for the WPSEO standard advanced variables. + * + * @return void + */ + private static function set_advanced_help_texts() { + $replacement_variables = [ + new WPSEO_Replacement_Variable( 'pt_single', __( 'Post type (singular)', 'wordpress-seo' ), __( 'Replaced with the content type single label', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'pt_plural', __( 'Post type (plural)', 'wordpress-seo' ), __( 'Replaced with the content type plural label', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'modified', __( 'Modified', 'wordpress-seo' ), __( 'Replaced with the post/page modified time', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'id', __( 'ID', 'wordpress-seo' ), __( 'Replaced with the post/page ID', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'name', __( 'Name', 'wordpress-seo' ), __( 'Replaced with the post/page author\'s \'nicename\'', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'user_description', __( 'User description', 'wordpress-seo' ), __( 'Replaced with the post/page author\'s \'Biographical Info\'', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'page', __( 'Page', 'wordpress-seo' ), __( 'Replaced with the current page number with context (i.e. page 2 of 4)', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'pagetotal', __( 'Pagetotal', 'wordpress-seo' ), __( 'Replaced with the current page total', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'pagenumber', __( 'Pagenumber', 'wordpress-seo' ), __( 'Replaced with the current page number', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'caption', __( 'Caption', 'wordpress-seo' ), __( 'Attachment caption', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'focuskw', __( 'Focus keyword', 'wordpress-seo' ), __( 'Replaced with the posts focus keyphrase', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'term404', __( 'Term404', 'wordpress-seo' ), __( 'Replaced with the slug which caused the 404', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'cf_', ' ' . __( '(custom field)', 'wordpress-seo' ), __( 'Replaced with a posts custom field value', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'ct_', ' ' . __( '(custom taxonomy)', 'wordpress-seo' ), __( 'Replaced with a posts custom taxonomies, comma separated.', 'wordpress-seo' ) ), + new WPSEO_Replacement_Variable( 'ct_desc_', ' ' . __( 'description (custom taxonomy)', 'wordpress-seo' ), __( 'Replaced with a custom taxonomies description', 'wordpress-seo' ) ), + ]; + + foreach ( $replacement_variables as $replacement_variable ) { + self::register_help_text( 'advanced', $replacement_variable ); + } + } + + /* *********************** GENERAL HELPER METHODS ************************** */ + + /** + * Remove the '%%' delimiters from a variable string. + * + * @param string $text Variable string to be cleaned. + * + * @return string + */ + private static function remove_var_delimiter( $text ) { + return trim( $text, '%' ); + } + + /** + * Add the '%%' delimiters to a variable string. + * + * @param string $text Variable string to be delimited. + * + * @return string + */ + private static function add_var_delimiter( $text ) { + return '%%' . $text . '%%'; + } + + /** + * Retrieve a post's terms, comma delimited. + * + * @param int $id ID of the post to get the terms for. + * @param string $taxonomy The taxonomy to get the terms for this post from. + * @param bool $return_single If true, return the first term. + * + * @return string Either a single term or a comma delimited string of terms. + */ + public function get_terms( $id, $taxonomy, $return_single = false ) { + $output = ''; + + // If we're on a specific tag, category or taxonomy page, use that. + if ( ! empty( $this->args->term_id ) ) { + $output = $this->args->name; + } + elseif ( ! empty( $id ) && ! empty( $taxonomy ) ) { + $terms = get_the_terms( $id, $taxonomy ); + if ( is_array( $terms ) && $terms !== [] ) { + foreach ( $terms as $term ) { + if ( $return_single ) { + $output = $term->name; + break; + } + else { + $output .= $term->name . ', '; + } + } + $output = rtrim( trim( $output ), ',' ); + } + } + unset( $terms, $term ); + + /** + * Allows filtering of the terms list used to replace %%category%%, %%tag%% + * and %%ct_%% variables. + * + * @param string $output Comma-delimited string containing the terms. + * @param string $taxonomy The taxonomy of the terms. + */ + return apply_filters( 'wpseo_terms', $output, $taxonomy ); + } + + /** + * Gets a taxonomy term hierarchy including the term to get the parents for. + * + * @return string + */ + private function get_term_hierarchy() { + if ( ! is_taxonomy_hierarchical( $this->args->taxonomy ) ) { + return ''; + } + + $separator = ' ' . $this->retrieve_sep() . ' '; + + $args = [ + 'format' => 'name', + 'separator' => $separator, + 'link' => false, + 'inclusive' => true, + ]; + + return rtrim( + get_term_parents_list( $this->args->term_id, $this->args->taxonomy, $args ), + $separator + ); + } + + /** + * Retrieves the term ancestors hierarchy. + * + * @return string|null The term ancestors hierarchy. + */ + private function retrieve_term_hierarchy() { + $replacement = null; + + if ( ! empty( $this->args->term_id ) && ! empty( $this->args->taxonomy ) ) { + $hierarchy = $this->get_term_hierarchy(); + + if ( $hierarchy !== '' ) { + $replacement = esc_html( $hierarchy ); + } + } + + return $replacement; + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/class-wpseo-replacement-variable.php b/wp-content/plugins/wordpress-seo/inc/class-wpseo-replacement-variable.php new file mode 100644 index 00000000..83dfc8c5 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/class-wpseo-replacement-variable.php @@ -0,0 +1,76 @@ +variable = $variable; + $this->label = $label; + $this->description = $description; + } + + /** + * Returns the variable to use. + * + * @return string + */ + public function get_variable() { + return $this->variable; + } + + /** + * Returns the label of the replacement variable. + * + * @return string + */ + public function get_label() { + return $this->label; + } + + /** + * Returns the description of the replacement variable. + * + * @return string + */ + public function get_description() { + return $this->description; + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/class-wpseo-shortlinker.php b/wp-content/plugins/wordpress-seo/inc/class-wpseo-shortlinker.php new file mode 100644 index 00000000..8c2fd0d9 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/class-wpseo-shortlinker.php @@ -0,0 +1,54 @@ +helpers->short_link->build( $url ); + } + + /** + * Returns a version of the URL with a utm_content with the current version. + * + * @param string $url The URL to build upon. + * + * @return string The final URL. + */ + public static function get( $url ) { + return YoastSEO()->helpers->short_link->get( $url ); + } + + /** + * Echoes a version of the URL with a utm_content with the current version. + * + * @param string $url The URL to build upon. + * + * @return void + */ + public static function show( $url ) { + YoastSEO()->helpers->short_link->show( $url ); + } + + /** + * Gets the shortlink's query params. + * + * @return array The shortlink's query params. + */ + public static function get_query_params() { + return YoastSEO()->helpers->short_link->get_query_params(); + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/class-wpseo-statistics.php b/wp-content/plugins/wordpress-seo/inc/class-wpseo-statistics.php new file mode 100644 index 00000000..687b8fab --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/class-wpseo-statistics.php @@ -0,0 +1,62 @@ +get_rank() === WPSEO_Rank::NO_FOCUS ) { + $posts = [ + 'meta_query' => [ + 'relation' => 'OR', + [ + 'key' => WPSEO_Meta::$meta_prefix . 'focuskw', + 'value' => 'needs-a-value-anyway', + 'compare' => 'NOT EXISTS', + ], + ], + ]; + } + elseif ( $rank->get_rank() === WPSEO_Rank::NO_INDEX ) { + $posts = [ + 'meta_key' => WPSEO_Meta::$meta_prefix . 'meta-robots-noindex', + 'meta_value' => '1', + 'compare' => '=', + ]; + } + else { + $posts = [ + 'meta_key' => WPSEO_Meta::$meta_prefix . 'linkdex', + 'meta_value' => [ $rank->get_starting_score(), $rank->get_end_score() ], + 'meta_compare' => 'BETWEEN', + 'meta_type' => 'NUMERIC', + ]; + } + + $posts['fields'] = 'ids'; + $posts['post_status'] = 'publish'; + + if ( current_user_can( 'edit_others_posts' ) === false ) { + $posts['author'] = get_current_user_id(); + } + + $posts = new WP_Query( $posts ); + + return (int) $posts->found_posts; + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/class-wpseo-utils.php b/wp-content/plugins/wordpress-seo/inc/class-wpseo-utils.php new file mode 100644 index 00000000..e3c1940a --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/class-wpseo-utils.php @@ -0,0 +1,1103 @@ +helpers->url->is_relative( $url ); + } + + /** + * Recursively trim whitespace round a string value or of string values within an array. + * Only trims strings to avoid typecasting a variable (to string). + * + * @since 1.8.0 + * + * @param mixed $value Value to trim or array of values to trim. + * + * @return mixed Trimmed value or array of trimmed values. + */ + public static function trim_recursive( $value ) { + if ( is_string( $value ) ) { + $value = trim( $value ); + } + elseif ( is_array( $value ) ) { + $value = array_map( [ self::class, 'trim_recursive' ], $value ); + } + + return $value; + } + + /** + * Emulate the WP native sanitize_text_field function in a %%variable%% safe way. + * + * Sanitize a string from user input or from the db. + * + * - Check for invalid UTF-8; + * - Convert single < characters to entity; + * - Strip all tags; + * - Remove line breaks, tabs and extra white space; + * - Strip octets - BUT DO NOT REMOVE (part of) VARIABLES WHICH WILL BE REPLACED. + * + * @link https://core.trac.wordpress.org/browser/trunk/src/wp-includes/formatting.php for the original. + * + * @since 1.8.0 + * + * @param string $value String value to sanitize. + * + * @return string + */ + public static function sanitize_text_field( $value ) { + $filtered = wp_check_invalid_utf8( $value ); + + if ( strpos( $filtered, '<' ) !== false ) { + $filtered = wp_pre_kses_less_than( $filtered ); + // This will strip extra whitespace for us. + $filtered = wp_strip_all_tags( $filtered, true ); + } + else { + $filtered = trim( preg_replace( '`[\r\n\t ]+`', ' ', $filtered ) ); + } + + $found = false; + while ( preg_match( '`[^%](%[a-f0-9]{2})`i', $filtered, $match ) ) { + $filtered = str_replace( $match[1], '', $filtered ); + $found = true; + } + unset( $match ); + + if ( $found ) { + // Strip out the whitespace that may now exist after removing the octets. + $filtered = trim( preg_replace( '` +`', ' ', $filtered ) ); + } + + /** + * Filter a sanitized text field string. + * + * @since WP 2.9.0 + * + * @param string $filtered The sanitized string. + * @param string $str The string prior to being sanitized. + */ + return apply_filters( 'sanitize_text_field', $filtered, $value ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Using WP native filter. + } + + /** + * Sanitize a url for saving to the database. + * Not to be confused with the old native WP function. + * + * @since 1.8.0 + * + * @param string $value String URL value to sanitize. + * @param array $allowed_protocols Optional set of allowed protocols. + * + * @return string + */ + public static function sanitize_url( $value, $allowed_protocols = [ 'http', 'https' ] ) { + + $url = ''; + $parts = wp_parse_url( $value ); + + if ( isset( $parts['scheme'], $parts['host'] ) ) { + $url = $parts['scheme'] . '://'; + + if ( isset( $parts['user'] ) ) { + $url .= rawurlencode( $parts['user'] ); + $url .= isset( $parts['pass'] ) ? ':' . rawurlencode( $parts['pass'] ) : ''; + $url .= '@'; + } + + $parts['host'] = preg_replace( + '`[^a-z0-9-.:\[\]\\x80-\\xff]`', + '', + strtolower( $parts['host'] ) + ); + + $url .= $parts['host'] . ( isset( $parts['port'] ) ? ':' . intval( $parts['port'] ) : '' ); + } + + if ( isset( $parts['path'] ) && strpos( $parts['path'], '/' ) === 0 ) { + $path = explode( '/', wp_strip_all_tags( $parts['path'] ) ); + $path = self::sanitize_encoded_text_field( $path ); + $url .= str_replace( '%40', '@', implode( '/', $path ) ); + } + + if ( ! $url ) { + return ''; + } + + if ( isset( $parts['query'] ) ) { + wp_parse_str( $parts['query'], $parsed_query ); + + $parsed_query = array_combine( + self::sanitize_encoded_text_field( array_keys( $parsed_query ) ), + self::sanitize_encoded_text_field( array_values( $parsed_query ) ) + ); + + $url = add_query_arg( $parsed_query, $url ); + } + + if ( isset( $parts['fragment'] ) ) { + $url .= '#' . self::sanitize_encoded_text_field( $parts['fragment'] ); + } + + if ( strpos( $url, '%' ) !== false ) { + $url = preg_replace_callback( + '`%[a-fA-F0-9]{2}`', + static function ( $octects ) { + return strtolower( $octects[0] ); + }, + $url + ); + } + + return esc_url_raw( $url, $allowed_protocols ); + } + + /** + * Decode, sanitize and encode the array of strings or the string. + * + * @since 13.3 + * + * @param array|string $value The value to sanitize and encode. + * + * @return array|string The sanitized value. + */ + public static function sanitize_encoded_text_field( $value ) { + if ( is_array( $value ) ) { + return array_map( [ self::class, 'sanitize_encoded_text_field' ], $value ); + } + + return rawurlencode( sanitize_text_field( rawurldecode( $value ) ) ); + } + + /** + * Validate a value as boolean. + * + * @since 1.8.0 + * + * @param mixed $value Value to validate. + * + * @return bool + */ + public static function validate_bool( $value ) { + if ( ! isset( self::$has_filters ) ) { + self::$has_filters = extension_loaded( 'filter' ); + } + + if ( self::$has_filters ) { + return filter_var( $value, FILTER_VALIDATE_BOOLEAN ); + } + else { + return self::emulate_filter_bool( $value ); + } + } + + /** + * Cast a value to bool. + * + * @since 1.8.0 + * + * @param mixed $value Value to cast. + * + * @return bool + */ + public static function emulate_filter_bool( $value ) { + $true = [ + '1', + 'true', + 'True', + 'TRUE', + 'y', + 'Y', + 'yes', + 'Yes', + 'YES', + 'on', + 'On', + 'ON', + ]; + $false = [ + '0', + 'false', + 'False', + 'FALSE', + 'n', + 'N', + 'no', + 'No', + 'NO', + 'off', + 'Off', + 'OFF', + ]; + + if ( is_bool( $value ) ) { + return $value; + } + elseif ( is_int( $value ) && ( $value === 0 || $value === 1 ) ) { + return (bool) $value; + } + elseif ( ( is_float( $value ) && ! is_nan( $value ) ) && ( $value === (float) 0 || $value === (float) 1 ) ) { + return (bool) $value; + } + elseif ( is_string( $value ) ) { + $value = trim( $value ); + if ( in_array( $value, $true, true ) ) { + return true; + } + elseif ( in_array( $value, $false, true ) ) { + return false; + } + else { + return false; + } + } + + return false; + } + + /** + * Validate a value as integer. + * + * @since 1.8.0 + * + * @param mixed $value Value to validate. + * + * @return int|bool Int or false in case of failure to convert to int. + */ + public static function validate_int( $value ) { + if ( ! isset( self::$has_filters ) ) { + self::$has_filters = extension_loaded( 'filter' ); + } + + if ( self::$has_filters ) { + return filter_var( $value, FILTER_VALIDATE_INT ); + } + else { + return self::emulate_filter_int( $value ); + } + } + + /** + * Cast a value to integer. + * + * @since 1.8.0 + * + * @param mixed $value Value to cast. + * + * @return int|bool + */ + public static function emulate_filter_int( $value ) { + if ( is_int( $value ) ) { + return $value; + } + elseif ( is_float( $value ) ) { + // phpcs:ignore Universal.Operators.StrictComparisons -- Purposeful loose comparison. + if ( (int) $value == $value && ! is_nan( $value ) ) { + return (int) $value; + } + else { + return false; + } + } + elseif ( is_string( $value ) ) { + $value = trim( $value ); + if ( $value === '' ) { + return false; + } + elseif ( ctype_digit( $value ) ) { + return (int) $value; + } + elseif ( strpos( $value, '-' ) === 0 && ctype_digit( substr( $value, 1 ) ) ) { + return (int) $value; + } + else { + return false; + } + } + + return false; + } + + /** + * Clears the WP or W3TC cache depending on which is used. + * + * @since 1.8.0 + * + * @return void + */ + public static function clear_cache() { + if ( function_exists( 'w3tc_pgcache_flush' ) ) { + w3tc_pgcache_flush(); + } + elseif ( function_exists( 'wp_cache_clear_cache' ) ) { + wp_cache_clear_cache(); + } + } + + /** + * Clear rewrite rules. + * + * @since 1.8.0 + * + * @return void + */ + public static function clear_rewrites() { + update_option( 'rewrite_rules', '' ); + } + + /** + * Do simple reliable math calculations without the risk of wrong results. + * + * In the rare case that the bcmath extension would not be loaded, it will return the normal calculation results. + * + * @link http://floating-point-gui.de/ + * @link http://php.net/language.types.float.php See the big red warning. + * + * @since 1.5.0 + * @since 1.8.0 Moved from stand-alone function to this class. + * + * @param mixed $number1 Scalar (string/int/float/bool). + * @param string $action Calculation action to execute. Valid input: + * '+' or 'add' or 'addition', + * '-' or 'sub' or 'subtract', + * '*' or 'mul' or 'multiply', + * '/' or 'div' or 'divide', + * '%' or 'mod' or 'modulus' + * '=' or 'comp' or 'compare'. + * @param mixed $number2 Scalar (string/int/float/bool). + * @param bool $round Whether or not to round the result. Defaults to false. + * Will be disregarded for a compare operation. + * @param int $decimals Decimals for rounding operation. Defaults to 0. + * @param int $precision Calculation precision. Defaults to 10. + * + * @return mixed Calculation Result or false if either or the numbers isn't scalar or + * an invalid operation was passed. + * - For compare the result will always be an integer. + * - For all other operations, the result will either be an integer (preferred) + * or a float. + */ + public static function calc( $number1, $action, $number2, $round = false, $decimals = 0, $precision = 10 ) { + static $bc; + + if ( ! is_scalar( $number1 ) || ! is_scalar( $number2 ) ) { + return false; + } + + if ( ! isset( $bc ) ) { + $bc = extension_loaded( 'bcmath' ); + } + + if ( $bc ) { + $number1 = number_format( $number1, 10, '.', '' ); + $number2 = number_format( $number2, 10, '.', '' ); + } + + $result = null; + $compare = false; + + switch ( $action ) { + case '+': + case 'add': + case 'addition': + $result = ( $bc ) ? bcadd( $number1, $number2, $precision ) /* string */ : ( $number1 + $number2 ); + break; + + case '-': + case 'sub': + case 'subtract': + $result = ( $bc ) ? bcsub( $number1, $number2, $precision ) /* string */ : ( $number1 - $number2 ); + break; + + case '*': + case 'mul': + case 'multiply': + $result = ( $bc ) ? bcmul( $number1, $number2, $precision ) /* string */ : ( $number1 * $number2 ); + break; + + case '/': + case 'div': + case 'divide': + if ( $bc ) { + $result = bcdiv( $number1, $number2, $precision ); // String, or NULL if right_operand is 0. + } + elseif ( $number2 != 0 ) { // phpcs:ignore Universal.Operators.StrictComparisons -- Purposeful loose comparison. + $result = ( $number1 / $number2 ); + } + + if ( ! isset( $result ) ) { + $result = 0; + } + break; + + case '%': + case 'mod': + case 'modulus': + if ( $bc ) { + $result = bcmod( $number1, $number2 ); // String, or NULL if modulus is 0. + } + elseif ( $number2 != 0 ) { // phpcs:ignore Universal.Operators.StrictComparisons -- Purposeful loose comparison. + $result = ( $number1 % $number2 ); + } + + if ( ! isset( $result ) ) { + $result = 0; + } + break; + + case '=': + case 'comp': + case 'compare': + $compare = true; + if ( $bc ) { + $result = bccomp( $number1, $number2, $precision ); // Returns int 0, 1 or -1. + } + else { + // phpcs:ignore Universal.Operators.StrictComparisons -- Purposeful loose comparison. + $result = ( $number1 == $number2 ) ? 0 : ( ( $number1 > $number2 ) ? 1 : -1 ); + } + break; + } + + if ( isset( $result ) ) { + if ( $compare === false ) { + if ( $round === true ) { + $result = round( floatval( $result ), $decimals ); + if ( $decimals === 0 ) { + $result = (int) $result; + } + } + else { + // phpcs:ignore Universal.Operators.StrictComparisons -- Purposeful loose comparison. + $result = ( intval( $result ) == $result ) ? intval( $result ) : floatval( $result ); + } + } + + return $result; + } + + return false; + } + + /** + * Trim whitespace and NBSP (Non-breaking space) from string. + * + * @since 2.0.0 + * + * @param string $text String input to trim. + * + * @return string + */ + public static function trim_nbsp_from_string( $text ) { + $find = [ ' ', chr( 0xC2 ) . chr( 0xA0 ) ]; + $text = str_replace( $find, ' ', $text ); + $text = trim( $text ); + + return $text; + } + + /** + * Check if a string is a valid datetime. + * + * @since 2.0.0 + * + * @param string $datetime String input to check as valid input for DateTime class. + * + * @return bool + */ + public static function is_valid_datetime( $datetime ) { + return YoastSEO()->helpers->date->is_valid_datetime( $datetime ); + } + + /** + * Format the URL to be sure it is okay for using as a redirect url. + * + * This method will parse the URL and combine them in one string. + * + * @since 2.3.0 + * + * @param string $url URL string. + * + * @return mixed + */ + public static function format_url( $url ) { + $parsed_url = wp_parse_url( $url ); + + $formatted_url = ''; + if ( ! empty( $parsed_url['path'] ) ) { + $formatted_url = $parsed_url['path']; + } + + // Prepend a slash if first char != slash. + if ( stripos( $formatted_url, '/' ) !== 0 ) { + $formatted_url = '/' . $formatted_url; + } + + // Append 'query' string if it exists. + if ( ! empty( $parsed_url['query'] ) ) { + $formatted_url .= '?' . $parsed_url['query']; + } + + return apply_filters( 'wpseo_format_admin_url', $formatted_url ); + } + + /** + * Retrieves the sitename. + * + * @since 3.0.0 + * + * @return string + */ + public static function get_site_name() { + return YoastSEO()->helpers->site->get_site_name(); + } + + /** + * Check if the current opened page is a Yoast SEO page. + * + * @since 3.0.0 + * + * @return bool + */ + public static function is_yoast_seo_page() { + return YoastSEO()->helpers->current_page->is_yoast_seo_page(); + } + + /** + * Check if the current opened page belongs to Yoast SEO Free. + * + * @since 3.3.0 + * + * @param string $current_page The current page the user is on. + * + * @return bool + */ + public static function is_yoast_seo_free_page( $current_page ) { + $yoast_seo_free_pages = [ + 'wpseo_dashboard', + 'wpseo_tools', + 'wpseo_search_console', + 'wpseo_licenses', + ]; + + return in_array( $current_page, $yoast_seo_free_pages, true ); + } + + /** + * Determine if Yoast SEO is in development mode? + * + * Inspired by JetPack (https://github.com/Automattic/jetpack/blob/master/class.jetpack.php#L1383-L1406). + * + * @since 3.0.0 + * + * @return bool + */ + public static function is_development_mode() { + $development_mode = false; + + if ( defined( 'YOAST_ENVIRONMENT' ) && YOAST_ENVIRONMENT === 'development' ) { + $development_mode = true; + } + elseif ( defined( 'WPSEO_DEBUG' ) ) { + $development_mode = WPSEO_DEBUG; + } + elseif ( site_url() && strpos( site_url(), '.' ) === false ) { + $development_mode = true; + } + + /** + * Filter the Yoast SEO development mode. + * + * @since 3.0 + * + * @param bool $development_mode Is Yoast SEOs development mode active. + */ + return apply_filters( 'yoast_seo_development_mode', $development_mode ); + } + + /** + * Retrieve home URL with proper trailing slash. + * + * @since 3.3.0 + * + * @param string $path Path relative to home URL. + * @param string|null $scheme Scheme to apply. + * + * @return string Home URL with optional path, appropriately slashed if not. + */ + public static function home_url( $path = '', $scheme = null ) { + return YoastSEO()->helpers->url->home( $path, $scheme ); + } + + /** + * Checks if the WP-REST-API is available. + * + * @since 3.6 + * @since 3.7 Introduced the $minimum_version parameter. + * + * @param string $minimum_version The minimum version the API should be. + * + * @return bool Returns true if the API is available. + */ + public static function is_api_available( $minimum_version = '2.0' ) { + return ( defined( 'REST_API_VERSION' ) + && version_compare( REST_API_VERSION, $minimum_version, '>=' ) ); + } + + /** + * Determine whether or not the metabox should be displayed for a post type. + * + * @param string|null $post_type Optional. The post type to check the visibility of the metabox for. + * + * @return bool Whether or not the metabox should be displayed. + */ + protected static function display_post_type_metabox( $post_type = null ) { + if ( ! isset( $post_type ) ) { + $post_type = get_post_type(); + } + + if ( ! isset( $post_type ) || ! WPSEO_Post_Type::is_post_type_accessible( $post_type ) ) { + return false; + } + + if ( $post_type === 'attachment' && WPSEO_Options::get( 'disable-attachment' ) ) { + return false; + } + + return apply_filters( 'wpseo_enable_editor_features_' . $post_type, WPSEO_Options::get( 'display-metabox-pt-' . $post_type ) ); + } + + /** + * Determine whether or not the metabox should be displayed for a taxonomy. + * + * @param string|null $taxonomy Optional. The post type to check the visibility of the metabox for. + * + * @return bool Whether or not the metabox should be displayed. + */ + protected static function display_taxonomy_metabox( $taxonomy = null ) { + if ( ! isset( $taxonomy ) || ! in_array( $taxonomy, get_taxonomies( [ 'public' => true ], 'names' ), true ) ) { + return false; + } + + return WPSEO_Options::get( 'display-metabox-tax-' . $taxonomy ); + } + + /** + * Determines whether the metabox is active for the given identifier and type. + * + * @param string $identifier The identifier to check for. + * @param string $type The type to check for. + * + * @return bool Whether or not the metabox is active. + */ + public static function is_metabox_active( $identifier, $type ) { + if ( $type === 'post_type' ) { + return self::display_post_type_metabox( $identifier ); + } + + if ( $type === 'taxonomy' ) { + return self::display_taxonomy_metabox( $identifier ); + } + + return false; + } + + /** + * Determines whether the plugin is active for the entire network. + * + * @return bool Whether the plugin is network-active. + */ + public static function is_plugin_network_active() { + return YoastSEO()->helpers->url->is_plugin_network_active(); + } + + /** + * Gets the type of the current post. + * + * @return string The post type, or an empty string. + */ + public static function get_post_type() { + $wp_screen = get_current_screen(); + + if ( $wp_screen !== null && ! empty( $wp_screen->post_type ) ) { + return $wp_screen->post_type; + } + return ''; + } + + /** + * Gets the type of the current page. + * + * @return string Returns 'post' if the current page is a post edit page. Taxonomy in other cases. + */ + public static function get_page_type() { + global $pagenow; + if ( WPSEO_Metabox::is_post_edit( $pagenow ) ) { + return 'post'; + } + + return 'taxonomy'; + } + + /** + * Getter for the Adminl10n array. Applies the wpseo_admin_l10n filter. + * + * @return array The Adminl10n array. + */ + public static function get_admin_l10n() { + $post_type = self::get_post_type(); + $page_type = self::get_page_type(); + + $label_object = false; + $no_index = false; + + if ( $page_type === 'post' ) { + $label_object = get_post_type_object( $post_type ); + $no_index = WPSEO_Options::get( 'noindex-' . $post_type, false ); + } + else { + $label_object = WPSEO_Taxonomy::get_labels(); + + $wp_screen = get_current_screen(); + + if ( $wp_screen !== null && ! empty( $wp_screen->taxonomy ) ) { + $taxonomy_slug = $wp_screen->taxonomy; + $no_index = WPSEO_Options::get( 'noindex-tax-' . $taxonomy_slug, false ); + } + } + + $wpseo_admin_l10n = [ + 'displayAdvancedTab' => WPSEO_Capability_Utils::current_user_can( 'wpseo_edit_advanced_metadata' ) || ! WPSEO_Options::get( 'disableadvanced_meta' ), + 'noIndex' => (bool) $no_index, + 'isPostType' => (bool) get_post_type(), + 'postType' => get_post_type(), + 'postTypeNamePlural' => ( $page_type === 'post' ) ? $label_object->label : $label_object->name, + 'postTypeNameSingular' => ( $page_type === 'post' ) ? $label_object->labels->singular_name : $label_object->singular_name, + 'isBreadcrumbsDisabled' => WPSEO_Options::get( 'breadcrumbs-enable', false ) !== true && ! current_theme_supports( 'yoast-seo-breadcrumbs' ), + // phpcs:ignore Generic.ControlStructures.DisallowYodaConditions -- Bug: squizlabs/PHP_CodeSniffer#2962. + 'isPrivateBlog' => ( (string) get_option( 'blog_public' ) ) === '0', + 'news_seo_is_active' => ( defined( 'WPSEO_NEWS_FILE' ) ), + 'isAiFeatureActive' => (bool) WPSEO_Options::get( 'enable_ai_generator' ), + ]; + + $additional_entries = apply_filters( 'wpseo_admin_l10n', [] ); + if ( is_array( $additional_entries ) ) { + $wpseo_admin_l10n = array_merge( $wpseo_admin_l10n, $additional_entries ); + } + + return $wpseo_admin_l10n; + } + + /** + * Retrieves the analysis worker log level. Defaults to errors only. + * + * Uses bool YOAST_SEO_DEBUG as flag to enable logging. Off equals ERROR. + * Uses string YOAST_SEO_DEBUG_ANALYSIS_WORKER as log level for the Analysis + * Worker. Defaults to INFO. + * Can be: TRACE, DEBUG, INFO, WARN or ERROR. + * + * @return string The log level to use. + */ + public static function get_analysis_worker_log_level() { + if ( defined( 'YOAST_SEO_DEBUG' ) && YOAST_SEO_DEBUG ) { + return defined( 'YOAST_SEO_DEBUG_ANALYSIS_WORKER' ) ? YOAST_SEO_DEBUG_ANALYSIS_WORKER : 'INFO'; + } + + return 'ERROR'; + } + + /** + * Returns the unfiltered home URL. + * + * In case WPML is installed, returns the original home_url and not the WPML version. + * In case of a multisite setup we return the network_home_url. + * + * @codeCoverageIgnore + * + * @return string The home url. + */ + public static function get_home_url() { + return YoastSEO()->helpers->url->network_safe_home_url(); + } + + /** + * Prepares data for outputting as JSON. + * + * @param array $data The data to format. + * + * @return false|string The prepared JSON string. + */ + public static function format_json_encode( $data ) { + $flags = ( JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ); + + if ( self::is_development_mode() ) { + $flags = ( $flags | JSON_PRETTY_PRINT ); + + /** + * Filter the Yoast SEO development mode. + * + * @param array $data Allows filtering of the JSON data for debug purposes. + */ + $data = apply_filters( 'wpseo_debug_json_data', $data ); + } + + // phpcs:ignore Yoast.Yoast.JsonEncodeAlternative.FoundWithAdditionalParams -- This is the definition of format_json_encode. + return wp_json_encode( $data, $flags ); + } + + /** + * Extends the allowed post tags with accessibility-related attributes. + * + * @codeCoverageIgnore + * + * @param array $allowed_post_tags The allowed post tags. + * + * @return array The allowed tags including post tags, input tags and select tags. + */ + public static function extend_kses_post_with_a11y( $allowed_post_tags ) { + static $a11y_tags; + + if ( isset( $a11y_tags ) === false ) { + $a11y_tags = [ + 'button' => [ + 'aria-expanded' => true, + 'aria-controls' => true, + ], + 'div' => [ + 'tabindex' => true, + ], + // Below are attributes that are needed for backwards compatibility (WP < 5.1). + 'span' => [ + 'aria-hidden' => true, + ], + 'input' => [ + 'aria-describedby' => true, + ], + 'select' => [ + 'aria-describedby' => true, + ], + 'textarea' => [ + 'aria-describedby' => true, + ], + ]; + + // Add the global allowed attributes to each html element. + $a11y_tags = array_map( '_wp_add_global_attributes', $a11y_tags ); + } + + return array_merge_recursive( $allowed_post_tags, $a11y_tags ); + } + + /** + * Extends the allowed post tags with input, select and option tags. + * + * @codeCoverageIgnore + * + * @param array $allowed_post_tags The allowed post tags. + * + * @return array The allowed tags including post tags, input tags, select tags and option tags. + */ + public static function extend_kses_post_with_forms( $allowed_post_tags ) { + static $input_tags; + + if ( isset( $input_tags ) === false ) { + $input_tags = [ + 'input' => [ + 'accept' => true, + 'accesskey' => true, + 'align' => true, + 'alt' => true, + 'autocomplete' => true, + 'autofocus' => true, + 'checked' => true, + 'contenteditable' => true, + 'dirname' => true, + 'disabled' => true, + 'draggable' => true, + 'dropzone' => true, + 'form' => true, + 'formaction' => true, + 'formenctype' => true, + 'formmethod' => true, + 'formnovalidate' => true, + 'formtarget' => true, + 'height' => true, + 'hidden' => true, + 'lang' => true, + 'list' => true, + 'max' => true, + 'maxlength' => true, + 'min' => true, + 'multiple' => true, + 'name' => true, + 'pattern' => true, + 'placeholder' => true, + 'readonly' => true, + 'required' => true, + 'size' => true, + 'spellcheck' => true, + 'src' => true, + 'step' => true, + 'tabindex' => true, + 'translate' => true, + 'type' => true, + 'value' => true, + 'width' => true, + + /* + * Below are attributes that are needed for backwards compatibility (WP < 5.1). + * They are used for the social media image in the metabox. + * These can be removed once we move to the React versions of the social previews. + */ + 'data-target' => true, + 'data-target-id' => true, + ], + 'select' => [ + 'accesskey' => true, + 'autofocus' => true, + 'contenteditable' => true, + 'disabled' => true, + 'draggable' => true, + 'dropzone' => true, + 'form' => true, + 'hidden' => true, + 'lang' => true, + 'multiple' => true, + 'name' => true, + 'onblur' => true, + 'onchange' => true, + 'oncontextmenu' => true, + 'onfocus' => true, + 'oninput' => true, + 'oninvalid' => true, + 'onreset' => true, + 'onsearch' => true, + 'onselect' => true, + 'onsubmit' => true, + 'required' => true, + 'size' => true, + 'spellcheck' => true, + 'tabindex' => true, + 'translate' => true, + ], + 'option' => [ + 'class' => true, + 'disabled' => true, + 'id' => true, + 'label' => true, + 'selected' => true, + 'value' => true, + ], + ]; + + // Add the global allowed attributes to each html element. + $input_tags = array_map( '_wp_add_global_attributes', $input_tags ); + } + + return array_merge_recursive( $allowed_post_tags, $input_tags ); + } + + /** + * Gets an array of enabled features. + * + * @return string[] The array of enabled features. + */ + public static function retrieve_enabled_features() { + /** + * The feature flag integration. + * + * @var Feature_Flag_Integration $feature_flag_integration; + */ + $feature_flag_integration = YoastSEO()->classes->get( Feature_Flag_Integration::class ); + return $feature_flag_integration->get_enabled_features(); + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/class-yoast-dynamic-rewrites.php b/wp-content/plugins/wordpress-seo/inc/class-yoast-dynamic-rewrites.php new file mode 100644 index 00000000..eb029464 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/class-yoast-dynamic-rewrites.php @@ -0,0 +1,178 @@ +register_hooks(); + } + + return self::$instance; + } + + /** + * Constructor. + * + * Sets the WP_Rewrite instance to use. + * + * @param WP_Rewrite|null $rewrite Optional. WP_Rewrite instance to use. Default is the $wp_rewrite global. + * @throws RuntimeException Throws an exception if the $wp_rewrite global is not set. + */ + public function __construct( $rewrite = null ) { + if ( ! $rewrite ) { + if ( empty( $GLOBALS['wp_rewrite'] ) ) { + /* translators: 1: PHP class name, 2: PHP variable name */ + throw new RuntimeException( sprintf( __( 'The %1$s class must not be instantiated before the %2$s global is set.', 'wordpress-seo' ), self::class, '$wp_rewrite' ) ); + } + + $rewrite = $GLOBALS['wp_rewrite']; + } + + $this->wp_rewrite = $rewrite; + } + + /** + * Registers all necessary hooks with WordPress. + * + * @return void + */ + public function register_hooks() { + add_action( 'init', [ $this, 'trigger_dynamic_rewrite_rules_hook' ], 1 ); + add_filter( 'option_rewrite_rules', [ $this, 'filter_rewrite_rules_option' ] ); + add_filter( 'sanitize_option_rewrite_rules', [ $this, 'sanitize_rewrite_rules_option' ] ); + } + + /** + * Adds a dynamic rewrite rule that transforms a URL structure to a set of query vars. + * + * Rules registered with this method are applied dynamically and do not require the rewrite rules + * to be flushed in order to become active, which is a benefit over the regular WordPress core API. + * Note however that the dynamic application only works for rules that correspond to index.php. + * Non-WordPress rewrite rules still require flushing. + * + * Any value in the $after parameter that isn't 'bottom' will result in the rule + * being placed at the top of the rewrite rules. + * + * @param string $regex Regular expression to match request against. + * @param string|array $query The corresponding query vars for this rewrite rule. + * @param string $priority Optional. Priority of the new rule. Accepts 'top' + * or 'bottom'. Default 'bottom'. + * + * @return void + */ + public function add_rule( $regex, $query, $priority = 'bottom' ) { + if ( is_array( $query ) ) { + $query = add_query_arg( $query, 'index.php' ); + } + + $this->wp_rewrite->add_rule( $regex, $query, $priority ); + + // Do not further handle external rules. + if ( substr( $query, 0, strlen( $this->wp_rewrite->index . '?' ) ) !== $this->wp_rewrite->index . '?' ) { + return; + } + + if ( $priority === 'bottom' ) { + $this->extra_rules_bottom[ $regex ] = $query; + return; + } + + $this->extra_rules_top[ $regex ] = $query; + } + + /** + * Triggers the hook on which rewrite rules should be added. + * + * This allows for a more specific point in time from the generic `init` hook where this is + * otherwise handled. + * + * @return void + */ + public function trigger_dynamic_rewrite_rules_hook() { + + /** + * Fires when the plugin's dynamic rewrite rules should be added. + * + * @param self $dynamic_rewrites Dynamic rewrites handler instance. Use its `add_rule()` method + * to add dynamic rewrite rules. + */ + do_action( 'yoast_add_dynamic_rewrite_rules', $this ); + } + + /** + * Filters the rewrite rules option to dynamically add additional rewrite rules. + * + * @param array|string $rewrite_rules Array of rewrite rule $regex => $query pairs, or empty string + * if currently not set. + * + * @return array|string Filtered value of $rewrite_rules. + */ + public function filter_rewrite_rules_option( $rewrite_rules ) { + // Do not add extra rewrite rules if the rules need to be flushed. + if ( empty( $rewrite_rules ) ) { + return $rewrite_rules; + } + + return array_merge( $this->extra_rules_top, $rewrite_rules, $this->extra_rules_bottom ); + } + + /** + * Sanitizes the rewrite rules option prior to writing it to the database. + * + * This method ensures that the dynamic rewrite rules do not become part of the actual option. + * + * @param array|string $rewrite_rules Array pf rewrite rule $regex => $query pairs, or empty string + * in order to unset. + * + * @return array|string Filtered value of $rewrite_rules before writing the option. + */ + public function sanitize_rewrite_rules_option( $rewrite_rules ) { + if ( empty( $rewrite_rules ) ) { + return $rewrite_rules; + } + + return array_diff_key( $rewrite_rules, $this->extra_rules_top, $this->extra_rules_bottom ); + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/date-helper.php b/wp-content/plugins/wordpress-seo/inc/date-helper.php new file mode 100644 index 00000000..f6489a47 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/date-helper.php @@ -0,0 +1,61 @@ +helpers->date->format( $date, $format ); + } + + /** + * Formats the given timestamp to the needed format. + * + * @param int $timestamp The timestamp to use for the formatting. + * @param string $format The format that the passed date should be in. + * + * @return string The formatted date. + */ + public function format_timestamp( $timestamp, $format = DATE_W3C ) { + return YoastSEO()->helpers->date->format_timestamp( $timestamp, $format ); + } + + /** + * Formats a given date in UTC TimeZone format and translate it to the set language. + * + * @param string $date String representing the date / time. + * @param string $format The format that the passed date should be in. + * + * @return string The formatted and translated date. + */ + public function format_translated( $date, $format = DATE_W3C ) { + return YoastSEO()->helpers->date->format_translated( $date, $format ); + } + + /** + * Check if a string is a valid datetime. + * + * @param string $datetime String input to check as valid input for DateTime class. + * + * @return bool True when datatime is valid. + */ + public function is_valid_datetime( $datetime ) { + return YoastSEO()->helpers->date->is_valid_datetime( $datetime ); + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/exceptions/class-myyoast-bad-request-exception.php b/wp-content/plugins/wordpress-seo/inc/exceptions/class-myyoast-bad-request-exception.php new file mode 100644 index 00000000..d9d9f9a8 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/exceptions/class-myyoast-bad-request-exception.php @@ -0,0 +1,13 @@ +get_defaults(); + * + * @var array + */ + protected $defaults = []; + + /** + * Available options for the 'access' setting. Used for input validation. + * + * {@internal Important: Make sure the options added to the array here are in line + * with the keys for the options set for the select box in the + * admin/pages/network.php file.}} + * + * @var array + */ + public static $allowed_access_options = [ + 'admin', + 'superadmin', + ]; + + /** + * Get the singleton instance of this class. + * + * @return object + */ + public static function get_instance() { + if ( ! ( self::$instance instanceof self ) ) { + self::$instance = new self(); + } + + return self::$instance; + } + + /** + * Only run parent constructor in multisite context. + */ + public function __construct() { + $allow_prefix = self::ALLOW_KEY_PREFIX; + $this->defaults = [ + 'access' => 'admin', + 'defaultblog' => '', // Numeric blog ID or empty. + "{$allow_prefix}disableadvanced_meta" => true, + "{$allow_prefix}ryte_indexability" => false, + "{$allow_prefix}content_analysis_active" => true, + "{$allow_prefix}keyword_analysis_active" => true, + "{$allow_prefix}inclusive_language_analysis_active" => true, + "{$allow_prefix}enable_admin_bar_menu" => true, + "{$allow_prefix}enable_cornerstone_content" => true, + "{$allow_prefix}enable_xml_sitemap" => true, + "{$allow_prefix}enable_text_link_counter" => true, + "{$allow_prefix}enable_headless_rest_endpoints" => true, + "{$allow_prefix}enable_metabox_insights" => true, + "{$allow_prefix}enable_link_suggestions" => true, + "{$allow_prefix}tracking" => true, + "{$allow_prefix}enable_enhanced_slack_sharing" => true, + "{$allow_prefix}semrush_integration_active" => true, + "{$allow_prefix}zapier_integration_active" => true, + "{$allow_prefix}wincher_integration_active" => false, + "{$allow_prefix}remove_feed_global" => true, + "{$allow_prefix}remove_feed_global_comments" => true, + "{$allow_prefix}remove_feed_post_comments" => true, + "{$allow_prefix}enable_index_now" => true, + "{$allow_prefix}enable_ai_generator" => true, + "{$allow_prefix}remove_feed_authors" => true, + "{$allow_prefix}remove_feed_categories" => true, + "{$allow_prefix}remove_feed_tags" => true, + "{$allow_prefix}remove_feed_custom_taxonomies" => true, + "{$allow_prefix}remove_feed_post_types" => true, + "{$allow_prefix}remove_feed_search" => true, + "{$allow_prefix}remove_atom_rdf_feeds" => true, + "{$allow_prefix}remove_shortlinks" => true, + "{$allow_prefix}remove_rest_api_links" => true, + "{$allow_prefix}remove_rsd_wlw_links" => true, + "{$allow_prefix}remove_oembed_links" => true, + "{$allow_prefix}remove_generator" => true, + "{$allow_prefix}remove_emoji_scripts" => true, + "{$allow_prefix}remove_powered_by_header" => true, + "{$allow_prefix}remove_pingback_header" => true, + "{$allow_prefix}clean_campaign_tracking_urls" => true, + "{$allow_prefix}clean_permalinks" => true, + "{$allow_prefix}search_cleanup" => true, + "{$allow_prefix}search_cleanup_emoji" => true, + "{$allow_prefix}search_cleanup_patterns" => true, + "{$allow_prefix}redirect_search_pretty_urls" => true, + "{$allow_prefix}algolia_integration_active" => true, + ]; + + if ( is_multisite() ) { + parent::__construct(); + + add_filter( 'admin_title', [ 'Yoast_Input_Validation', 'add_yoast_admin_document_title_errors' ] ); + } + } + + /** + * Add filters to make sure that the option default is returned if the option is not set + * + * @return void + */ + public function add_default_filters() { + // Don't change, needs to check for false as could return prio 0 which would evaluate to false. + if ( has_filter( 'default_site_option_' . $this->option_name, [ $this, 'get_defaults' ] ) === false ) { + add_filter( 'default_site_option_' . $this->option_name, [ $this, 'get_defaults' ] ); + } + } + + /** + * Remove the default filters. + * Called from the validate() method to prevent failure to add new options. + * + * @return void + */ + public function remove_default_filters() { + remove_filter( 'default_site_option_' . $this->option_name, [ $this, 'get_defaults' ] ); + } + + /** + * Add filters to make sure that the option is merged with its defaults before being returned. + * + * @return void + */ + public function add_option_filters() { + // Don't change, needs to check for false as could return prio 0 which would evaluate to false. + if ( has_filter( 'site_option_' . $this->option_name, [ $this, 'get_option' ] ) === false ) { + add_filter( 'site_option_' . $this->option_name, [ $this, 'get_option' ] ); + } + } + + /** + * Remove the option filters. + * Called from the clean_up methods to make sure we retrieve the original old option. + * + * @return void + */ + public function remove_option_filters() { + remove_filter( 'site_option_' . $this->option_name, [ $this, 'get_option' ] ); + } + + /* *********** METHODS influencing add_uption(), update_option() and saving from admin pages *********** */ + + /** + * Validate the option. + * + * @param array $dirty New value for the option. + * @param array $clean Clean value for the option, normally the defaults. + * @param array $old Old value of the option. + * + * @return array Validated clean value for the option to be saved to the database. + */ + protected function validate_option( $dirty, $clean, $old ) { + + foreach ( $clean as $key => $value ) { + switch ( $key ) { + case 'access': + if ( isset( $dirty[ $key ] ) && in_array( $dirty[ $key ], self::$allowed_access_options, true ) ) { + $clean[ $key ] = $dirty[ $key ]; + } + elseif ( function_exists( 'add_settings_error' ) ) { + add_settings_error( + $this->group_name, // Slug title of the setting. + $key, // Suffix-ID for the error message box. + /* translators: %1$s expands to the option name and %2$sexpands to Yoast SEO */ + sprintf( __( '%1$s is not a valid choice for who should be allowed access to the %2$s settings. Value reset to the default.', 'wordpress-seo' ), esc_html( sanitize_text_field( $dirty[ $key ] ) ), 'Yoast SEO' ), // The error message. + 'error' // Message type. + ); + } + break; + + case 'defaultblog': + if ( isset( $dirty[ $key ] ) && ( $dirty[ $key ] !== '' && $dirty[ $key ] !== '-' ) ) { + $int = WPSEO_Utils::validate_int( $dirty[ $key ] ); + if ( $int !== false && $int > 0 ) { + // Check if a valid blog number has been received. + $exists = get_blog_details( $int, false ); + if ( $exists && $exists->deleted === '0' ) { + $clean[ $key ] = $int; + } + elseif ( function_exists( 'add_settings_error' ) ) { + add_settings_error( + $this->group_name, // Slug title of the setting. + $key, // Suffix-ID for the error message box. + esc_html__( 'The default blog setting must be the numeric blog id of the blog you want to use as default.', 'wordpress-seo' ) + . '
    ' + . sprintf( + /* translators: %s is the ID number of a blog. */ + esc_html__( 'This must be an existing blog. Blog %s does not exist or has been marked as deleted.', 'wordpress-seo' ), + '' . esc_html( sanitize_text_field( $dirty[ $key ] ) ) . '' + ), // The error message. + 'error' // Message type. + ); + } + unset( $exists ); + } + elseif ( function_exists( 'add_settings_error' ) ) { + add_settings_error( + $this->group_name, // Slug title of the setting. + $key, // Suffix-ID for the error message box. + esc_html__( 'The default blog setting must be the numeric blog id of the blog you want to use as default.', 'wordpress-seo' ) . '
    ' . esc_html__( 'No numeric value was received.', 'wordpress-seo' ), // The error message. + 'error' // Message type. + ); + } + unset( $int ); + } + break; + + default: + $clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : false ); + break; + } + } + + return $clean; + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-social.php b/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-social.php new file mode 100644 index 00000000..6eef17ab --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-social.php @@ -0,0 +1,336 @@ +get_defaults(); + * + * @var array + */ + protected $defaults = [ + // Form fields. + 'facebook_site' => '', // Text field. + 'instagram_url' => '', + 'linkedin_url' => '', + 'myspace_url' => '', + 'og_default_image' => '', // Text field. + 'og_default_image_id' => '', + 'og_frontpage_title' => '', // Text field. + 'og_frontpage_desc' => '', // Text field. + 'og_frontpage_image' => '', // Text field. + 'og_frontpage_image_id' => '', + 'opengraph' => true, + 'pinterest_url' => '', + 'pinterestverify' => '', + 'twitter' => true, + 'twitter_site' => '', // Text field. + 'twitter_card_type' => 'summary_large_image', + 'youtube_url' => '', + 'wikipedia_url' => '', + 'other_social_urls' => [], + 'mastodon_url' => '', + ]; + + /** + * Array of sub-options which should not be overloaded with multi-site defaults. + * + * @var array + */ + public $ms_exclude = [ + /* Privacy. */ + 'pinterestverify', + ]; + + /** + * Array of allowed twitter card types. + * + * While we only have the options summary and summary_large_image in the + * interface now, we might change that at some point. + * + * {@internal Uncomment any of these to allow them in validation *and* automatically + * add them as a choice in the options page.}} + * + * @var array + */ + public static $twitter_card_types = [ + 'summary_large_image' => '', + // 'summary' => '', + // 'photo' => '', + // 'gallery' => '', + // 'app' => '', + // 'player' => '', + // 'product' => '', + ]; + + /** + * Add the actions and filters for the option. + */ + protected function __construct() { + parent::__construct(); + + add_filter( 'admin_title', [ 'Yoast_Input_Validation', 'add_yoast_admin_document_title_errors' ] ); + } + + /** + * Get the singleton instance of this class. + * + * @return object + */ + public static function get_instance() { + if ( ! ( self::$instance instanceof self ) ) { + self::$instance = new self(); + } + + return self::$instance; + } + + /** + * Translate/set strings used in the option defaults. + * + * @return void + */ + public function translate_defaults() { + self::$twitter_card_types['summary_large_image'] = __( 'Summary with large image', 'wordpress-seo' ); + } + + /** + * Validate the option. + * + * @param array $dirty New value for the option. + * @param array $clean Clean value for the option, normally the defaults. + * @param array $old Old value of the option. + * + * @return array Validated clean value for the option to be saved to the database. + */ + protected function validate_option( $dirty, $clean, $old ) { + + foreach ( $clean as $key => $value ) { + switch ( $key ) { + /* Text fields. */ + case 'og_frontpage_desc': + case 'og_frontpage_title': + if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) { + $clean[ $key ] = WPSEO_Utils::sanitize_text_field( $dirty[ $key ] ); + } + break; + + case 'og_default_image_id': + case 'og_frontpage_image_id': + if ( isset( $dirty[ $key ] ) ) { + $clean[ $key ] = (int) $dirty[ $key ]; + + if ( $dirty[ $key ] === '' ) { + $clean[ $key ] = $dirty[ $key ]; + } + } + break; + + /* URL text fields - no ftp allowed. */ + case 'facebook_site': + case 'instagram_url': + case 'linkedin_url': + case 'myspace_url': + case 'pinterest_url': + case 'og_default_image': + case 'og_frontpage_image': + case 'youtube_url': + case 'wikipedia_url': + case 'mastodon_url': + $this->validate_url( $key, $dirty, $old, $clean ); + break; + + case 'pinterestverify': + $this->validate_verification_string( $key, $dirty, $old, $clean ); + break; + + /* Twitter user name. */ + case 'twitter_site': + if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) { + $twitter_id = $this->validate_twitter_id( $dirty[ $key ] ); + + if ( $twitter_id ) { + $clean[ $key ] = $twitter_id; + } + else { + if ( isset( $old[ $key ] ) && $old[ $key ] !== '' ) { + $twitter_id = sanitize_text_field( ltrim( $old[ $key ], '@' ) ); + if ( preg_match( '`^[A-Za-z0-9_]{1,25}$`', $twitter_id ) ) { + $clean[ $key ] = $twitter_id; + } + } + if ( function_exists( 'add_settings_error' ) ) { + add_settings_error( + $this->group_name, // Slug title of the setting. + $key, // Suffix-ID for the error message box. + sprintf( + /* translators: %s expands to a twitter user name. */ + __( '%s does not seem to be a valid Twitter Username. Please correct.', 'wordpress-seo' ), + '' . esc_html( sanitize_text_field( $dirty[ $key ] ) ) . '' + ), // The error message. + 'error' // Message type. + ); + } + } + unset( $twitter_id ); + + Yoast_Input_Validation::add_dirty_value_to_settings_errors( $key, $dirty[ $key ] ); + } + break; + + case 'twitter_card_type': + if ( isset( $dirty[ $key ], self::$twitter_card_types[ $dirty[ $key ] ] ) && $dirty[ $key ] !== '' ) { + $clean[ $key ] = $dirty[ $key ]; + } + break; + + /* Boolean fields. */ + case 'opengraph': + case 'twitter': + $clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : false ); + break; + + /* Array fields. */ + case 'other_social_urls': + if ( isset( $dirty[ $key ] ) ) { + $items = $dirty[ $key ]; + if ( ! is_array( $items ) ) { + $items = json_decode( $dirty[ $key ], true ); + } + + if ( is_array( $items ) ) { + foreach ( $items as $item_key => $item ) { + $validated_url = $this->validate_social_url( $item ); + + if ( $validated_url === false ) { + // Restore the previous URL values, if any. + $old_urls = ( isset( $old[ $key ] ) ) ? $old[ $key ] : []; + foreach ( $old_urls as $old_item_key => $old_url ) { + if ( $old_url !== '' ) { + $url = WPSEO_Utils::sanitize_url( $old_url ); + if ( $url !== '' ) { + $clean[ $key ][ $old_item_key ] = $url; + } + } + } + break; + } + + // The URL format is valid, let's sanitize it. + $url = WPSEO_Utils::sanitize_url( $validated_url ); + if ( $url !== '' ) { + $clean[ $key ][ $item_key ] = $url; + } + } + } + } + + break; + } + } + + return $clean; + } + + /** + * Validates a social URL. + * + * @param string $url The url to be validated. + * + * @return string|false The validated URL or false if the URL is not valid. + */ + public function validate_social_url( $url ) { + $validated_url = filter_var( WPSEO_Utils::sanitize_url( trim( $url ) ), FILTER_VALIDATE_URL ); + + return $validated_url; + } + + /** + * Validates a twitter id. + * + * @param string $twitter_id The twitter id to be validated. + * @param bool $strip_at_sign Whether or not to strip the `@` sign. + * + * @return string|false The validated twitter id or false if it is not valid. + */ + public function validate_twitter_id( $twitter_id, $strip_at_sign = true ) { + $twitter_id = ( $strip_at_sign ) ? sanitize_text_field( ltrim( $twitter_id, '@' ) ) : sanitize_text_field( $twitter_id ); + + /* + * From the Twitter documentation about twitter screen names: + * Typically a maximum of 15 characters long, but some historical accounts + * may exist with longer names. + * A username can only contain alphanumeric characters (letters A-Z, numbers 0-9) + * with the exception of underscores. + * + * @link https://support.twitter.com/articles/101299-why-can-t-i-register-certain-usernames + */ + if ( preg_match( '`^[A-Za-z0-9_]{1,25}$`', $twitter_id ) ) { + return $twitter_id; + } + + if ( preg_match( '`^http(?:s)?://(?:www\.)?(?:twitter|x)\.com/(?P[A-Za-z0-9_]{1,25})/?$`', $twitter_id, $matches ) ) { + return $matches['handle']; + } + + return false; + } + + /** + * Clean a given option value. + * + * @param array $option_value Old (not merged with defaults or filtered) option value to + * clean according to the rules for this option. + * @param string|null $current_version Optional. Version from which to upgrade, if not set, + * version specific upgrades will be disregarded. + * @param array|null $all_old_option_values Optional. Only used when importing old options to have + * access to the real old values, in contrast to the saved ones. + * + * @return array Cleaned option. + */ + protected function clean_option( $option_value, $current_version = null, $all_old_option_values = null ) { + + /* Move options from very old option to this one. */ + $old_option = null; + if ( isset( $all_old_option_values ) ) { + // Ok, we have an import. + if ( isset( $all_old_option_values['wpseo_indexation'] ) && is_array( $all_old_option_values['wpseo_indexation'] ) && $all_old_option_values['wpseo_indexation'] !== [] ) { + $old_option = $all_old_option_values['wpseo_indexation']; + } + } + else { + $old_option = get_option( 'wpseo_indexation' ); + } + + if ( is_array( $old_option ) && $old_option !== [] ) { + $move = [ + 'opengraph', + ]; + foreach ( $move as $key ) { + if ( isset( $old_option[ $key ] ) && ! isset( $option_value[ $key ] ) ) { + $option_value[ $key ] = $old_option[ $key ]; + } + } + unset( $move, $key ); + } + unset( $old_option ); + + return $option_value; + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-titles.php b/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-titles.php new file mode 100644 index 00000000..ff613e48 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-titles.php @@ -0,0 +1,1006 @@ +get_defaults(); + * + * {@internal Note: Some of the default values are added via the translate_defaults() method.}} + * + * @var string[] + */ + protected $defaults = [ + // Form fields. + 'forcerewritetitle' => false, + 'separator' => 'sc-dash', + 'title-home-wpseo' => '%%sitename%% %%page%% %%sep%% %%sitedesc%%', // Text field. + 'title-author-wpseo' => '', // Text field. + 'title-archive-wpseo' => '%%date%% %%page%% %%sep%% %%sitename%%', // Text field. + 'title-search-wpseo' => '', // Text field. + 'title-404-wpseo' => '', // Text field. + + 'social-title-author-wpseo' => '%%name%%', // Text field. + 'social-title-archive-wpseo' => '%%date%%', // Text field. + 'social-description-author-wpseo' => '', // Text area. + 'social-description-archive-wpseo' => '', // Text area. + 'social-image-url-author-wpseo' => '', // Hidden input field. + 'social-image-url-archive-wpseo' => '', // Hidden input field. + 'social-image-id-author-wpseo' => 0, // Hidden input field. + 'social-image-id-archive-wpseo' => 0, // Hidden input field. + + 'metadesc-home-wpseo' => '', // Text area. + 'metadesc-author-wpseo' => '', // Text area. + 'metadesc-archive-wpseo' => '', // Text area. + 'rssbefore' => '', // Text area. + 'rssafter' => '', // Text area. + + 'noindex-author-wpseo' => false, + 'noindex-author-noposts-wpseo' => true, + 'noindex-archive-wpseo' => true, + + 'disable-author' => false, + 'disable-date' => false, + 'disable-post_format' => false, + 'disable-attachment' => true, + + 'breadcrumbs-404crumb' => '', // Text field. + 'breadcrumbs-display-blog-page' => true, + 'breadcrumbs-boldlast' => false, + 'breadcrumbs-archiveprefix' => '', // Text field. + 'breadcrumbs-enable' => true, + 'breadcrumbs-home' => '', // Text field. + 'breadcrumbs-prefix' => '', // Text field. + 'breadcrumbs-searchprefix' => '', // Text field. + 'breadcrumbs-sep' => '»', // Text field. + + 'website_name' => '', + 'person_name' => '', + 'person_logo' => '', + 'person_logo_id' => 0, + 'alternate_website_name' => '', + 'company_logo' => '', + 'company_logo_id' => 0, + 'company_logo_meta' => false, + 'person_logo_meta' => false, + 'company_name' => '', + 'company_alternate_name' => '', + 'company_or_person' => 'company', + 'company_or_person_user_id' => false, + + 'stripcategorybase' => false, + + 'open_graph_frontpage_title' => '%%sitename%%', // Text field. + 'open_graph_frontpage_desc' => '', // Text field. + 'open_graph_frontpage_image' => '', // Text field. + 'open_graph_frontpage_image_id' => 0, + + 'publishing_principles_id' => 0, + 'ownership_funding_info_id' => 0, + 'actionable_feedback_policy_id' => 0, + 'corrections_policy_id' => 0, + 'ethics_policy_id' => 0, + 'diversity_policy_id' => 0, + 'diversity_staffing_report_id' => 0, + + 'org-description' => '', + 'org-email' => '', + 'org-phone' => '', + 'org-legal-name' => '', + 'org-founding-date' => '', + 'org-number-employees' => '', + + 'org-vat-id' => '', + 'org-tax-id' => '', + 'org-iso' => '', + 'org-duns' => '', + 'org-leicode' => '', + 'org-naics' => '', + + /* + * Uses enrich_defaults to add more along the lines of: + * - 'title-' . $pt->name => ''; // Text field. + * - 'metadesc-' . $pt->name => ''; // Text field. + * - 'noindex-' . $pt->name => false; + * - 'display-metabox-pt-' . $pt->name => false; + * + * - 'title-ptarchive-' . $pt->name => ''; // Text field. + * - 'metadesc-ptarchive-' . $pt->name => ''; // Text field. + * - 'bctitle-ptarchive-' . $pt->name => ''; // Text field. + * - 'noindex-ptarchive-' . $pt->name => false; + * + * - 'title-tax-' . $tax->name => '''; // Text field. + * - 'metadesc-tax-' . $tax->name => ''; // Text field. + * - 'noindex-tax-' . $tax->name => false; + * - 'display-metabox-tax-' . $tax->name => false; + * + * - 'schema-page-type-' . $pt->name => 'WebPage'; + * - 'schema-article-type-' . $pt->name => 'Article'; + */ + ]; + + /** + * Used for "caching" during pageload. + * + * @var string[] + */ + protected $enriched_defaults = null; + + /** + * Array of variable option name patterns for the option. + * + * @var string[] + */ + protected $variable_array_key_patterns = [ + 'title-', + 'metadesc-', + 'noindex-', + 'display-metabox-pt-', + 'bctitle-ptarchive-', + 'post_types-', + 'taxonomy-', + 'schema-page-type-', + 'schema-article-type-', + 'social-title-', + 'social-description-', + 'social-image-url-', + 'social-image-id-', + 'org-', + ]; + + /** + * Array of sub-options which should not be overloaded with multi-site defaults. + * + * @var string[] + */ + public $ms_exclude = [ + 'forcerewritetitle', + ]; + + /** + * Add the actions and filters for the option. + * + * @todo [JRF => testers] Check if the extra actions below would run into problems if an option + * is updated early on and if so, change the call to schedule these for a later action on add/update + * instead of running them straight away. + */ + protected function __construct() { + parent::__construct(); + add_action( 'update_option_' . $this->option_name, [ 'WPSEO_Utils', 'clear_cache' ] ); + add_action( 'init', [ $this, 'end_of_init' ], 999 ); + + add_action( 'registered_post_type', [ $this, 'invalidate_enrich_defaults_cache' ] ); + add_action( 'unregistered_post_type', [ $this, 'invalidate_enrich_defaults_cache' ] ); + add_action( 'registered_taxonomy', [ $this, 'invalidate_enrich_defaults_cache' ] ); + add_action( 'unregistered_taxonomy', [ $this, 'invalidate_enrich_defaults_cache' ] ); + + add_filter( 'admin_title', [ 'Yoast_Input_Validation', 'add_yoast_admin_document_title_errors' ] ); + } + + /** + * Make sure we can recognize the right action for the double cleaning. + * + * @return void + */ + public function end_of_init() { + do_action( 'wpseo_double_clean_titles' ); + } + + /** + * Get the singleton instance of this class. + * + * @return self + */ + public static function get_instance() { + if ( ! ( self::$instance instanceof self ) ) { + self::$instance = new self(); + } + + return self::$instance; + } + + /** + * Get the available separator options. + * + * @return string[] + */ + public function get_separator_options() { + $separators = wp_list_pluck( self::get_separator_option_list(), 'option' ); + + /** + * Allow altering the array with separator options. + * + * @param array $separator_options Array with the separator options. + */ + $filtered_separators = apply_filters( 'wpseo_separator_options', $separators ); + + if ( is_array( $filtered_separators ) && $filtered_separators !== [] ) { + $separators = array_merge( $separators, $filtered_separators ); + } + + return $separators; + } + + /** + * Get the available separator options aria-labels. + * + * @return string[] Array with the separator options aria-labels. + */ + public function get_separator_options_for_display() { + $separators = $this->get_separator_options(); + $separator_list = self::get_separator_option_list(); + + $separator_options = []; + + foreach ( $separators as $key => $label ) { + $aria_label = ( $separator_list[ $key ]['label'] ?? '' ); + + $separator_options[ $key ] = [ + 'label' => $label, + 'aria_label' => $aria_label, + ]; + } + + return $separator_options; + } + + /** + * Translate strings used in the option defaults. + * + * @return void + */ + public function translate_defaults() { + /* translators: 1: Author name; 2: Site name. */ + $this->defaults['title-author-wpseo'] = sprintf( __( '%1$s, Author at %2$s', 'wordpress-seo' ), '%%name%%', '%%sitename%%' ) . ' %%page%% '; + /* translators: %s expands to the search phrase. */ + $this->defaults['title-search-wpseo'] = sprintf( __( 'You searched for %s', 'wordpress-seo' ), '%%searchphrase%%' ) . ' %%page%% %%sep%% %%sitename%%'; + $this->defaults['title-404-wpseo'] = __( 'Page not found', 'wordpress-seo' ) . ' %%sep%% %%sitename%%'; + /* translators: 1: link to post; 2: link to blog. */ + $this->defaults['rssafter'] = sprintf( __( 'The post %1$s appeared first on %2$s.', 'wordpress-seo' ), '%%POSTLINK%%', '%%BLOGLINK%%' ); + + $this->defaults['breadcrumbs-404crumb'] = __( 'Error 404: Page not found', 'wordpress-seo' ); + $this->defaults['breadcrumbs-archiveprefix'] = __( 'Archives for', 'wordpress-seo' ); + $this->defaults['breadcrumbs-home'] = __( 'Home', 'wordpress-seo' ); + $this->defaults['breadcrumbs-searchprefix'] = __( 'You searched for', 'wordpress-seo' ); + } + + /** + * Add dynamically created default options based on available post types and taxonomies. + * + * @return void + */ + public function enrich_defaults() { + $enriched_defaults = $this->enriched_defaults; + if ( $enriched_defaults !== null ) { + $this->defaults += $enriched_defaults; + return; + } + + $enriched_defaults = []; + + /* + * Retrieve all the relevant post type and taxonomy arrays. + * + * WPSEO_Post_Type::get_accessible_post_types() should *not* be used here. + * These are the defaults and can be prepared for any public post type. + */ + $post_type_objects = get_post_types( [ 'public' => true ], 'objects' ); + + if ( $post_type_objects ) { + /* translators: %s expands to the name of a post type (plural). */ + $archive = sprintf( __( '%s Archive', 'wordpress-seo' ), '%%pt_plural%%' ); + + foreach ( $post_type_objects as $pt ) { + $enriched_defaults[ 'title-' . $pt->name ] = '%%title%% %%page%% %%sep%% %%sitename%%'; // Text field. + $enriched_defaults[ 'metadesc-' . $pt->name ] = ''; // Text area. + $enriched_defaults[ 'noindex-' . $pt->name ] = false; + $enriched_defaults[ 'display-metabox-pt-' . $pt->name ] = true; + $enriched_defaults[ 'post_types-' . $pt->name . '-maintax' ] = 0; // Select box. + $enriched_defaults[ 'schema-page-type-' . $pt->name ] = 'WebPage'; + $enriched_defaults[ 'schema-article-type-' . $pt->name ] = ( $pt->name === 'post' ) ? 'Article' : 'None'; + + if ( $pt->name !== 'attachment' ) { + $enriched_defaults[ 'social-title-' . $pt->name ] = '%%title%%'; // Text field. + $enriched_defaults[ 'social-description-' . $pt->name ] = ''; // Text area. + $enriched_defaults[ 'social-image-url-' . $pt->name ] = ''; // Hidden input field. + $enriched_defaults[ 'social-image-id-' . $pt->name ] = 0; // Hidden input field. + } + + // Custom post types that have archives. + if ( ! $pt->_builtin && WPSEO_Post_Type::has_archive( $pt ) ) { + $enriched_defaults[ 'title-ptarchive-' . $pt->name ] = $archive . ' %%page%% %%sep%% %%sitename%%'; // Text field. + $enriched_defaults[ 'metadesc-ptarchive-' . $pt->name ] = ''; // Text area. + $enriched_defaults[ 'bctitle-ptarchive-' . $pt->name ] = ''; // Text field. + $enriched_defaults[ 'noindex-ptarchive-' . $pt->name ] = false; + $enriched_defaults[ 'social-title-ptarchive-' . $pt->name ] = $archive; // Text field. + $enriched_defaults[ 'social-description-ptarchive-' . $pt->name ] = ''; // Text area. + $enriched_defaults[ 'social-image-url-ptarchive-' . $pt->name ] = ''; // Hidden input field. + $enriched_defaults[ 'social-image-id-ptarchive-' . $pt->name ] = 0; // Hidden input field. + } + } + } + + $taxonomy_objects = get_taxonomies( [ 'public' => true ], 'object' ); + + if ( $taxonomy_objects ) { + /* translators: %s expands to the variable used for term title. */ + $archives = sprintf( __( '%s Archives', 'wordpress-seo' ), '%%term_title%%' ); + + foreach ( $taxonomy_objects as $tax ) { + $enriched_defaults[ 'title-tax-' . $tax->name ] = $archives . ' %%page%% %%sep%% %%sitename%%'; // Text field. + $enriched_defaults[ 'metadesc-tax-' . $tax->name ] = ''; // Text area. + $enriched_defaults[ 'display-metabox-tax-' . $tax->name ] = true; + + $enriched_defaults[ 'noindex-tax-' . $tax->name ] = ( $tax->name === 'post_format' ); + + $enriched_defaults[ 'social-title-tax-' . $tax->name ] = $archives; // Text field. + $enriched_defaults[ 'social-description-tax-' . $tax->name ] = ''; // Text area. + $enriched_defaults[ 'social-image-url-tax-' . $tax->name ] = ''; // Hidden input field. + $enriched_defaults[ 'social-image-id-tax-' . $tax->name ] = 0; // Hidden input field. + + $enriched_defaults[ 'taxonomy-' . $tax->name . '-ptparent' ] = 0; // Select box;. + } + } + + $this->enriched_defaults = $enriched_defaults; + $this->defaults += $enriched_defaults; + } + + /** + * Invalidates enrich_defaults() cache. + * + * Called from actions: + * - (un)registered_post_type + * - (un)registered_taxonomy + * + * @return void + */ + public function invalidate_enrich_defaults_cache() { + $this->enriched_defaults = null; + } + + /** + * Validate the option. + * + * @param string[] $dirty New value for the option. + * @param string[] $clean Clean value for the option, normally the defaults. + * @param string[] $old Old value of the option. + * + * @return string[] Validated clean value for the option to be saved to the database. + */ + protected function validate_option( $dirty, $clean, $old ) { + $allowed_post_types = $this->get_allowed_post_types(); + + foreach ( $clean as $key => $value ) { + $switch_key = $this->get_switch_key( $key ); + + switch ( $switch_key ) { + // Only ever set programmatically, so no reason for intense validation. + case 'company_logo_meta': + case 'person_logo_meta': + if ( isset( $dirty[ $key ] ) ) { + $clean[ $key ] = $dirty[ $key ]; + } + break; + + /* Breadcrumbs text fields. */ + case 'breadcrumbs-404crumb': + case 'breadcrumbs-archiveprefix': + case 'breadcrumbs-home': + case 'breadcrumbs-prefix': + case 'breadcrumbs-searchprefix': + case 'breadcrumbs-sep': + if ( isset( $dirty[ $key ] ) ) { + $clean[ $key ] = wp_kses_post( $dirty[ $key ] ); + } + break; + + /* + * Text fields. + */ + + /* + * Covers: + * 'title-home-wpseo', 'title-author-wpseo', 'title-archive-wpseo', // phpcs:ignore Squiz.PHP.CommentedOutCode.Found -- This isn't commented out code. + * 'title-search-wpseo', 'title-404-wpseo' + * 'title-' . $pt->name + * 'title-ptarchive-' . $pt->name + * 'title-tax-' . $tax->name + * 'social-title-' . $pt->name + * 'social-title-ptarchive-' . $pt->name + * 'social-title-tax-' . $tax->name + * 'social-title-author-wpseo', 'social-title-archive-wpseo' + * 'open_graph_frontpage_title' + */ + case 'org-': + case 'website_name': + case 'alternate_website_name': + case 'title-': + case 'social-title-': + case 'open_graph_frontpage_title': + if ( isset( $dirty[ $key ] ) ) { + $clean[ $key ] = WPSEO_Utils::sanitize_text_field( $dirty[ $key ] ); + } + break; + + case 'company_or_person': + if ( isset( $dirty[ $key ] ) ) { + if ( in_array( $dirty[ $key ], [ 'company', 'person' ], true ) ) { + $clean[ $key ] = $dirty[ $key ]; + } + else { + $defaults = $this->get_defaults(); + $clean[ $key ] = $defaults['company_or_person']; + } + } + break; + + /* + * Covers: + * 'company_logo', 'person_logo' // phpcs:ignore Squiz.PHP.CommentedOutCode.Found -- This isn't commented out code. + */ + case 'company_logo': + case 'person_logo': + case 'open_graph_frontpage_image': + // When a logo changes, we need to ditch the caches we have for it. + unset( $clean[ $switch_key . '_id' ] ); + unset( $clean[ $switch_key . '_meta' ] ); + $this->validate_url( $key, $dirty, $old, $clean ); + break; + + /* + * Covers: + * 'social-image-url-' . $pt->name + * 'social-image-url-ptarchive-' . $pt->name + * 'social-image-url-tax-' . $tax->name + * 'social-image-url-author-wpseo', 'social-image-url-archive-wpseo' + */ + case 'social-image-url-': + $this->validate_url( $key, $dirty, $old, $clean ); + break; + + /* + * Covers: + * 'metadesc-home-wpseo', 'metadesc-author-wpseo', 'metadesc-archive-wpseo' + * 'metadesc-' . $pt->name + * 'metadesc-ptarchive-' . $pt->name + * 'metadesc-tax-' . $tax->name + * and also: + * 'bctitle-ptarchive-' . $pt->name + * 'social-description-' . $pt->name + * 'social-description-ptarchive-' . $pt->name + * 'social-description-tax-' . $tax->name + * 'social-description-author-wpseo', 'social-description-archive-wpseo' + * 'open_graph_frontpage_desc' + */ + case 'metadesc-': + case 'bctitle-ptarchive-': + case 'company_name': + case 'company_alternate_name': + case 'person_name': + case 'social-description-': + case 'open_graph_frontpage_desc': + if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) { + $clean[ $key ] = WPSEO_Utils::sanitize_text_field( $dirty[ $key ] ); + } + break; + + /* + * Covers: 'rssbefore', 'rssafter' // phpcs:ignore Squiz.PHP.CommentedOutCode.Found -- This isn't commented out code. + */ + case 'rssbefore': + case 'rssafter': + if ( isset( $dirty[ $key ] ) ) { + $clean[ $key ] = wp_kses_post( $dirty[ $key ] ); + } + break; + + /* 'post_types-' . $pt->name . '-maintax' fields. */ + case 'post_types-': + $post_type = str_replace( [ 'post_types-', '-maintax' ], '', $key ); + $taxonomies = get_object_taxonomies( $post_type, 'names' ); + + if ( isset( $dirty[ $key ] ) ) { + if ( $taxonomies !== [] && in_array( $dirty[ $key ], $taxonomies, true ) ) { + $clean[ $key ] = $dirty[ $key ]; + } + elseif ( (string) $dirty[ $key ] === '0' || (string) $dirty[ $key ] === '' ) { + $clean[ $key ] = 0; + } + elseif ( sanitize_title_with_dashes( $dirty[ $key ] ) === $dirty[ $key ] ) { + // Allow taxonomies which may not be registered yet. + $clean[ $key ] = $dirty[ $key ]; + } + else { + if ( isset( $old[ $key ] ) ) { + $clean[ $key ] = sanitize_title_with_dashes( $old[ $key ] ); + } + + /* + * @todo [JRF => whomever] Maybe change the untranslated $pt name in the + * error message to the nicely translated label ? + */ + add_settings_error( + $this->group_name, // Slug title of the setting. + $key, // Suffix-id for the error message box. + /* translators: %s expands to a post type. */ + sprintf( __( 'Please select a valid taxonomy for post type "%s"', 'wordpress-seo' ), $post_type ), // The error message. + 'error' // Message type. + ); + } + } + elseif ( isset( $old[ $key ] ) ) { + $clean[ $key ] = sanitize_title_with_dashes( $old[ $key ] ); + } + unset( $taxonomies, $post_type ); + break; + + /* 'taxonomy-' . $tax->name . '-ptparent' fields. */ + case 'taxonomy-': + if ( isset( $dirty[ $key ] ) ) { + if ( $allowed_post_types !== [] && in_array( $dirty[ $key ], $allowed_post_types, true ) ) { + $clean[ $key ] = $dirty[ $key ]; + } + elseif ( (string) $dirty[ $key ] === '0' || (string) $dirty[ $key ] === '' ) { + $clean[ $key ] = 0; + } + elseif ( sanitize_key( $dirty[ $key ] ) === $dirty[ $key ] ) { + // Allow taxonomies which may not be registered yet. + $clean[ $key ] = $dirty[ $key ]; + } + else { + if ( isset( $old[ $key ] ) ) { + $clean[ $key ] = sanitize_key( $old[ $key ] ); + } + + /* + * @todo [JRF =? whomever] Maybe change the untranslated $tax name in the + * error message to the nicely translated label ? + */ + $tax = str_replace( [ 'taxonomy-', '-ptparent' ], '', $key ); + add_settings_error( + $this->group_name, // Slug title of the setting. + '_' . $tax, // Suffix-ID for the error message box. + /* translators: %s expands to a taxonomy slug. */ + sprintf( __( 'Please select a valid post type for taxonomy "%s"', 'wordpress-seo' ), $tax ), // The error message. + 'error' // Message type. + ); + unset( $tax ); + } + } + elseif ( isset( $old[ $key ] ) ) { + $clean[ $key ] = sanitize_key( $old[ $key ] ); + } + break; + + /* + * Covers: + * 'company_or_person_user_id' + * 'company_logo_id', 'person_logo_id', 'open_graph_frontpage_image_id' + * 'social-image-id-' . $pt->name + * 'social-image-id-ptarchive-' . $pt->name + * 'social-image-id-tax-' . $tax->name + * 'social-image-id-author-wpseo', 'social-image-id-archive-wpseo' + */ + case 'company_or_person_user_id': + case 'company_logo_id': + case 'person_logo_id': + case 'social-image-id-': + case 'open_graph_frontpage_image_id': + case 'publishing_principles_id': + case 'ownership_funding_info_id': + case 'actionable_feedback_policy_id': + case 'corrections_policy_id': + case 'ethics_policy_id': + case 'diversity_policy_id': + case 'diversity_staffing_report_id': + if ( isset( $dirty[ $key ] ) ) { + $int = WPSEO_Utils::validate_int( $dirty[ $key ] ); + if ( $int !== false && $int >= 0 ) { + $clean[ $key ] = $int; + } + } + elseif ( isset( $old[ $key ] ) ) { + $int = WPSEO_Utils::validate_int( $old[ $key ] ); + if ( $int !== false && $int >= 0 ) { + $clean[ $key ] = $int; + } + } + break; + /* Separator field - Radio. */ + case 'separator': + if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) { + + // Get separator fields. + $separator_fields = $this->get_separator_options(); + + // Check if the given separator exists. + if ( isset( $separator_fields[ $dirty[ $key ] ] ) ) { + $clean[ $key ] = $dirty[ $key ]; + } + } + break; + + case 'schema-page-type-': + if ( isset( $dirty[ $key ] ) && is_string( $dirty[ $key ] ) ) { + if ( array_key_exists( $dirty[ $key ], Schema_Types::PAGE_TYPES ) ) { + $clean[ $key ] = $dirty[ $key ]; + } + else { + $defaults = $this->get_defaults(); + $post_type = str_replace( $switch_key, '', $key ); + $clean[ $key ] = $defaults[ $switch_key . $post_type ]; + } + } + break; + case 'schema-article-type-': + if ( isset( $dirty[ $key ] ) && is_string( $dirty[ $key ] ) ) { + /** + * Filter: 'wpseo_schema_article_types' - Allow developers to filter the available article types. + * + * Make sure when you filter this to also filter `wpseo_schema_article_types_labels`. + * + * @param array $schema_article_types The available schema article types. + */ + if ( array_key_exists( $dirty[ $key ], apply_filters( 'wpseo_schema_article_types', Schema_Types::ARTICLE_TYPES ) ) ) { + $clean[ $key ] = $dirty[ $key ]; + } + else { + $defaults = $this->get_defaults(); + $post_type = str_replace( $switch_key, '', $key ); + $clean[ $key ] = $defaults[ $switch_key . $post_type ]; + } + } + break; + + /* + * Boolean fields. + */ + + /* + * Covers: + * 'noindex-author-wpseo', 'noindex-author-noposts-wpseo', 'noindex-archive-wpseo' + * 'noindex-' . $pt->name + * 'noindex-ptarchive-' . $pt->name + * 'noindex-tax-' . $tax->name + * 'forcerewritetitle': + * 'noodp': + * 'noydir': + * 'disable-author': + * 'disable-date': + * 'disable-post_format'; + * 'noindex-' + * 'display-metabox-pt-' + * 'display-metabox-pt-'. $pt->name + * 'display-metabox-tax-' + * 'display-metabox-tax-' . $tax->name + * 'breadcrumbs-display-blog-page' + * 'breadcrumbs-boldlast' + * 'breadcrumbs-enable' + * 'stripcategorybase' + */ + default: + $clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : false ); + break; + } + } + + return $clean; + } + + /** + * Retrieve a list of the allowed post types as breadcrumb parent for a taxonomy. + * Helper method for validation. + * + * {@internal Don't make static as new types may still be registered.}} + * + * @return string[] + */ + protected function get_allowed_post_types() { + $allowed_post_types = []; + + /* + * WPSEO_Post_Type::get_accessible_post_types() should *not* be used here. + */ + $post_types = get_post_types( [ 'public' => true ], 'objects' ); + + if ( get_option( 'show_on_front' ) === 'page' && get_option( 'page_for_posts' ) > 0 ) { + $allowed_post_types[] = 'post'; + } + + if ( is_array( $post_types ) && $post_types !== [] ) { + foreach ( $post_types as $type ) { + if ( WPSEO_Post_Type::has_archive( $type ) ) { + $allowed_post_types[] = $type->name; + } + } + } + + return $allowed_post_types; + } + + /** + * Clean a given option value. + * + * @param string[] $option_value Old (not merged with defaults or filtered) option value to clean according to the rules for this option. + * @param string[]|null $current_version Optional. Version from which to upgrade, if not set, version specific upgrades will be disregarded. + * @param string[]|null $all_old_option_values Optional. Only used when importing old options to have access to the real old values, in contrast to the saved ones. + * + * @return string[] Cleaned option. + */ + protected function clean_option( $option_value, $current_version = null, $all_old_option_values = null ) { + static $original = null; + + // Double-run this function to ensure renaming of the taxonomy options will work. + if ( ! isset( $original ) + && has_action( 'wpseo_double_clean_titles', [ $this, 'clean' ] ) === false + ) { + add_action( 'wpseo_double_clean_titles', [ $this, 'clean' ] ); + $original = $option_value; + } + + /* + * Move options from very old option to this one. + * + * {@internal Don't rename to the 'current' names straight away as that would prevent + * the rename/unset combi below from working.}} + * + * @todo [JRF] Maybe figure out a smarter way to deal with this. + */ + $old_option = null; + if ( isset( $all_old_option_values ) ) { + // Ok, we have an import. + if ( isset( $all_old_option_values['wpseo_indexation'] ) && is_array( $all_old_option_values['wpseo_indexation'] ) && $all_old_option_values['wpseo_indexation'] !== [] ) { + $old_option = $all_old_option_values['wpseo_indexation']; + } + } + else { + $old_option = get_option( 'wpseo_indexation' ); + } + if ( is_array( $old_option ) && $old_option !== [] ) { + $move = [ + 'noindexauthor' => 'noindex-author', + 'disableauthor' => 'disable-author', + 'noindexdate' => 'noindex-archive', + 'noindexcat' => 'noindex-category', + 'noindextag' => 'noindex-post_tag', + 'noindexpostformat' => 'noindex-post_format', + ]; + foreach ( $move as $old => $new ) { + if ( isset( $old_option[ $old ] ) && ! isset( $option_value[ $new ] ) ) { + $option_value[ $new ] = $old_option[ $old ]; + } + } + unset( $move, $old, $new ); + } + unset( $old_option ); + + // Fix wrongness created by buggy version 1.2.2. + if ( isset( $option_value['title-home'] ) && $option_value['title-home'] === '%%sitename%% - %%sitedesc%% - 12345' ) { + $option_value['title-home-wpseo'] = '%%sitename%% - %%sitedesc%%'; + } + + /* + * Renaming these options to avoid ever overwritting these if a (bloody stupid) user / + * programmer would use any of the following as a custom post type or custom taxonomy: + * 'home', 'author', 'archive', 'search', '404', 'subpages'. + * + * Similarly, renaming the tax options to avoid a custom post type and a taxonomy + * with the same name occupying the same option. + */ + $rename = [ + 'title-home' => 'title-home-wpseo', + 'title-author' => 'title-author-wpseo', + 'title-archive' => 'title-archive-wpseo', + 'title-search' => 'title-search-wpseo', + 'title-404' => 'title-404-wpseo', + 'metadesc-home' => 'metadesc-home-wpseo', + 'metadesc-author' => 'metadesc-author-wpseo', + 'metadesc-archive' => 'metadesc-archive-wpseo', + 'noindex-author' => 'noindex-author-wpseo', + 'noindex-archive' => 'noindex-archive-wpseo', + ]; + foreach ( $rename as $old => $new ) { + if ( isset( $option_value[ $old ] ) && ! isset( $option_value[ $new ] ) ) { + $option_value[ $new ] = $option_value[ $old ]; + unset( $option_value[ $old ] ); + } + } + unset( $rename, $old, $new ); + + /* + * {@internal This clean-up action can only be done effectively once the taxonomies + * and post_types have been registered, i.e. at the end of the init action.}} + */ + if ( ( isset( $original ) && current_filter() === 'wpseo_double_clean_titles' ) || did_action( 'wpseo_double_clean_titles' ) > 0 ) { + $rename = [ + 'title-' => 'title-tax-', + 'metadesc-' => 'metadesc-tax-', + 'noindex-' => 'noindex-tax-', + 'tax-hideeditbox-' => 'hideeditbox-tax-', + + ]; + + $taxonomy_names = get_taxonomies( [ 'public' => true ], 'names' ); + $post_type_names = get_post_types( [ 'public' => true ], 'names' ); + $defaults = $this->get_defaults(); + if ( $taxonomy_names !== [] ) { + foreach ( $taxonomy_names as $tax ) { + foreach ( $rename as $old_prefix => $new_prefix ) { + if ( + ( isset( $original[ $old_prefix . $tax ] ) && ! isset( $original[ $new_prefix . $tax ] ) ) + && ( ! isset( $option_value[ $new_prefix . $tax ] ) + || ( isset( $option_value[ $new_prefix . $tax ] ) + && $option_value[ $new_prefix . $tax ] === $defaults[ $new_prefix . $tax ] ) ) + ) { + $option_value[ $new_prefix . $tax ] = $original[ $old_prefix . $tax ]; + + /* + * Check if there is a cpt with the same name as the tax, + * if so, we should make sure that the old setting hasn't been removed. + */ + if ( ! isset( $post_type_names[ $tax ] ) && isset( $option_value[ $old_prefix . $tax ] ) ) { + unset( $option_value[ $old_prefix . $tax ] ); + } + elseif ( isset( $post_type_names[ $tax ] ) && ! isset( $option_value[ $old_prefix . $tax ] ) ) { + $option_value[ $old_prefix . $tax ] = $original[ $old_prefix . $tax ]; + } + + if ( $old_prefix === 'tax-hideeditbox-' ) { + unset( $option_value[ $old_prefix . $tax ] ); + } + } + } + } + } + unset( $rename, $taxonomy_names, $post_type_names, $defaults, $tax, $old_prefix, $new_prefix ); + } + + return $option_value; + } + + /** + * Make sure that any set option values relating to post_types and/or taxonomies are retained, + * even when that post_type or taxonomy may not yet have been registered. + * + * {@internal Overrule the abstract class version of this to make sure one extra renamed + * variable key does not get removed. IMPORTANT: keep this method in line with + * the parent on which it is based!}} + * + * @param string[] $dirty Original option as retrieved from the database. + * @param string[] $clean Filtered option where any options which shouldn't be in our option + * have already been removed and any options which weren't set + * have been set to their defaults. + * + * @return string[] + */ + protected function retain_variable_keys( $dirty, $clean ) { + if ( ( is_array( $this->variable_array_key_patterns ) && $this->variable_array_key_patterns !== [] ) && ( is_array( $dirty ) && $dirty !== [] ) ) { + + // Add the extra pattern. + $patterns = $this->variable_array_key_patterns; + $patterns[] = 'tax-hideeditbox-'; + + /** + * Allow altering the array with variable array key patterns. + * + * @param array $patterns Array with the variable array key patterns. + */ + $patterns = apply_filters( 'wpseo_option_titles_variable_array_key_patterns', $patterns ); + + foreach ( $dirty as $key => $value ) { + + // Do nothing if already in filtered option array. + if ( isset( $clean[ $key ] ) ) { + continue; + } + + foreach ( $patterns as $pattern ) { + if ( strpos( $key, $pattern ) === 0 ) { + $clean[ $key ] = $value; + break; + } + } + } + } + + return $clean; + } + + /** + * Retrieves a list of separator options. + * + * @return string[] An array of the separator options. + */ + protected static function get_separator_option_list() { + $separators = [ + 'sc-dash' => [ + 'option' => '-', + 'label' => __( 'Dash', 'wordpress-seo' ), + ], + 'sc-ndash' => [ + 'option' => '–', + 'label' => __( 'En dash', 'wordpress-seo' ), + ], + 'sc-mdash' => [ + 'option' => '—', + 'label' => __( 'Em dash', 'wordpress-seo' ), + ], + 'sc-colon' => [ + 'option' => ':', + 'label' => __( 'Colon', 'wordpress-seo' ), + ], + 'sc-middot' => [ + 'option' => '·', + 'label' => __( 'Middle dot', 'wordpress-seo' ), + ], + 'sc-bull' => [ + 'option' => '•', + 'label' => __( 'Bullet', 'wordpress-seo' ), + ], + 'sc-star' => [ + 'option' => '*', + 'label' => __( 'Asterisk', 'wordpress-seo' ), + ], + 'sc-smstar' => [ + 'option' => '⋆', + 'label' => __( 'Low asterisk', 'wordpress-seo' ), + ], + 'sc-pipe' => [ + 'option' => '|', + 'label' => __( 'Vertical bar', 'wordpress-seo' ), + ], + 'sc-tilde' => [ + 'option' => '~', + 'label' => __( 'Small tilde', 'wordpress-seo' ), + ], + 'sc-laquo' => [ + 'option' => '«', + 'label' => __( 'Left angle quotation mark', 'wordpress-seo' ), + ], + 'sc-raquo' => [ + 'option' => '»', + 'label' => __( 'Right angle quotation mark', 'wordpress-seo' ), + ], + 'sc-lt' => [ + 'option' => '>', + 'label' => __( 'Less than sign', 'wordpress-seo' ), + ], + 'sc-gt' => [ + 'option' => '<', + 'label' => __( 'Greater than sign', 'wordpress-seo' ), + ], + ]; + + /** + * Allows altering the separator options array. + * + * @param array $separators Array with the separator options. + */ + $separator_list = apply_filters( 'wpseo_separator_option_list', $separators ); + + if ( ! is_array( $separator_list ) ) { + return $separators; + } + + return $separator_list; + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-wpseo.php b/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-wpseo.php new file mode 100644 index 00000000..12536e06 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-wpseo.php @@ -0,0 +1,654 @@ +get_defaults();}} + * + * @var array + */ + protected $defaults = [ + // Non-form fields, set via (ajax) function. + 'tracking' => null, + 'toggled_tracking' => false, + 'license_server_version' => false, + 'ms_defaults_set' => false, + 'ignore_search_engines_discouraged_notice' => false, + 'indexing_first_time' => true, + 'indexing_started' => null, + 'indexing_reason' => '', + 'indexables_indexing_completed' => false, + 'index_now_key' => '', + // Non-form field, should only be set via validation routine. + 'version' => '', // Leave default as empty to ensure activation/upgrade works. + 'previous_version' => '', + // Form fields. + 'disableadvanced_meta' => true, + 'enable_headless_rest_endpoints' => true, + 'ryte_indexability' => false, + 'baiduverify' => '', // Text field. + 'googleverify' => '', // Text field. + 'msverify' => '', // Text field. + 'yandexverify' => '', + 'site_type' => '', // List of options. + 'has_multiple_authors' => '', + 'environment_type' => '', + 'content_analysis_active' => true, + 'keyword_analysis_active' => true, + 'inclusive_language_analysis_active' => false, + 'enable_admin_bar_menu' => true, + 'enable_cornerstone_content' => true, + 'enable_xml_sitemap' => true, + 'enable_text_link_counter' => true, + 'enable_index_now' => true, + 'enable_ai_generator' => true, + 'ai_enabled_pre_default' => false, + 'show_onboarding_notice' => false, + 'first_activated_on' => false, + 'myyoast-oauth' => [ + 'config' => [ + 'clientId' => null, + 'secret' => null, + ], + 'access_tokens' => [], + ], + 'semrush_integration_active' => true, + 'semrush_tokens' => [], + 'semrush_country_code' => 'us', + 'permalink_structure' => '', + 'home_url' => '', + 'dynamic_permalinks' => false, + 'category_base_url' => '', + 'tag_base_url' => '', + 'custom_taxonomy_slugs' => [], + 'enable_enhanced_slack_sharing' => true, + 'zapier_integration_active' => false, + 'zapier_subscription' => [], + 'zapier_api_key' => '', + 'enable_metabox_insights' => true, + 'enable_link_suggestions' => true, + 'algolia_integration_active' => false, + 'import_cursors' => [], + 'workouts_data' => [ 'configuration' => [ 'finishedSteps' => [] ] ], + 'configuration_finished_steps' => [], + 'dismiss_configuration_workout_notice' => false, + 'dismiss_premium_deactivated_notice' => false, + 'importing_completed' => [], + 'wincher_integration_active' => true, + 'wincher_tokens' => [], + 'wincher_automatically_add_keyphrases' => false, + 'wincher_website_id' => '', + 'first_time_install' => false, + 'should_redirect_after_install_free' => false, + 'activation_redirect_timestamp_free' => 0, + 'remove_feed_global' => false, + 'remove_feed_global_comments' => false, + 'remove_feed_post_comments' => false, + 'remove_feed_authors' => false, + 'remove_feed_categories' => false, + 'remove_feed_tags' => false, + 'remove_feed_custom_taxonomies' => false, + 'remove_feed_post_types' => false, + 'remove_feed_search' => false, + 'remove_atom_rdf_feeds' => false, + 'remove_shortlinks' => false, + 'remove_rest_api_links' => false, + 'remove_rsd_wlw_links' => false, + 'remove_oembed_links' => false, + 'remove_generator' => false, + 'remove_emoji_scripts' => false, + 'remove_powered_by_header' => false, + 'remove_pingback_header' => false, + 'clean_campaign_tracking_urls' => false, + 'clean_permalinks' => false, + 'clean_permalinks_extra_variables' => '', + 'search_cleanup' => false, + 'search_cleanup_emoji' => false, + 'search_cleanup_patterns' => false, + 'search_character_limit' => 50, + 'deny_search_crawling' => false, + 'deny_wp_json_crawling' => false, + 'deny_adsbot_crawling' => false, + 'deny_ccbot_crawling' => false, + 'deny_google_extended_crawling' => false, + 'deny_gptbot_crawling' => false, + 'redirect_search_pretty_urls' => false, + 'least_readability_ignore_list' => [], + 'least_seo_score_ignore_list' => [], + 'most_linked_ignore_list' => [], + 'least_linked_ignore_list' => [], + 'indexables_page_reading_list' => [ false, false, false, false, false ], + 'indexables_overview_state' => 'dashboard-not-visited', + 'last_known_public_post_types' => [], + 'last_known_public_taxonomies' => [], + 'last_known_no_unindexed' => [], + 'new_post_types' => [], + 'new_taxonomies' => [], + 'show_new_content_type_notification' => false, + ]; + + /** + * Sub-options which should not be overloaded with multi-site defaults. + * + * @var array + */ + public $ms_exclude = [ + 'ignore_search_engines_discouraged_notice', + /* Privacy. */ + 'baiduverify', + 'googleverify', + 'msverify', + 'yandexverify', + ]; + + /** + * Possible values for the site_type option. + * + * @var array + */ + protected $site_types = [ + '', + 'blog', + 'shop', + 'news', + 'smallBusiness', + 'corporateOther', + 'personalOther', + ]; + + /** + * Possible environment types. + * + * @var array + */ + protected $environment_types = [ + '', + 'local', + 'production', + 'staging', + 'development', + ]; + + /** + * Possible has_multiple_authors options. + * + * @var array + */ + protected $has_multiple_authors_options = [ + '', + true, + false, + ]; + + /** + * Name for an option higher in the hierarchy to override setting access. + * + * @var string + */ + protected $override_option_name = 'wpseo_ms'; + + /** + * Add the actions and filters for the option. + * + * @todo [JRF => testers] Check if the extra actions below would run into problems if an option + * is updated early on and if so, change the call to schedule these for a later action on add/update + * instead of running them straight away. + */ + protected function __construct() { + parent::__construct(); + + /** + * Filter: 'wpseo_enable_tracking' - Enables the data tracking of Yoast SEO Premium. + * + * @param string $is_enabled The enabled state. Default is false. + */ + $this->defaults['tracking'] = apply_filters( 'wpseo_enable_tracking', false ); + + /* Clear the cache on update/add. */ + add_action( 'add_option_' . $this->option_name, [ 'WPSEO_Utils', 'clear_cache' ] ); + add_action( 'update_option_' . $this->option_name, [ 'WPSEO_Utils', 'clear_cache' ] ); + + add_filter( 'admin_title', [ 'Yoast_Input_Validation', 'add_yoast_admin_document_title_errors' ] ); + + /** + * Filter the `wpseo` option defaults. + * + * @param array $defaults Array the defaults for the `wpseo` option attributes. + */ + $this->defaults = apply_filters( 'wpseo_option_wpseo_defaults', $this->defaults ); + } + + /** + * Get the singleton instance of this class. + * + * @return object + */ + public static function get_instance() { + if ( ! ( self::$instance instanceof self ) ) { + self::$instance = new self(); + } + + return self::$instance; + } + + /** + * Add filters to make sure that the option is merged with its defaults before being returned. + * + * @return void + */ + public function add_option_filters() { + parent::add_option_filters(); + + list( $hookname, $callback, $priority ) = $this->get_verify_features_option_filter_hook(); + + if ( has_filter( $hookname, $callback ) === false ) { + add_filter( $hookname, $callback, $priority ); + } + } + + /** + * Remove the option filters. + * Called from the clean_up methods to make sure we retrieve the original old option. + * + * @return void + */ + public function remove_option_filters() { + parent::remove_option_filters(); + + list( $hookname, $callback, $priority ) = $this->get_verify_features_option_filter_hook(); + + remove_filter( $hookname, $callback, $priority ); + } + + /** + * Add filters to make sure that the option default is returned if the option is not set. + * + * @return void + */ + public function add_default_filters() { + parent::add_default_filters(); + + list( $hookname, $callback, $priority ) = $this->get_verify_features_default_option_filter_hook(); + + if ( has_filter( $hookname, $callback ) === false ) { + add_filter( $hookname, $callback, $priority ); + } + } + + /** + * Remove the default filters. + * Called from the validate() method to prevent failure to add new options. + * + * @return void + */ + public function remove_default_filters() { + parent::remove_default_filters(); + + list( $hookname, $callback, $priority ) = $this->get_verify_features_default_option_filter_hook(); + + remove_filter( $hookname, $callback, $priority ); + } + + /** + * Validate the option. + * + * @param array $dirty New value for the option. + * @param array $clean Clean value for the option, normally the defaults. + * @param array $old Old value of the option. + * + * @return array Validated clean value for the option to be saved to the database. + */ + protected function validate_option( $dirty, $clean, $old ) { + + foreach ( $clean as $key => $value ) { + switch ( $key ) { + case 'version': + $clean[ $key ] = WPSEO_VERSION; + break; + case 'previous_version': + case 'semrush_country_code': + case 'license_server_version': + case 'home_url': + case 'zapier_api_key': + case 'index_now_key': + case 'wincher_website_id': + case 'clean_permalinks_extra_variables': + case 'indexables_overview_state': + if ( isset( $dirty[ $key ] ) ) { + $clean[ $key ] = $dirty[ $key ]; + } + break; + case 'indexing_reason': + if ( isset( $dirty[ $key ] ) ) { + $clean[ $key ] = sanitize_text_field( $dirty[ $key ] ); + } + break; + + /* Verification strings. */ + case 'baiduverify': + case 'googleverify': + case 'msverify': + case 'yandexverify': + $this->validate_verification_string( $key, $dirty, $old, $clean ); + break; + + /* + * Boolean dismiss warnings - not fields - may not be in form + * (and don't need to be either as long as the default is false). + */ + case 'ignore_search_engines_discouraged_notice': + case 'ms_defaults_set': + if ( isset( $dirty[ $key ] ) ) { + $clean[ $key ] = WPSEO_Utils::validate_bool( $dirty[ $key ] ); + } + elseif ( isset( $old[ $key ] ) ) { + $clean[ $key ] = WPSEO_Utils::validate_bool( $old[ $key ] ); + } + break; + + case 'site_type': + $clean[ $key ] = $old[ $key ]; + if ( isset( $dirty[ $key ] ) && in_array( $dirty[ $key ], $this->site_types, true ) ) { + $clean[ $key ] = $dirty[ $key ]; + } + break; + + case 'environment_type': + $clean[ $key ] = $old[ $key ]; + if ( isset( $dirty[ $key ] ) && in_array( $dirty[ $key ], $this->environment_types, true ) ) { + $clean[ $key ] = $dirty[ $key ]; + } + break; + + case 'has_multiple_authors': + $clean[ $key ] = $old[ $key ]; + if ( isset( $dirty[ $key ] ) && in_array( $dirty[ $key ], $this->has_multiple_authors_options, true ) ) { + $clean[ $key ] = $dirty[ $key ]; + } + + break; + + case 'first_activated_on': + case 'indexing_started': + case 'activation_redirect_timestamp_free': + $clean[ $key ] = false; + if ( isset( $dirty[ $key ] ) ) { + if ( $dirty[ $key ] === false || WPSEO_Utils::validate_int( $dirty[ $key ] ) ) { + $clean[ $key ] = $dirty[ $key ]; + } + } + break; + + case 'tracking': + $clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : null ); + break; + + case 'myyoast_oauth': + case 'semrush_tokens': + case 'custom_taxonomy_slugs': + case 'zapier_subscription': + case 'wincher_tokens': + case 'workouts_data': + case 'configuration_finished_steps': + case 'least_readability_ignore_list': + case 'least_seo_score_ignore_list': + case 'most_linked_ignore_list': + case 'least_linked_ignore_list': + case 'indexables_page_reading_list': + case 'last_known_public_post_types': + case 'last_known_public_taxonomies': + case 'new_post_types': + case 'new_taxonomies': + $clean[ $key ] = $old[ $key ]; + + if ( isset( $dirty[ $key ] ) ) { + $items = $dirty[ $key ]; + if ( ! is_array( $items ) ) { + $items = json_decode( $dirty[ $key ], true ); + } + + if ( is_array( $items ) ) { + $clean[ $key ] = $dirty[ $key ]; + } + } + + break; + + case 'permalink_structure': + case 'category_base_url': + case 'tag_base_url': + if ( isset( $dirty[ $key ] ) ) { + $clean[ $key ] = sanitize_option( $key, $dirty[ $key ] ); + } + break; + + case 'search_character_limit': + if ( isset( $dirty[ $key ] ) ) { + $clean[ $key ] = (int) $dirty[ $key ]; + } + break; + + case 'import_cursors': + case 'importing_completed': + if ( isset( $dirty[ $key ] ) && is_array( $dirty[ $key ] ) ) { + $clean[ $key ] = $dirty[ $key ]; + } + break; + + case 'last_known_no_unindexed': + $clean[ $key ] = $old[ $key ]; + + if ( isset( $dirty[ $key ] ) ) { + $items = $dirty[ $key ]; + + if ( is_array( $items ) ) { + foreach ( $items as $item_key => $item ) { + if ( ! is_string( $item_key ) || ! is_numeric( $item ) ) { + unset( $items[ $item_key ] ); + } + } + $clean[ $key ] = $items; + } + } + + break; + + /* + * Boolean (checkbox) fields. + * + * Covers: + * 'disableadvanced_meta' + * 'enable_headless_rest_endpoints' + * 'yoast_tracking' + * 'dynamic_permalinks' + * 'indexing_first_time' + * 'first_time_install' + * 'remove_feed_global' + * 'remove_feed_global_comments' + * 'remove_feed_post_comments' + * 'remove_feed_authors' + * 'remove_feed_categories' + * 'remove_feed_tags' + * 'remove_feed_custom_taxonomies' + * 'remove_feed_post_types' + * 'remove_feed_search' + * 'remove_atom_rdf_feeds' + * 'remove_shortlinks' + * 'remove_rest_api_links' + * 'remove_rsd_wlw_links' + * 'remove_oembed_links' + * 'remove_generator' + * 'remove_emoji_scripts' + * 'remove_powered_by_header' + * 'remove_pingback_header' + * 'clean_campaign_tracking_urls' + * 'clean_permalinks' + * 'clean_permalinks_extra_variables' + * 'search_cleanup' + * 'search_cleanup_emoji' + * 'search_cleanup_patterns' + * 'deny_wp_json_crawling' + * 'deny_adsbot_crawling' + * 'deny_ccbot_crawling' + * 'deny_google_extended_crawling' + * 'deny_gptbot_crawling' + * 'redirect_search_pretty_urls' + * 'should_redirect_after_install_free' + * 'show_new_content_type_notification' + * and most of the feature variables. + */ + default: + $clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : false ); + break; + } + } + + return $clean; + } + + /** + * Verifies that the feature variables are turned off if the network is configured so. + * + * @param mixed $options Value of the option to be returned. Typically an array. + * + * @return mixed Filtered $options value. + */ + public function verify_features_against_network( $options = [] ) { + if ( ! is_array( $options ) || empty( $options ) ) { + return $options; + } + + // For the feature variables, set their values to off in case they are disabled. + $feature_vars = [ + 'disableadvanced_meta' => false, + 'ryte_indexability' => false, + 'content_analysis_active' => false, + 'keyword_analysis_active' => false, + 'inclusive_language_analysis_active' => false, + 'enable_admin_bar_menu' => false, + 'enable_cornerstone_content' => false, + 'enable_xml_sitemap' => false, + 'enable_text_link_counter' => false, + 'enable_metabox_insights' => false, + 'enable_link_suggestions' => false, + 'enable_headless_rest_endpoints' => false, + 'tracking' => false, + 'enable_enhanced_slack_sharing' => false, + 'semrush_integration_active' => false, + 'zapier_integration_active' => false, + 'wincher_integration_active' => false, + 'remove_feed_global' => false, + 'remove_feed_global_comments' => false, + 'remove_feed_post_comments' => false, + 'enable_index_now' => false, + 'enable_ai_generator' => false, + 'remove_feed_authors' => false, + 'remove_feed_categories' => false, + 'remove_feed_tags' => false, + 'remove_feed_custom_taxonomies' => false, + 'remove_feed_post_types' => false, + 'remove_feed_search' => false, + 'remove_atom_rdf_feeds' => false, + 'remove_shortlinks' => false, + 'remove_rest_api_links' => false, + 'remove_rsd_wlw_links' => false, + 'remove_oembed_links' => false, + 'remove_generator' => false, + 'remove_emoji_scripts' => false, + 'remove_powered_by_header' => false, + 'remove_pingback_header' => false, + 'clean_campaign_tracking_urls' => false, + 'clean_permalinks' => false, + 'search_cleanup' => false, + 'search_cleanup_emoji' => false, + 'search_cleanup_patterns' => false, + 'redirect_search_pretty_urls' => false, + 'algolia_integration_active' => false, + ]; + + // We can reuse this logic from the base class with the above defaults to parse with the correct feature values. + $options = $this->prevent_disabled_options_update( $options, $feature_vars ); + + return $options; + } + + /** + * Gets the filter hook name and callback for adjusting the retrieved option value + * against the network-allowed features. + * + * @return array Array where the first item is the hook name, the second is the hook callback, + * and the third is the hook priority. + */ + protected function get_verify_features_option_filter_hook() { + return [ + "option_{$this->option_name}", + [ $this, 'verify_features_against_network' ], + 11, + ]; + } + + /** + * Gets the filter hook name and callback for adjusting the default option value against the network-allowed features. + * + * @return array Array where the first item is the hook name, the second is the hook callback, + * and the third is the hook priority. + */ + protected function get_verify_features_default_option_filter_hook() { + return [ + "default_option_{$this->option_name}", + [ $this, 'verify_features_against_network' ], + 11, + ]; + } + + /** + * Clean a given option value. + * + * @param array $option_value Old (not merged with defaults or filtered) option value to + * clean according to the rules for this option. + * @param string|null $current_version Optional. Version from which to upgrade, if not set, + * version specific upgrades will be disregarded. + * @param array|null $all_old_option_values Optional. Only used when importing old options to have + * access to the real old values, in contrast to the saved ones. + * + * @return array Cleaned option. + */ + protected function clean_option( $option_value, $current_version = null, $all_old_option_values = null ) { + // Deal with value change from text string to boolean. + $value_change = [ + 'ignore_search_engines_discouraged_notice', + ]; + + $target_values = [ + 'ignore', + 'done', + ]; + + foreach ( $value_change as $key ) { + if ( isset( $option_value[ $key ] ) + && in_array( $option_value[ $key ], $target_values, true ) + ) { + $option_value[ $key ] = true; + } + } + + return $option_value; + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option.php b/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option.php new file mode 100644 index 00000000..1a4b2ea0 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option.php @@ -0,0 +1,894 @@ + testers] Double check that validation will not cause errors when called + * from upgrade routine (some of the WP functions may not yet be available). + */ +abstract class WPSEO_Option { + + /** + * Prefix for override option keys that allow or disallow the option key of the same name. + * + * @var string + */ + public const ALLOW_KEY_PREFIX = 'allow_'; + + /** + * Option name - MUST be set in concrete class and set to public. + * + * @var string + */ + protected $option_name; + + /** + * Option group name for use in settings forms. + * + * Will be set automagically if not set in concrete class (i.e. + * if it conforms to the normal pattern 'yoast' . $option_name . 'options', + * only set in concrete class if it doesn't). + * + * @var string + */ + public $group_name; + + /** + * Whether to include the option in the return for WPSEO_Options::get_all(). + * + * Also determines which options are copied over for ms_(re)set_blog(). + * + * @var bool + */ + public $include_in_all = true; + + /** + * Whether this option is only for when the install is multisite. + * + * @var bool + */ + public $multisite_only = false; + + /** + * Array of defaults for the option - MUST be set in concrete class. + * + * Shouldn't be requested directly, use $this->get_defaults(); + * + * @var array + */ + protected $defaults; + + /** + * Array of variable option name patterns for the option - if any. + * + * Set this when the option contains array keys which vary based on post_type + * or taxonomy. + * + * @var array + */ + protected $variable_array_key_patterns; + + /** + * Array of sub-options which should not be overloaded with multi-site defaults. + * + * @var array + */ + public $ms_exclude = []; + + /** + * Name for an option higher in the hierarchy to override setting access. + * + * @var string + */ + protected $override_option_name; + + /** + * Instance of this class. + * + * @var WPSEO_Option + */ + protected static $instance; + + + /* *********** INSTANTIATION METHODS *********** */ + + /** + * Add all the actions and filters for the option. + */ + protected function __construct() { + + /* Add filters which get applied to the get_options() results. */ + $this->add_default_filters(); // Return defaults if option not set. + $this->add_option_filters(); // Merge with defaults if option *is* set. + + if ( $this->multisite_only !== true ) { + /** + * The option validation routines remove the default filters to prevent failing + * to insert an option if it's new. Let's add them back afterwards. + */ + add_action( 'add_option', [ $this, 'add_default_filters_if_same_option' ] ); // Adding back after INSERT. + + add_action( 'update_option', [ $this, 'add_default_filters_if_same_option' ] ); + + add_filter( 'pre_update_option', [ $this, 'add_default_filters_if_not_changed' ], PHP_INT_MAX, 3 ); + + // Refills the cache when the option has been updated. + add_action( 'update_option_' . $this->option_name, [ 'WPSEO_Options', 'clear_cache' ], 10 ); + } + elseif ( is_multisite() ) { + /* + * The option validation routines remove the default filters to prevent failing + * to insert an option if it's new. Let's add them back afterwards. + * + * For site_options, this method is not foolproof as these actions are not fired + * on an insert/update failure. Please use the WPSEO_Options::update_site_option() method + * for updating site options to make sure the filters are in place. + */ + add_action( 'add_site_option_' . $this->option_name, [ $this, 'add_default_filters' ] ); + add_action( 'update_site_option_' . $this->option_name, [ $this, 'add_default_filters' ] ); + add_filter( 'pre_update_site_option_' . $this->option_name, [ $this, 'add_default_filters_if_not_changed' ], PHP_INT_MAX, 3 ); + + // Refills the cache when the option has been updated. + add_action( 'update_site_option_' . $this->option_name, [ 'WPSEO_Options', 'clear_cache' ], 1, 0 ); + } + + /* + * Make sure the option will always get validated, independently of register_setting() + * (only available on back-end). + */ + add_filter( 'sanitize_option_' . $this->option_name, [ $this, 'validate' ] ); + + /* Register our option for the admin pages */ + add_action( 'admin_init', [ $this, 'register_setting' ] ); + + /* Set option group name if not given */ + if ( ! isset( $this->group_name ) || $this->group_name === '' ) { + $this->group_name = 'yoast_' . $this->option_name . '_options'; + } + + /* Translate some defaults as early as possible - textdomain is loaded in init on priority 1. */ + if ( method_exists( $this, 'translate_defaults' ) ) { + add_action( 'init', [ $this, 'translate_defaults' ], 2 ); + } + + /** + * Enrich defaults once custom post types and taxonomies have been registered + * which is normally done on the init action. + * + * @todo [JRF/testers] Verify that none of the options which are only available after + * enrichment are used before the enriching. + */ + if ( method_exists( $this, 'enrich_defaults' ) ) { + add_action( 'init', [ $this, 'enrich_defaults' ], 99 ); + } + } + + /* + * All concrete classes *must* contain the get_instance method. + * + * {@internal Unfortunately I can't define it as an abstract as it also *has* to be static...}} + * + * ``` + * abstract protected static function get_instance(); + * ``` + * --------------- + * + * Concrete classes *may* contain a translate_defaults method. + * ``` + * abstract public function translate_defaults(); + * ``` + * --------------- + * + * Concrete classes *may* contain an enrich_defaults method to add additional defaults once + * all post_types and taxonomies have been registered. + * + * ``` + * abstract public function enrich_defaults(); + * ``` + */ + + /* *********** METHODS INFLUENCING get_option() *********** */ + + /** + * Add filters to make sure that the option default is returned if the option is not set. + * + * @return void + */ + public function add_default_filters() { + // Don't change, needs to check for false as could return prio 0 which would evaluate to false. + if ( has_filter( 'default_option_' . $this->option_name, [ $this, 'get_defaults' ] ) === false ) { + add_filter( 'default_option_' . $this->option_name, [ $this, 'get_defaults' ] ); + } + } + + /** + * Adds back the default filters that were removed during validation if the option was changed. + * Checks if this option was changed to prevent constantly checking if filters are present. + * + * @param string $option_name The option name. + * + * @return void + */ + public function add_default_filters_if_same_option( $option_name ) { + if ( $option_name === $this->option_name ) { + $this->add_default_filters(); + } + } + + /** + * Adds back the default filters that were removed during validation if the option was not changed. + * This is because in that case the latter actions are not called and thus the filters are never + * added back. + * + * @param mixed $value The current value. + * @param string $option_name The option name. + * @param mixed $old_value The old value. + * + * @return string The current value. + */ + public function add_default_filters_if_not_changed( $value, $option_name, $old_value ) { + if ( $option_name !== $this->option_name ) { + return $value; + } + + if ( $value === $old_value || maybe_serialize( $value ) === maybe_serialize( $old_value ) ) { + $this->add_default_filters(); + } + + return $value; + } + + /** + * Validate webmaster tools & Pinterest verification strings. + * + * @param string $key Key to check, by type of service. + * @param array $dirty Dirty data with the new values. + * @param array $old Old data. + * @param array $clean Clean data by reference, normally the default values. + * + * @return void + */ + public function validate_verification_string( $key, $dirty, $old, &$clean ) { + if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) { + $meta = $dirty[ $key ]; + if ( strpos( $meta, 'content=' ) ) { + // Make sure we only have the real key, not a complete meta tag. + preg_match( '`content=([\'"])?([^\'"> ]+)(?:\1|[ />])`', $meta, $match ); + if ( isset( $match[2] ) ) { + $meta = $match[2]; + } + unset( $match ); + } + + $meta = sanitize_text_field( $meta ); + if ( $meta !== '' ) { + $regex = '`^[A-Fa-f0-9_-]+$`'; + $service = ''; + + switch ( $key ) { + case 'baiduverify': + $regex = '`^[A-Za-z0-9_-]+$`'; + $service = 'Baidu Webmaster tools'; + break; + + case 'googleverify': + $regex = '`^[A-Za-z0-9_-]+$`'; + $service = 'Google Webmaster tools'; + break; + + case 'msverify': + $service = 'Bing Webmaster tools'; + break; + + case 'pinterestverify': + $service = 'Pinterest'; + break; + + case 'yandexverify': + $service = 'Yandex Webmaster tools'; + break; + } + + if ( preg_match( $regex, $meta ) ) { + $clean[ $key ] = $meta; + } + else { + // Restore the previous value, if any. + if ( isset( $old[ $key ] ) && preg_match( $regex, $old[ $key ] ) ) { + $clean[ $key ] = $old[ $key ]; + } + + if ( function_exists( 'add_settings_error' ) ) { + add_settings_error( + $this->group_name, // Slug title of the setting. + $key, // Suffix-ID for the error message box. WordPress prepends `setting-error-`. + /* translators: 1: Verification string from user input; 2: Service name. */ + sprintf( __( '%1$s does not seem to be a valid %2$s verification string. Please correct.', 'wordpress-seo' ), '' . esc_html( $meta ) . '', $service ), // The error message. + 'error' // CSS class for the WP notice, either the legacy 'error' / 'updated' or the new `notice-*` ones. + ); + } + + Yoast_Input_Validation::add_dirty_value_to_settings_errors( $key, $meta ); + } + } + } + } + + /** + * Validates an option as a valid URL. Prints out a WordPress settings error + * notice if the URL is invalid. + * + * @param string $key Key to check, by type of URL setting. + * @param array $dirty Dirty data with the new values. + * @param array $old Old data. + * @param array $clean Clean data by reference, normally the default values. + * + * @return void + */ + public function validate_url( $key, $dirty, $old, &$clean ) { + if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) { + + $submitted_url = trim( $dirty[ $key ] ); + $validated_url = filter_var( WPSEO_Utils::sanitize_url( $submitted_url ), FILTER_VALIDATE_URL ); + + if ( $validated_url === false ) { + if ( function_exists( 'add_settings_error' ) ) { + add_settings_error( + // Slug title of the setting. + $this->group_name, + // Suffix-ID for the error message box. WordPress prepends `setting-error-`. + $key, + // The error message. + sprintf( + /* translators: %s expands to an invalid URL. */ + __( '%s does not seem to be a valid url. Please correct.', 'wordpress-seo' ), + '' . esc_url( $submitted_url ) . '' + ), + // Message type. + 'error' + ); + } + + // Restore the previous URL value, if any. + if ( isset( $old[ $key ] ) && $old[ $key ] !== '' ) { + $url = WPSEO_Utils::sanitize_url( $old[ $key ] ); + if ( $url !== '' ) { + $clean[ $key ] = $url; + } + } + + Yoast_Input_Validation::add_dirty_value_to_settings_errors( $key, $submitted_url ); + + return; + } + + // The URL format is valid, let's sanitize it. + $url = WPSEO_Utils::sanitize_url( $validated_url ); + + if ( $url !== '' ) { + $clean[ $key ] = $url; + } + } + } + + /** + * Remove the default filters. + * Called from the validate() method to prevent failure to add new options. + * + * @return void + */ + public function remove_default_filters() { + remove_filter( 'default_option_' . $this->option_name, [ $this, 'get_defaults' ] ); + } + + /** + * Get the enriched default value for an option. + * + * Checks if the concrete class contains an enrich_defaults() method and if so, runs it. + * + * {@internal The enrich_defaults method is used to set defaults for variable array keys + * in an option, such as array keys depending on post_types and/or taxonomies.}} + * + * @return array + */ + public function get_defaults() { + if ( method_exists( $this, 'translate_defaults' ) ) { + $this->translate_defaults(); + } + + if ( method_exists( $this, 'enrich_defaults' ) ) { + $this->enrich_defaults(); + } + + return apply_filters( 'wpseo_defaults', $this->defaults, $this->option_name ); + } + + /** + * Add filters to make sure that the option is merged with its defaults before being returned. + * + * @return void + */ + public function add_option_filters() { + // Don't change, needs to check for false as could return prio 0 which would evaluate to false. + if ( has_filter( 'option_' . $this->option_name, [ $this, 'get_option' ] ) === false ) { + add_filter( 'option_' . $this->option_name, [ $this, 'get_option' ] ); + } + } + + /** + * Remove the option filters. + * Called from the clean_up methods to make sure we retrieve the original old option. + * + * @return void + */ + public function remove_option_filters() { + remove_filter( 'option_' . $this->option_name, [ $this, 'get_option' ] ); + } + + /** + * Merge an option with its default values. + * + * This method should *not* be called directly!!! It is only meant to filter the get_option() results. + * + * @param mixed $options Option value. + * + * @return mixed Option merged with the defaults for that option. + */ + public function get_option( $options = null ) { + $filtered = $this->array_filter_merge( $options ); + + /* + * If the option contains variable option keys, make sure we don't remove those settings + * - even if the defaults are not complete yet. + * Unfortunately this means we also won't be removing the settings for post types or taxonomies + * which are no longer in the WP install, but rather that than the other way around. + */ + if ( isset( $this->variable_array_key_patterns ) ) { + $filtered = $this->retain_variable_keys( $options, $filtered ); + } + + return $filtered; + } + + /* *********** METHODS influencing add_option(), update_option() and saving from admin pages. *********** */ + + /** + * Register (whitelist) the option for the configuration pages. + * The validation callback is already registered separately on the sanitize_option hook, + * so no need to double register. + * + * @return void + */ + public function register_setting() { + if ( ! WPSEO_Capability_Utils::current_user_can( 'wpseo_manage_options' ) ) { + return; + } + + if ( $this->multisite_only === true ) { + $network_settings_api = Yoast_Network_Settings_API::get(); + if ( $network_settings_api->meets_requirements() ) { + $network_settings_api->register_setting( $this->group_name, $this->option_name ); + } + return; + } + + register_setting( $this->group_name, $this->option_name ); + } + + /** + * Validate the option. + * + * @param mixed $option_value The unvalidated new value for the option. + * + * @return array Validated new value for the option. + */ + public function validate( $option_value ) { + $clean = $this->get_defaults(); + + /* Return the defaults if the new value is empty. */ + if ( ! is_array( $option_value ) || $option_value === [] ) { + return $clean; + } + + $option_value = array_map( [ 'WPSEO_Utils', 'trim_recursive' ], $option_value ); + + $old = $this->get_original_option(); + if ( ! is_array( $old ) ) { + $old = []; + } + $old = array_merge( $clean, $old ); + + $clean = $this->validate_option( $option_value, $clean, $old ); + + // Prevent updates to variables that are disabled via the override option. + $clean = $this->prevent_disabled_options_update( $clean, $old ); + + /* Retain the values for variable array keys even when the post type/taxonomy is not yet registered. */ + if ( isset( $this->variable_array_key_patterns ) ) { + $clean = $this->retain_variable_keys( $option_value, $clean ); + } + + $this->remove_default_filters(); + + return $clean; + } + + /** + * Checks whether a specific option key is disabled. + * + * This is determined by whether an override option is available with a key that equals the given key prefixed + * with 'allow_'. + * + * @param string $key Option key. + * + * @return bool True if option key is disabled, false otherwise. + */ + public function is_disabled( $key ) { + $override_option = $this->get_override_option(); + if ( empty( $override_option ) ) { + return false; + } + + return isset( $override_option[ self::ALLOW_KEY_PREFIX . $key ] ) && ! $override_option[ self::ALLOW_KEY_PREFIX . $key ]; + } + + /** + * All concrete classes must contain a validate_option() method which validates all + * values within the option. + * + * @param array $dirty New value for the option. + * @param array $clean Clean value for the option, normally the defaults. + * @param array $old Old value of the option. + */ + abstract protected function validate_option( $dirty, $clean, $old ); + + /* *********** METHODS for ADDING/UPDATING/UPGRADING the option. *********** */ + + /** + * Retrieve the real old value (unmerged with defaults). + * + * @return array|bool The original option value (which can be false if the option doesn't exist). + */ + protected function get_original_option() { + $this->remove_default_filters(); + $this->remove_option_filters(); + + // Get (unvalidated) array, NOT merged with defaults. + if ( $this->multisite_only !== true ) { + $option_value = get_option( $this->option_name ); + } + else { + $option_value = get_site_option( $this->option_name ); + } + + $this->add_option_filters(); + $this->add_default_filters(); + + return $option_value; + } + + /** + * Add the option if it doesn't exist for some strange reason. + * + * @uses WPSEO_Option::get_original_option() + * + * @return void + */ + public function maybe_add_option() { + if ( $this->get_original_option() === false ) { + if ( $this->multisite_only !== true ) { + update_option( $this->option_name, $this->get_defaults() ); + } + else { + $this->update_site_option( $this->get_defaults() ); + } + } + } + + /** + * Update a site_option. + * + * {@internal This special method is only needed for multisite options, but very needed indeed there. + * The order in which certain functions and hooks are run is different between + * get_option() and get_site_option() which means in practice that the removing + * of the default filters would be done too late and the re-adding of the default + * filters might not be done at all. + * Aka: use the WPSEO_Options::update_site_option() method (which calls this method) + * for safely adding/updating multisite options.}} + * + * @param mixed $value The new value for the option. + * + * @return bool Whether the update was successful. + */ + public function update_site_option( $value ) { + if ( $this->multisite_only === true && is_multisite() ) { + $this->remove_default_filters(); + $result = update_site_option( $this->option_name, $value ); + $this->add_default_filters(); + + return $result; + } + else { + return false; + } + } + + /** + * Retrieve the real old value (unmerged with defaults), clean and re-save the option. + * + * @uses WPSEO_Option::get_original_option() + * @uses WPSEO_Option::import() + * + * @param string|null $current_version Optional. Version from which to upgrade, if not set, + * version-specific upgrades will be disregarded. + * + * @return void + */ + public function clean( $current_version = null ) { + $option_value = $this->get_original_option(); + $this->import( $option_value, $current_version ); + } + + /** + * Clean and re-save the option. + * + * @uses clean_option() method from concrete class if it exists. + * + * @todo [JRF/whomever] Figure out a way to show settings error during/after the upgrade - maybe + * something along the lines of: + * -> add them to a property in this class + * -> if that property isset at the end of the routine and add_settings_error function does not exist, + * save as transient (or update the transient if one already exists) + * -> next time an admin is in the WP back-end, show the errors and delete the transient or only delete it + * once the admin has dismissed the message (add ajax function) + * Important: all validation routines which add_settings_errors would need to be changed for this to work + * + * @param array $option_value Option value to be imported. + * @param string|null $current_version Optional. Version from which to upgrade, if not set, + * version-specific upgrades will be disregarded. + * @param array|null $all_old_option_values Optional. Only used when importing old options to + * have access to the real old values, in contrast to + * the saved ones. + * + * @return void + */ + public function import( $option_value, $current_version = null, $all_old_option_values = null ) { + if ( $option_value === false ) { + $option_value = $this->get_defaults(); + } + elseif ( is_array( $option_value ) && method_exists( $this, 'clean_option' ) ) { + $option_value = $this->clean_option( $option_value, $current_version, $all_old_option_values ); + } + + /* + * Save the cleaned value - validation will take care of cleaning out array keys which + * should no longer be there. + */ + if ( $this->multisite_only !== true ) { + update_option( $this->option_name, $option_value ); + } + else { + $this->update_site_option( $this->option_name, $option_value ); + } + } + + /** + * Returns the variable array key patterns for an options class. + * + * @return array + */ + public function get_patterns() { + return (array) $this->variable_array_key_patterns; + } + + /** + * Retrieves the option name. + * + * @return string The set option name. + */ + public function get_option_name() { + return $this->option_name; + } + + /* + * Concrete classes *may* contain a clean_option method which will clean out old/renamed + * values within the option. + * + * ``` + * abstract public function clean_option( $option_value, $current_version = null, $all_old_option_values = null ); + * ``` + */ + + /* *********** HELPER METHODS for internal use. *********** */ + + /** + * Helper method - Combines a fixed array of default values with an options array + * while filtering out any keys which are not in the defaults array. + * + * @todo [JRF] - shouldn't this be a straight array merge ? at the end of the day, the validation + * removes any invalid keys on save. + * + * @param array|null $options Optional. Current options. If not set, the option defaults + * for the $option_key will be returned. + * + * @return array Combined and filtered options array. + */ + protected function array_filter_merge( $options = null ) { + + $defaults = $this->get_defaults(); + + if ( ! isset( $options ) || $options === false || $options === [] ) { + return $defaults; + } + + $options = (array) $options; + + /* + $filtered = array(); + + if ( $defaults !== array() ) { + foreach ( $defaults as $key => $default_value ) { + // @todo should this walk through array subkeys ? + $filtered[ $key ] = ( isset( $options[ $key ] ) ? $options[ $key ] : $default_value ); + } + } + */ + $filtered = array_merge( $defaults, $options ); + + return $filtered; + } + + /** + * Sets updated values for variables that are disabled via the override option back to their previous values. + * + * @param array $updated Updated option value. + * @param array $old Old option value. + * + * @return array Updated option value, with all disabled variables set to their old values. + */ + protected function prevent_disabled_options_update( $updated, $old ) { + $override_option = $this->get_override_option(); + if ( empty( $override_option ) ) { + return $updated; + } + + /* + * This loop could as well call `is_disabled( $key )` for each iteration, + * however this would be worse performance-wise. + */ + foreach ( $old as $key => $value ) { + if ( isset( $override_option[ self::ALLOW_KEY_PREFIX . $key ] ) && ! $override_option[ self::ALLOW_KEY_PREFIX . $key ] ) { + $updated[ $key ] = $old[ $key ]; + } + } + + return $updated; + } + + /** + * Retrieves the value of the override option, if available. + * + * An override option contains values that may determine access to certain sub-variables + * of this option. + * + * Only regular options in multisite can have override options, which in that case + * would be network options. + * + * @return array Override option value, or empty array if unavailable. + */ + protected function get_override_option() { + if ( empty( $this->override_option_name ) || $this->multisite_only === true || ! is_multisite() ) { + return []; + } + + return get_site_option( $this->override_option_name, [] ); + } + + /** + * Make sure that any set option values relating to post_types and/or taxonomies are retained, + * even when that post_type or taxonomy may not yet have been registered. + * + * {@internal The wpseo_titles concrete class overrules this method. Make sure that any + * changes applied here, also get ported to that version.}} + * + * @param array $dirty Original option as retrieved from the database. + * @param array $clean Filtered option where any options which shouldn't be in our option + * have already been removed and any options which weren't set + * have been set to their defaults. + * + * @return array + */ + protected function retain_variable_keys( $dirty, $clean ) { + if ( ( is_array( $this->variable_array_key_patterns ) && $this->variable_array_key_patterns !== [] ) && ( is_array( $dirty ) && $dirty !== [] ) ) { + foreach ( $dirty as $key => $value ) { + + // Do nothing if already in filtered options. + if ( isset( $clean[ $key ] ) ) { + continue; + } + + foreach ( $this->variable_array_key_patterns as $pattern ) { + + if ( strpos( $key, $pattern ) === 0 ) { + $clean[ $key ] = $value; + break; + } + } + } + } + + return $clean; + } + + /** + * Check whether a given array key conforms to one of the variable array key patterns for this option. + * + * @used-by validate_option() methods for options with variable array keys. + * + * @param string $key Array key to check. + * + * @return string Pattern if it conforms, original array key if it doesn't or if the option + * does not have variable array keys. + */ + protected function get_switch_key( $key ) { + if ( ! isset( $this->variable_array_key_patterns ) || ( ! is_array( $this->variable_array_key_patterns ) || $this->variable_array_key_patterns === [] ) ) { + return $key; + } + + foreach ( $this->variable_array_key_patterns as $pattern ) { + if ( strpos( $key, $pattern ) === 0 ) { + return $pattern; + } + } + + return $key; + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-options.php b/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-options.php new file mode 100644 index 00000000..eaae3340 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-options.php @@ -0,0 +1,596 @@ + (string) name of concrete class for the option. + */ + public static $options = [ + 'wpseo' => 'WPSEO_Option_Wpseo', + 'wpseo_titles' => 'WPSEO_Option_Titles', + 'wpseo_social' => 'WPSEO_Option_Social', + 'wpseo_ms' => 'WPSEO_Option_MS', + 'wpseo_taxonomy_meta' => 'WPSEO_Taxonomy_Meta', + ]; + + /** + * Array of instantiated option objects. + * + * @var array + */ + protected static $option_instances = []; + + /** + * Array with the option names. + * + * @var array + */ + protected static $option_names = []; + + /** + * Instance of this class. + * + * @var WPSEO_Options + */ + protected static $instance; + + /** + * Instantiate all the WPSEO option management classes. + */ + protected function __construct() { + $this->register_hooks(); + + foreach ( static::$options as $option_class ) { + static::register_option( call_user_func( [ $option_class, 'get_instance' ] ) ); + } + } + + /** + * Register our hooks. + * + * @return void + */ + public function register_hooks() { + add_action( 'registered_taxonomy', [ $this, 'clear_cache' ] ); + add_action( 'unregistered_taxonomy', [ $this, 'clear_cache' ] ); + add_action( 'registered_post_type', [ $this, 'clear_cache' ] ); + add_action( 'unregistered_post_type', [ $this, 'clear_cache' ] ); + } + + /** + * Get the singleton instance of this class. + * + * @return object + */ + public static function get_instance() { + if ( ! ( static::$instance instanceof self ) ) { + static::$instance = new self(); + } + + return static::$instance; + } + + /** + * Registers an option to the options list. + * + * @param WPSEO_Option $option_instance Instance of the option. + * + * @return void + */ + public static function register_option( WPSEO_Option $option_instance ) { + $option_name = $option_instance->get_option_name(); + + if ( $option_instance->multisite_only && ! static::is_multisite() ) { + unset( static::$options[ $option_name ], static::$option_names[ $option_name ] ); + + return; + } + + $is_already_registered = array_key_exists( $option_name, static::$options ); + if ( ! $is_already_registered ) { + static::$options[ $option_name ] = get_class( $option_instance ); + } + + if ( $option_instance->include_in_all === true ) { + static::$option_names[ $option_name ] = $option_name; + } + + static::$option_instances[ $option_name ] = $option_instance; + + if ( ! $is_already_registered ) { + static::clear_cache(); + } + } + + /** + * Get the group name of an option for use in the settings form. + * + * @param string $option_name The option for which you want to retrieve the option group name. + * + * @return string|bool + */ + public static function get_group_name( $option_name ) { + if ( isset( static::$option_instances[ $option_name ] ) ) { + return static::$option_instances[ $option_name ]->group_name; + } + + return false; + } + + /** + * Get a specific default value for an option. + * + * @param string $option_name The option for which you want to retrieve a default. + * @param string $key The key within the option who's default you want. + * + * @return mixed + */ + public static function get_default( $option_name, $key ) { + if ( isset( static::$option_instances[ $option_name ] ) ) { + $defaults = static::$option_instances[ $option_name ]->get_defaults(); + if ( isset( $defaults[ $key ] ) ) { + return $defaults[ $key ]; + } + } + + return null; + } + + /** + * Update a site_option. + * + * @param string $option_name The option name of the option to save. + * @param mixed $value The new value for the option. + * + * @return bool + */ + public static function update_site_option( $option_name, $value ) { + if ( is_multisite() && isset( static::$option_instances[ $option_name ] ) ) { + return static::$option_instances[ $option_name ]->update_site_option( $value ); + } + + return false; + } + + /** + * Get the instantiated option instance. + * + * @param string $option_name The option for which you want to retrieve the instance. + * + * @return object|bool + */ + public static function get_option_instance( $option_name ) { + if ( isset( static::$option_instances[ $option_name ] ) ) { + return static::$option_instances[ $option_name ]; + } + + return false; + } + + /** + * Retrieve an array of the options which should be included in get_all() and reset(). + * + * @return array Array of option names. + */ + public static function get_option_names() { + $option_names = array_values( static::$option_names ); + if ( $option_names === [] ) { + foreach ( static::$option_instances as $option_name => $option_object ) { + if ( $option_object->include_in_all === true ) { + $option_names[] = $option_name; + } + } + } + + /** + * Filter: wpseo_options - Allow developers to change the option name to include. + * + * @param array $option_names The option names to include in get_all and reset(). + */ + return apply_filters( 'wpseo_options', $option_names ); + } + + /** + * Retrieve all the options for the SEO plugin in one go. + * + * @return array Array combining the values of all the options. + */ + public static function get_all() { + static::$option_values = static::get_options( static::get_option_names() ); + + return static::$option_values; + } + + /** + * Retrieve one or more options for the SEO plugin. + * + * @param array $option_names An array of option names of the options you want to get. + * + * @return array Array combining the values of the requested options. + */ + public static function get_options( array $option_names ) { + $options = []; + $option_names = array_filter( $option_names, 'is_string' ); + foreach ( $option_names as $option_name ) { + if ( isset( static::$option_instances[ $option_name ] ) ) { + $option = static::get_option( $option_name ); + + if ( $option !== null ) { + $options = array_merge( $options, $option ); + } + } + } + + return $options; + } + + /** + * Retrieve a single option for the SEO plugin. + * + * @param string $option_name The name of the option you want to get. + * + * @return array Array containing the requested option. + */ + public static function get_option( $option_name ) { + $option = null; + if ( is_string( $option_name ) && ! empty( $option_name ) ) { + if ( isset( static::$option_instances[ $option_name ] ) ) { + if ( static::$option_instances[ $option_name ]->multisite_only !== true ) { + $option = get_option( $option_name ); + } + else { + $option = get_site_option( $option_name ); + } + } + } + + return $option; + } + + /** + * Retrieve a single field from any option for the SEO plugin. Keys are always unique. + * + * @param string $key The key it should return. + * @param mixed $default_value The default value that should be returned if the key isn't set. + * + * @return mixed Returns value if found, $default_value if not. + */ + public static function get( $key, $default_value = null ) { + if ( static::$option_values === null ) { + static::prime_cache(); + } + if ( isset( static::$option_values[ $key ] ) ) { + return static::$option_values[ $key ]; + } + + return $default_value; + } + + /** + * Resets the cache to null. + * + * @return void + */ + public static function clear_cache() { + static::$option_values = null; + } + + /** + * Primes our cache. + * + * @return void + */ + private static function prime_cache() { + static::$option_values = static::get_all(); + static::$option_values = static::add_ms_option( static::$option_values ); + } + + /** + * Retrieve a single field from an option for the SEO plugin. + * + * @param string $key The key to set. + * @param mixed $value The value to set. + * + * @return mixed|null Returns value if found, $default if not. + */ + public static function set( $key, $value ) { + $lookup_table = static::get_lookup_table(); + + if ( isset( $lookup_table[ $key ] ) ) { + return static::save_option( $lookup_table[ $key ], $key, $value ); + } + + $patterns = static::get_pattern_table(); + foreach ( $patterns as $pattern => $option ) { + if ( strpos( $key, $pattern ) === 0 ) { + return static::save_option( $option, $key, $value ); + } + } + + static::$option_values[ $key ] = $value; + } + + /** + * Get an option only if it's been auto-loaded. + * + * @param string $option The option to retrieve. + * @param mixed $default_value A default value to return. + * + * @return mixed + */ + public static function get_autoloaded_option( $option, $default_value = false ) { + $value = wp_cache_get( $option, 'options' ); + if ( $value === false ) { + $passed_default = func_num_args() > 1; + + // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Using WP native filter. + return apply_filters( "default_option_{$option}", $default_value, $option, $passed_default ); + } + + // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Using WP native filter. + return apply_filters( "option_{$option}", maybe_unserialize( $value ), $option ); + } + + /** + * Run the clean up routine for one or all options. + * + * @param array|string|null $option_name Optional. the option you want to clean or an array of + * option names for the options you want to clean. + * If not set, all options will be cleaned. + * @param string|null $current_version Optional. Version from which to upgrade, if not set, + * version specific upgrades will be disregarded. + * + * @return void + */ + public static function clean_up( $option_name = null, $current_version = null ) { + if ( isset( $option_name ) && is_string( $option_name ) && $option_name !== '' ) { + if ( isset( static::$option_instances[ $option_name ] ) ) { + static::$option_instances[ $option_name ]->clean( $current_version ); + } + } + elseif ( isset( $option_name ) && is_array( $option_name ) && $option_name !== [] ) { + foreach ( $option_name as $option ) { + if ( isset( static::$option_instances[ $option ] ) ) { + static::$option_instances[ $option ]->clean( $current_version ); + } + } + unset( $option ); + } + else { + foreach ( static::$option_instances as $instance ) { + $instance->clean( $current_version ); + } + unset( $instance ); + + // If we've done a full clean-up, we can safely remove this really old option. + delete_option( 'wpseo_indexation' ); + } + } + + /** + * Check that all options exist in the database and add any which don't. + * + * @return void + */ + public static function ensure_options_exist() { + foreach ( static::$option_instances as $instance ) { + $instance->maybe_add_option(); + } + } + + /** + * Initialize some options on first install/activate/reset. + * + * @return void + */ + public static function initialize() { + /* Force WooThemes to use Yoast SEO data. */ + if ( function_exists( 'woo_version_init' ) ) { + update_option( 'seo_woo_use_third_party_data', 'true' ); + } + } + + /** + * Reset all options to their default values and rerun some tests. + * + * @return void + */ + public static function reset() { + if ( ! is_multisite() ) { + $option_names = static::get_option_names(); + if ( is_array( $option_names ) && $option_names !== [] ) { + foreach ( $option_names as $option_name ) { + delete_option( $option_name ); + update_option( $option_name, get_option( $option_name ) ); + } + } + unset( $option_names ); + } + else { + // Reset MS blog based on network default blog setting. + static::reset_ms_blog( get_current_blog_id() ); + } + + static::initialize(); + } + + /** + * Initialize default values for a new multisite blog. + * + * @param bool $force_init Whether to always do the initialization routine (title/desc test). + * + * @return void + */ + public static function maybe_set_multisite_defaults( $force_init = false ) { + $option = get_option( 'wpseo' ); + + if ( is_multisite() ) { + if ( $option['ms_defaults_set'] === false ) { + static::reset_ms_blog( get_current_blog_id() ); + static::initialize(); + } + elseif ( $force_init === true ) { + static::initialize(); + } + } + } + + /** + * Reset all options for a specific multisite blog to their default values based upon a + * specified default blog if one was chosen on the network page or the plugin defaults if it was not. + * + * @param int|string $blog_id Blog id of the blog for which to reset the options. + * + * @return void + */ + public static function reset_ms_blog( $blog_id ) { + if ( is_multisite() ) { + $options = get_site_option( 'wpseo_ms' ); + $option_names = static::get_option_names(); + + if ( is_array( $option_names ) && $option_names !== [] ) { + $base_blog_id = $blog_id; + if ( $options['defaultblog'] !== '' && $options['defaultblog'] !== 0 ) { + $base_blog_id = $options['defaultblog']; + } + + foreach ( $option_names as $option_name ) { + delete_blog_option( $blog_id, $option_name ); + + $new_option = get_blog_option( $base_blog_id, $option_name ); + + /* Remove sensitive, theme dependent and site dependent info. */ + if ( isset( static::$option_instances[ $option_name ] ) && static::$option_instances[ $option_name ]->ms_exclude !== [] ) { + foreach ( static::$option_instances[ $option_name ]->ms_exclude as $key ) { + unset( $new_option[ $key ] ); + } + } + + if ( $option_name === 'wpseo' ) { + $new_option['ms_defaults_set'] = true; + } + + update_blog_option( $blog_id, $option_name, $new_option ); + } + } + } + } + + /** + * Saves the option to the database. + * + * @param string $wpseo_options_group_name The name for the wpseo option group in the database. + * @param string $option_name The name for the option to set. + * @param mixed $option_value The value for the option. + * + * @return bool Returns true if the option is successfully saved in the database. + */ + public static function save_option( $wpseo_options_group_name, $option_name, $option_value ) { + $options = static::get_option( $wpseo_options_group_name ); + $options[ $option_name ] = $option_value; + + if ( isset( static::$option_instances[ $wpseo_options_group_name ] ) && static::$option_instances[ $wpseo_options_group_name ]->multisite_only === true ) { + static::update_site_option( $wpseo_options_group_name, $options ); + } + else { + update_option( $wpseo_options_group_name, $options ); + } + + // Check if everything got saved properly. + $saved_option = static::get_option( $wpseo_options_group_name ); + + // Clear our cache. + static::clear_cache(); + + return $saved_option[ $option_name ] === $options[ $option_name ]; + } + + /** + * Adds the multisite options to the option stack if relevant. + * + * @param array $option The currently present options settings. + * + * @return array Options possibly including multisite. + */ + protected static function add_ms_option( $option ) { + if ( ! is_multisite() ) { + return $option; + } + + $ms_option = static::get_option( 'wpseo_ms' ); + if ( $ms_option === null ) { + return $option; + } + + return array_merge( $option, $ms_option ); + } + + /** + * Checks if installation is multisite. + * + * @return bool True when is multisite. + */ + protected static function is_multisite() { + static $is_multisite; + + if ( $is_multisite === null ) { + $is_multisite = is_multisite(); + } + + return $is_multisite; + } + + /** + * Retrieves a lookup table to find in which option_group a key is stored. + * + * @return array The lookup table. + */ + private static function get_lookup_table() { + $lookup_table = []; + + foreach ( array_keys( static::$options ) as $option_name ) { + $full_option = static::get_option( $option_name ); + foreach ( $full_option as $key => $value ) { + $lookup_table[ $key ] = $option_name; + } + } + + return $lookup_table; + } + + /** + * Retrieves a lookup table to find in which option_group a key is stored. + * + * @return array The lookup table. + */ + private static function get_pattern_table() { + $pattern_table = []; + foreach ( static::$options as $option_name => $option_class ) { + $instance = call_user_func( [ $option_class, 'get_instance' ] ); + foreach ( $instance->get_patterns() as $key ) { + $pattern_table[ $key ] = $option_name; + } + } + + return $pattern_table; + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-taxonomy-meta.php b/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-taxonomy-meta.php new file mode 100644 index 00000000..b2c591bf --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-taxonomy-meta.php @@ -0,0 +1,566 @@ +get_defaults(); + * + * {@internal Important: in contrast to most defaults, the below array format is + * very bare. The real option is in the format [taxonomy_name][term_id][...] + * where [...] is any of the $defaults_per_term options shown below. + * This is of course taken into account in the below methods.}} + * + * @var array + */ + protected $defaults = []; + + /** + * Option name - same as $option_name property, but now also available to static methods. + * + * @var string + */ + public static $name; + + /** + * Array of defaults for individual taxonomy meta entries. + * + * @var array + */ + public static $defaults_per_term = [ + 'wpseo_title' => '', + 'wpseo_desc' => '', + 'wpseo_canonical' => '', + 'wpseo_bctitle' => '', + 'wpseo_noindex' => 'default', + 'wpseo_focuskw' => '', + 'wpseo_linkdex' => '', + 'wpseo_content_score' => '', + 'wpseo_inclusive_language_score' => '', + 'wpseo_focuskeywords' => '[]', + 'wpseo_keywordsynonyms' => '[]', + 'wpseo_is_cornerstone' => '0', + + // Social fields. + 'wpseo_opengraph-title' => '', + 'wpseo_opengraph-description' => '', + 'wpseo_opengraph-image' => '', + 'wpseo_opengraph-image-id' => '', + 'wpseo_twitter-title' => '', + 'wpseo_twitter-description' => '', + 'wpseo_twitter-image' => '', + 'wpseo_twitter-image-id' => '', + ]; + + /** + * Available index options. + * + * Used for form generation and input validation. + * + * {@internal Labels (translation) added on admin_init via WPSEO_Taxonomy::translate_meta_options().}} + * + * @var array + */ + public static $no_index_options = [ + 'default' => '', + 'index' => '', + 'noindex' => '', + ]; + + /** + * Add the actions and filters for the option. + * + * @todo [JRF => testers] Check if the extra actions below would run into problems if an option + * is updated early on and if so, change the call to schedule these for a later action on add/update + * instead of running them straight away. + */ + protected function __construct() { + parent::__construct(); + + self::$name = $this->option_name; + } + + /** + * Get the singleton instance of this class. + * + * @return object + */ + public static function get_instance() { + if ( ! ( self::$instance instanceof self ) ) { + self::$instance = new self(); + self::$name = self::$instance->option_name; + } + + return self::$instance; + } + + /** + * Add extra default options received from a filter. + * + * @return void + */ + public function enrich_defaults() { + $extra_defaults_per_term = apply_filters( 'wpseo_add_extra_taxmeta_term_defaults', [] ); + if ( is_array( $extra_defaults_per_term ) ) { + self::$defaults_per_term = array_merge( $extra_defaults_per_term, self::$defaults_per_term ); + } + } + + /** + * Validate the option. + * + * @param array $dirty New value for the option. + * @param array $clean Clean value for the option, normally the defaults. + * @param array $old Old value of the option. + * + * @return array Validated clean value for the option to be saved to the database. + */ + protected function validate_option( $dirty, $clean, $old ) { + /* + * Prevent complete validation (which can be expensive when there are lots of terms) + * if only one item has changed and has already been validated. + */ + if ( isset( $dirty['wpseo_already_validated'] ) && $dirty['wpseo_already_validated'] === true ) { + unset( $dirty['wpseo_already_validated'] ); + + return $dirty; + } + + foreach ( $dirty as $taxonomy => $terms ) { + /* Don't validate taxonomy - may not be registered yet and we don't want to remove valid ones. */ + if ( is_array( $terms ) && $terms !== [] ) { + foreach ( $terms as $term_id => $meta_data ) { + /* Only validate term if the taxonomy exists. */ + if ( taxonomy_exists( $taxonomy ) && get_term_by( 'id', $term_id, $taxonomy ) === false ) { + /* Is this term id a special case ? */ + if ( has_filter( 'wpseo_tax_meta_special_term_id_validation_' . $term_id ) !== false ) { + $clean[ $taxonomy ][ $term_id ] = apply_filters( 'wpseo_tax_meta_special_term_id_validation_' . $term_id, $meta_data, $taxonomy, $term_id ); + } + continue; + } + + if ( is_array( $meta_data ) && $meta_data !== [] ) { + /* Validate meta data. */ + $old_meta = self::get_term_meta( $term_id, $taxonomy ); + $meta_data = self::validate_term_meta_data( $meta_data, $old_meta ); + if ( $meta_data !== [] ) { + $clean[ $taxonomy ][ $term_id ] = $meta_data; + } + } + + // Deal with special cases (for when taxonomy doesn't exist yet). + if ( ! isset( $clean[ $taxonomy ][ $term_id ] ) && has_filter( 'wpseo_tax_meta_special_term_id_validation_' . $term_id ) !== false ) { + $clean[ $taxonomy ][ $term_id ] = apply_filters( 'wpseo_tax_meta_special_term_id_validation_' . $term_id, $meta_data, $taxonomy, $term_id ); + } + } + } + } + + return $clean; + } + + /** + * Validate the meta data for one individual term and removes default values (no need to save those). + * + * @param array $meta_data New values. + * @param array $old_meta The original values. + * + * @return array Validated and filtered value. + */ + public static function validate_term_meta_data( $meta_data, $old_meta ) { + + $clean = self::$defaults_per_term; + $meta_data = array_map( [ 'WPSEO_Utils', 'trim_recursive' ], $meta_data ); + + if ( ! is_array( $meta_data ) || $meta_data === [] ) { + return $clean; + } + + foreach ( $clean as $key => $value ) { + switch ( $key ) { + + case 'wpseo_noindex': + if ( isset( $meta_data[ $key ] ) ) { + if ( isset( self::$no_index_options[ $meta_data[ $key ] ] ) ) { + $clean[ $key ] = $meta_data[ $key ]; + } + } + elseif ( isset( $old_meta[ $key ] ) ) { + // Retain old value if field currently not in use. + $clean[ $key ] = $old_meta[ $key ]; + } + break; + + case 'wpseo_canonical': + if ( isset( $meta_data[ $key ] ) && $meta_data[ $key ] !== '' ) { + $url = WPSEO_Utils::sanitize_url( $meta_data[ $key ] ); + if ( $url !== '' ) { + $clean[ $key ] = $url; + } + unset( $url ); + } + break; + + case 'wpseo_bctitle': + if ( isset( $meta_data[ $key ] ) ) { + $clean[ $key ] = WPSEO_Utils::sanitize_text_field( $meta_data[ $key ] ); + } + elseif ( isset( $old_meta[ $key ] ) ) { + // Retain old value if field currently not in use. + $clean[ $key ] = $old_meta[ $key ]; + } + break; + + case 'wpseo_keywordsynonyms': + if ( isset( $meta_data[ $key ] ) && is_string( $meta_data[ $key ] ) ) { + // The data is stringified JSON. Use `json_decode` and `json_encode` around the sanitation. + $input = json_decode( $meta_data[ $key ], true ); + $sanitized = array_map( [ 'WPSEO_Utils', 'sanitize_text_field' ], $input ); + $clean[ $key ] = WPSEO_Utils::format_json_encode( $sanitized ); + } + elseif ( isset( $old_meta[ $key ] ) ) { + // Retain old value if field currently not in use. + $clean[ $key ] = $old_meta[ $key ]; + } + break; + + case 'wpseo_focuskeywords': + if ( isset( $meta_data[ $key ] ) && is_string( $meta_data[ $key ] ) ) { + // The data is stringified JSON. Use `json_decode` and `json_encode` around the sanitation. + $input = json_decode( $meta_data[ $key ], true ); + + // This data has two known keys: `keyword` and `score`. + $sanitized = []; + foreach ( $input as $entry ) { + $sanitized[] = [ + 'keyword' => WPSEO_Utils::sanitize_text_field( $entry['keyword'] ), + 'score' => WPSEO_Utils::sanitize_text_field( $entry['score'] ), + ]; + } + + $clean[ $key ] = WPSEO_Utils::format_json_encode( $sanitized ); + } + elseif ( isset( $old_meta[ $key ] ) ) { + // Retain old value if field currently not in use. + $clean[ $key ] = $old_meta[ $key ]; + } + break; + + case 'wpseo_focuskw': + case 'wpseo_title': + case 'wpseo_desc': + case 'wpseo_linkdex': + default: + if ( isset( $meta_data[ $key ] ) && is_string( $meta_data[ $key ] ) ) { + $clean[ $key ] = WPSEO_Utils::sanitize_text_field( $meta_data[ $key ] ); + } + + if ( $key === 'wpseo_focuskw' ) { + $search = [ + '<', + '>', + '`', + '<', + '>', + '`', + ]; + + $clean[ $key ] = str_replace( $search, '', $clean[ $key ] ); + } + break; + } + + $clean[ $key ] = apply_filters( 'wpseo_sanitize_tax_meta_' . $key, $clean[ $key ], ( $meta_data[ $key ] ?? null ), ( $old_meta[ $key ] ?? null ) ); + } + + // Only save the non-default values. + return array_diff_assoc( $clean, self::$defaults_per_term ); + } + + /** + * Clean a given option value. + * - Convert old option values to new + * - Fixes strings which were escaped (should have been sanitized - escaping is for output) + * + * @param array $option_value Old (not merged with defaults or filtered) option value to + * clean according to the rules for this option. + * @param string|null $current_version Optional. Version from which to upgrade, if not set, + * version specific upgrades will be disregarded. + * @param array|null $all_old_option_values Optional. Only used when importing old options to have + * access to the real old values, in contrast to the saved ones. + * + * @return array Cleaned option. + */ + protected function clean_option( $option_value, $current_version = null, $all_old_option_values = null ) { + + /* Clean up old values and remove empty arrays. */ + if ( is_array( $option_value ) && $option_value !== [] ) { + + foreach ( $option_value as $taxonomy => $terms ) { + + if ( is_array( $terms ) && $terms !== [] ) { + + foreach ( $terms as $term_id => $meta_data ) { + if ( ! is_array( $meta_data ) || $meta_data === [] ) { + // Remove empty term arrays. + unset( $option_value[ $taxonomy ][ $term_id ] ); + } + else { + foreach ( $meta_data as $key => $value ) { + + switch ( $key ) { + case 'noindex': + if ( $value === 'on' ) { + // Convert 'on' to 'noindex'. + $option_value[ $taxonomy ][ $term_id ][ $key ] = 'noindex'; + } + break; + + case 'canonical': + case 'wpseo_bctitle': + case 'wpseo_title': + case 'wpseo_desc': + case 'wpseo_linkdex': + // @todo [JRF => whomever] Needs checking, I don't have example data [JRF]. + if ( $value !== '' ) { + // Fix incorrectly saved (encoded) canonical urls and texts. + $option_value[ $taxonomy ][ $term_id ][ $key ] = wp_specialchars_decode( stripslashes( $value ), ENT_QUOTES ); + } + break; + + default: + // @todo [JRF => whomever] Needs checking, I don't have example data [JRF]. + if ( $value !== '' ) { + // Fix incorrectly saved (escaped) text strings. + $option_value[ $taxonomy ][ $term_id ][ $key ] = wp_specialchars_decode( $value, ENT_QUOTES ); + } + break; + } + } + } + } + } + else { + // Remove empty taxonomy arrays. + unset( $option_value[ $taxonomy ] ); + } + } + } + + return $option_value; + } + + /** + * Retrieve a taxonomy term's meta value(s). + * + * @param mixed $term Term to get the meta value for + * either (string) term name, (int) term id or (object) term. + * @param string $taxonomy Name of the taxonomy to which the term is attached. + * @param string|null $meta Optional. Meta value to get (without prefix). + * + * @return mixed Value for the $meta if one is given, might be the default. + * If no meta is given, an array of all the meta data for the term. + * False if the term does not exist or the $meta provided is invalid. + */ + public static function get_term_meta( $term, $taxonomy, $meta = null ) { + /* Figure out the term id. */ + if ( is_int( $term ) ) { + $term = get_term_by( 'id', $term, $taxonomy ); + } + elseif ( is_string( $term ) ) { + $term = get_term_by( 'slug', $term, $taxonomy ); + } + + if ( is_object( $term ) && isset( $term->term_id ) ) { + $term_id = $term->term_id; + } + else { + return false; + } + + $tax_meta = self::get_term_tax_meta( $term_id, $taxonomy ); + + /* + * Either return the complete array or a single value from it or false if the value does not exist + * (shouldn't happen after merge with defaults, indicates typo in request). + */ + if ( ! isset( $meta ) ) { + return $tax_meta; + } + + if ( isset( $tax_meta[ 'wpseo_' . $meta ] ) ) { + return $tax_meta[ 'wpseo_' . $meta ]; + } + + return false; + } + + /** + * Get the current queried object and return the meta value. + * + * @param string $meta The meta field that is needed. + * + * @return mixed + */ + public static function get_meta_without_term( $meta ) { + $term = $GLOBALS['wp_query']->get_queried_object(); + if ( ! $term || empty( $term->taxonomy ) ) { + return false; + } + + return self::get_term_meta( $term, $term->taxonomy, $meta ); + } + + /** + * Saving the values for the given term_id. + * + * @param int $term_id ID of the term to save data for. + * @param string $taxonomy The taxonomy the term belongs to. + * @param array $meta_values The values that will be saved. + * + * @return void + */ + public static function set_values( $term_id, $taxonomy, array $meta_values ) { + /* Validate the post values */ + $old = self::get_term_meta( $term_id, $taxonomy ); + $clean = self::validate_term_meta_data( $meta_values, $old ); + + self::save_clean_values( $term_id, $taxonomy, $clean ); + } + + /** + * Setting a single value to the term meta. + * + * @param int $term_id ID of the term to save data for. + * @param string $taxonomy The taxonomy the term belongs to. + * @param string $meta_key The target meta key to store the value in. + * @param string $meta_value The value of the target meta key. + * + * @return void + */ + public static function set_value( $term_id, $taxonomy, $meta_key, $meta_value ) { + + if ( substr( strtolower( $meta_key ), 0, 6 ) !== 'wpseo_' ) { + $meta_key = 'wpseo_' . $meta_key; + } + + self::set_values( $term_id, $taxonomy, [ $meta_key => $meta_value ] ); + } + + /** + * Find the keyword usages in the metas for the taxonomies/terms. + * + * @param string $keyword The keyword to look for. + * @param string $current_term_id The current term id. + * @param string $current_taxonomy The current taxonomy name. + * + * @return array + */ + public static function get_keyword_usage( $keyword, $current_term_id, $current_taxonomy ) { + $tax_meta = self::get_tax_meta(); + + $found = []; + // @todo Check for terms of all taxonomies, not only the current taxonomy. + foreach ( $tax_meta as $taxonomy_name => $terms ) { + foreach ( $terms as $term_id => $meta_values ) { + $is_current = ( $current_taxonomy === $taxonomy_name && (string) $current_term_id === (string) $term_id ); + if ( ! $is_current && ! empty( $meta_values['wpseo_focuskw'] ) && $meta_values['wpseo_focuskw'] === $keyword ) { + $found[] = $term_id; + } + } + } + + return [ $keyword => $found ]; + } + + /** + * Saving the values for the given term_id. + * + * @param int $term_id ID of the term to save data for. + * @param string $taxonomy The taxonomy the term belongs to. + * @param array $clean Array with clean values. + * + * @return void + */ + private static function save_clean_values( $term_id, $taxonomy, array $clean ) { + $tax_meta = self::get_tax_meta(); + + /* Add/remove the result to/from the original option value. */ + if ( $clean !== [] ) { + $tax_meta[ $taxonomy ][ $term_id ] = $clean; + } + else { + unset( $tax_meta[ $taxonomy ][ $term_id ] ); + if ( isset( $tax_meta[ $taxonomy ] ) && $tax_meta[ $taxonomy ] === [] ) { + unset( $tax_meta[ $taxonomy ] ); + } + } + + // Prevent complete array validation. + $tax_meta['wpseo_already_validated'] = true; + + self::save_tax_meta( $tax_meta ); + } + + /** + * Getting the meta from the options. + * + * @return void|array + */ + private static function get_tax_meta() { + return get_option( self::$name ); + } + + /** + * Saving the tax meta values to the database. + * + * @param array $tax_meta Array with the meta values for taxonomy. + * + * @return void + */ + private static function save_tax_meta( $tax_meta ) { + update_option( self::$name, $tax_meta ); + } + + /** + * Getting the taxonomy meta for the given term_id and taxonomy. + * + * @param int $term_id The id of the term. + * @param string $taxonomy Name of the taxonomy to which the term is attached. + * + * @return array + */ + private static function get_term_tax_meta( $term_id, $taxonomy ) { + $tax_meta = self::get_tax_meta(); + + /* If we have data for the term, merge with defaults for complete array, otherwise set defaults. */ + if ( isset( $tax_meta[ $taxonomy ][ $term_id ] ) ) { + return array_merge( self::$defaults_per_term, $tax_meta[ $taxonomy ][ $term_id ] ); + } + + return self::$defaults_per_term; + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/sitemaps/class-author-sitemap-provider.php b/wp-content/plugins/wordpress-seo/inc/sitemaps/class-author-sitemap-provider.php new file mode 100644 index 00000000..343f97bc --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/sitemaps/class-author-sitemap-provider.php @@ -0,0 +1,244 @@ +handles_type( 'author' ) ) { + return []; + } + + // @todo Consider doing this less often / when necessary. R. + $this->update_user_meta(); + + $has_exclude_filter = has_filter( 'wpseo_sitemap_exclude_author' ); + + $query_arguments = []; + + if ( ! $has_exclude_filter ) { // We only need full users if legacy filter(s) hooked to exclusion logic. R. + $query_arguments['fields'] = 'ID'; + } + + $users = $this->get_users( $query_arguments ); + + if ( $has_exclude_filter ) { + $users = $this->exclude_users( $users ); + $users = wp_list_pluck( $users, 'ID' ); + } + + if ( empty( $users ) ) { + return []; + } + + $index = []; + $user_pages = array_chunk( $users, $max_entries ); + + foreach ( $user_pages as $page_counter => $users_page ) { + + $current_page = ( $page_counter === 0 ) ? '' : ( $page_counter + 1 ); + + $user_id = array_shift( $users_page ); // Time descending, first user on page is most recently updated. + $user = get_user_by( 'id', $user_id ); + $index[] = [ + 'loc' => WPSEO_Sitemaps_Router::get_base_url( 'author-sitemap' . $current_page . '.xml' ), + 'lastmod' => ( $user->_yoast_wpseo_profile_updated ) ? YoastSEO()->helpers->date->format_timestamp( $user->_yoast_wpseo_profile_updated ) : null, + ]; + } + + return $index; + } + + /** + * Retrieve users, taking account of all necessary exclusions. + * + * @param array $arguments Arguments to add. + * + * @return array + */ + protected function get_users( $arguments = [] ) { + + global $wpdb; + + $defaults = [ + 'capability' => [ 'edit_posts' ], + 'meta_key' => '_yoast_wpseo_profile_updated', + 'orderby' => 'meta_value_num', + 'order' => 'DESC', + 'meta_query' => [ + 'relation' => 'AND', + [ + 'key' => $wpdb->get_blog_prefix() . 'user_level', + 'value' => '0', + 'compare' => '!=', + ], + [ + 'relation' => 'OR', + [ + 'key' => 'wpseo_noindex_author', + 'value' => 'on', + 'compare' => '!=', + ], + [ + 'key' => 'wpseo_noindex_author', + 'compare' => 'NOT EXISTS', + ], + ], + ], + ]; + + if ( WPSEO_Options::get( 'noindex-author-noposts-wpseo', true ) ) { + unset( $defaults['capability'] ); // Otherwise it cancels out next argument. + $defaults['has_published_posts'] = YoastSEO()->helpers->author_archive->get_author_archive_post_types(); + } + + return get_users( array_merge( $defaults, $arguments ) ); + } + + /** + * Get set of sitemap link data. + * + * @param string $type Sitemap type. + * @param int $max_entries Entries per sitemap. + * @param int $current_page Current page of the sitemap. + * + * @return array + * + * @throws OutOfBoundsException When an invalid page is requested. + */ + public function get_sitemap_links( $type, $max_entries, $current_page ) { + + $links = []; + + if ( ! $this->handles_type( 'author' ) ) { + return $links; + } + + $user_criteria = [ + 'offset' => ( ( $current_page - 1 ) * $max_entries ), + 'number' => $max_entries, + ]; + + $users = $this->get_users( $user_criteria ); + + // Throw an exception when there are no users in the sitemap. + if ( count( $users ) === 0 ) { + throw new OutOfBoundsException( 'Invalid sitemap page requested' ); + } + + $users = $this->exclude_users( $users ); + if ( empty( $users ) ) { + $users = []; + } + + $time = time(); + + foreach ( $users as $user ) { + + $author_link = get_author_posts_url( $user->ID ); + + if ( empty( $author_link ) ) { + continue; + } + + $mod = $time; + + if ( isset( $user->_yoast_wpseo_profile_updated ) ) { + $mod = $user->_yoast_wpseo_profile_updated; + } + + $url = [ + 'loc' => $author_link, + 'mod' => date( DATE_W3C, $mod ), + + // Deprecated, kept for backwards data compat. R. + 'chf' => 'daily', + 'pri' => 1, + ]; + + /** This filter is documented at inc/sitemaps/class-post-type-sitemap-provider.php */ + $url = apply_filters( 'wpseo_sitemap_entry', $url, 'user', $user ); + + if ( ! empty( $url ) ) { + $links[] = $url; + } + } + + return $links; + } + + /** + * Update any users that don't have last profile update timestamp. + * + * @return int Count of users updated. + */ + protected function update_user_meta() { + + $user_criteria = [ + 'capability' => [ 'edit_posts' ], + 'meta_query' => [ + [ + 'key' => '_yoast_wpseo_profile_updated', + 'compare' => 'NOT EXISTS', + ], + ], + ]; + + $users = get_users( $user_criteria ); + + $time = time(); + + foreach ( $users as $user ) { + update_user_meta( $user->ID, '_yoast_wpseo_profile_updated', $time ); + } + + return count( $users ); + } + + /** + * Wrap legacy filter to deduplicate calls. + * + * @param array $users Array of user objects to filter. + * + * @return array + */ + protected function exclude_users( $users ) { + + /** + * Filter the authors, included in XML sitemap. + * + * @param array $users Array of user objects to filter. + */ + return apply_filters( 'wpseo_sitemap_exclude_author', $users ); + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/sitemaps/class-post-type-sitemap-provider.php b/wp-content/plugins/wordpress-seo/inc/sitemaps/class-post-type-sitemap-provider.php new file mode 100644 index 00000000..d018ad0b --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/sitemaps/class-post-type-sitemap-provider.php @@ -0,0 +1,766 @@ +include_images = apply_filters( 'wpseo_xml_sitemap_include_images', true ); + } + + /** + * Get the Image Parser. + * + * @return WPSEO_Sitemap_Image_Parser + */ + protected function get_image_parser() { + if ( ! isset( self::$image_parser ) ) { + self::$image_parser = new WPSEO_Sitemap_Image_Parser(); + } + + return self::$image_parser; + } + + /** + * Gets the parsed home url. + * + * @return array The home url, as parsed by wp_parse_url. + */ + protected function get_parsed_home_url() { + if ( ! isset( self::$parsed_home_url ) ) { + self::$parsed_home_url = wp_parse_url( home_url() ); + } + + return self::$parsed_home_url; + } + + /** + * Check if provider supports given item type. + * + * @param string $type Type string to check for. + * + * @return bool + */ + public function handles_type( $type ) { + + return post_type_exists( $type ); + } + + /** + * Retrieves the sitemap links. + * + * @param int $max_entries Entries per sitemap. + * + * @return array + */ + public function get_index_links( $max_entries ) { + global $wpdb; + $post_types = WPSEO_Post_Type::get_accessible_post_types(); + $post_types = array_filter( $post_types, [ $this, 'is_valid_post_type' ] ); + $last_modified_times = WPSEO_Sitemaps::get_last_modified_gmt( $post_types, true ); + $index = []; + + foreach ( $post_types as $post_type ) { + + $total_count = $this->get_post_type_count( $post_type ); + + if ( $total_count === 0 ) { + continue; + } + + $max_pages = 1; + if ( $total_count > $max_entries ) { + $max_pages = (int) ceil( $total_count / $max_entries ); + } + + $all_dates = []; + + if ( $max_pages > 1 ) { + $all_dates = version_compare( $wpdb->db_version(), '8.0', '>=' ) ? $this->get_all_dates_using_with_clause( $post_type, $max_entries ) : $this->get_all_dates( $post_type, $max_entries ); + } + + for ( $page_counter = 0; $page_counter < $max_pages; $page_counter++ ) { + + $current_page = ( $page_counter === 0 ) ? '' : ( $page_counter + 1 ); + $date = false; + + if ( empty( $current_page ) || $current_page === $max_pages ) { + + if ( ! empty( $last_modified_times[ $post_type ] ) ) { + $date = $last_modified_times[ $post_type ]; + } + } + else { + $date = $all_dates[ $page_counter ]; + } + + $index[] = [ + 'loc' => WPSEO_Sitemaps_Router::get_base_url( $post_type . '-sitemap' . $current_page . '.xml' ), + 'lastmod' => $date, + ]; + } + } + + return $index; + } + + /** + * Get set of sitemap link data. + * + * @param string $type Sitemap type. + * @param int $max_entries Entries per sitemap. + * @param int $current_page Current page of the sitemap. + * + * @return array + * + * @throws OutOfBoundsException When an invalid page is requested. + */ + public function get_sitemap_links( $type, $max_entries, $current_page ) { + + $links = []; + $post_type = $type; + + if ( ! $this->is_valid_post_type( $post_type ) ) { + throw new OutOfBoundsException( 'Invalid sitemap page requested' ); + } + + $steps = min( 100, $max_entries ); + $offset = ( $current_page > 1 ) ? ( ( $current_page - 1 ) * $max_entries ) : 0; + $total = ( $offset + $max_entries ); + + $post_type_entries = $this->get_post_type_count( $post_type ); + + if ( $total > $post_type_entries ) { + $total = $post_type_entries; + } + + if ( $current_page === 1 ) { + $links = array_merge( $links, $this->get_first_links( $post_type ) ); + } + + // If total post type count is lower than the offset, an invalid page is requested. + if ( $post_type_entries < $offset ) { + throw new OutOfBoundsException( 'Invalid sitemap page requested' ); + } + + if ( $post_type_entries === 0 ) { + return $links; + } + + $posts_to_exclude = $this->get_excluded_posts( $type ); + + while ( $total > $offset ) { + + $posts = $this->get_posts( $post_type, $steps, $offset ); + + $offset += $steps; + + if ( empty( $posts ) ) { + continue; + } + + foreach ( $posts as $post ) { + + if ( in_array( $post->ID, $posts_to_exclude, true ) ) { + continue; + } + + if ( WPSEO_Meta::get_value( 'meta-robots-noindex', $post->ID ) === '1' ) { + continue; + } + + $url = $this->get_url( $post ); + + if ( ! isset( $url['loc'] ) ) { + continue; + } + + /** + * Filter URL entry before it gets added to the sitemap. + * + * @param array $url Array of URL parts. + * @param string $type URL type. + * @param object $post Data object for the URL. + */ + $url = apply_filters( 'wpseo_sitemap_entry', $url, 'post', $post ); + + if ( ! empty( $url ) ) { + $links[] = $url; + } + } + + unset( $post, $url ); + } + + return $links; + } + + /** + * Check for relevant post type before invalidation. + * + * @param int $post_id Post ID to possibly invalidate for. + * + * @return void + */ + public function save_post( $post_id ) { + + if ( $this->is_valid_post_type( get_post_type( $post_id ) ) ) { + WPSEO_Sitemaps_Cache::invalidate_post( $post_id ); + } + } + + /** + * Check if post type should be present in sitemaps. + * + * @param string $post_type Post type string to check for. + * + * @return bool + */ + public function is_valid_post_type( $post_type ) { + if ( ! WPSEO_Post_Type::is_post_type_accessible( $post_type ) || ! WPSEO_Post_Type::is_post_type_indexable( $post_type ) ) { + return false; + } + + /** + * Filter decision if post type is excluded from the XML sitemap. + * + * @param bool $exclude Default false. + * @param string $post_type Post type name. + */ + if ( apply_filters( 'wpseo_sitemap_exclude_post_type', false, $post_type ) ) { + return false; + } + + return true; + } + + /** + * Retrieves a list with the excluded post ids. + * + * @param string $post_type Post type. + * + * @return array Array with post ids to exclude. + */ + protected function get_excluded_posts( $post_type ) { + $excluded_posts_ids = []; + + $page_on_front_id = ( $post_type === 'page' ) ? (int) get_option( 'page_on_front' ) : 0; + if ( $page_on_front_id > 0 ) { + $excluded_posts_ids[] = $page_on_front_id; + } + + /** + * Filter: 'wpseo_exclude_from_sitemap_by_post_ids' - Allow extending and modifying the posts to exclude. + * + * @param array $posts_to_exclude The posts to exclude. + */ + $excluded_posts_ids = apply_filters( 'wpseo_exclude_from_sitemap_by_post_ids', $excluded_posts_ids ); + if ( ! is_array( $excluded_posts_ids ) ) { + $excluded_posts_ids = []; + } + + $excluded_posts_ids = array_map( 'intval', $excluded_posts_ids ); + + $page_for_posts_id = ( $post_type === 'page' ) ? (int) get_option( 'page_for_posts' ) : 0; + if ( $page_for_posts_id > 0 ) { + $excluded_posts_ids[] = $page_for_posts_id; + } + + return array_unique( $excluded_posts_ids ); + } + + /** + * Get count of posts for post type. + * + * @param string $post_type Post type to retrieve count for. + * + * @return int + */ + protected function get_post_type_count( $post_type ) { + + global $wpdb; + + /** + * Filter JOIN query part for type count of post type. + * + * @param string $join SQL part, defaults to empty string. + * @param string $post_type Post type name. + */ + $join_filter = apply_filters( 'wpseo_typecount_join', '', $post_type ); + + /** + * Filter WHERE query part for type count of post type. + * + * @param string $where SQL part, defaults to empty string. + * @param string $post_type Post type name. + */ + $where_filter = apply_filters( 'wpseo_typecount_where', '', $post_type ); + + $where = $this->get_sql_where_clause( $post_type ); + + $sql = " + SELECT COUNT({$wpdb->posts}.ID) + FROM {$wpdb->posts} + {$join_filter} + {$where} + {$where_filter} + "; + + return (int) $wpdb->get_var( $sql ); + } + + /** + * Produces set of links to prepend at start of first sitemap page. + * + * @param string $post_type Post type to produce links for. + * + * @return array + */ + protected function get_first_links( $post_type ) { + + $links = []; + $archive_url = false; + + if ( $post_type === 'page' ) { + + $page_on_front_id = (int) get_option( 'page_on_front' ); + if ( $page_on_front_id > 0 ) { + $front_page = $this->get_url( + get_post( $page_on_front_id ) + ); + } + + if ( empty( $front_page ) ) { + $front_page = [ + 'loc' => YoastSEO()->helpers->url->home(), + ]; + } + + // Deprecated, kept for backwards data compat. R. + $front_page['chf'] = 'daily'; + $front_page['pri'] = 1; + + $images = ( $front_page['images'] ?? [] ); + + /** + * Filter images to be included for the term in XML sitemap. + * + * @param array $images Array of image items. + * @return array $image_list Array of image items. + */ + $image_list = apply_filters( 'wpseo_sitemap_urlimages_front_page', $images ); + if ( is_array( $image_list ) ) { + $front_page['images'] = $image_list; + } + + $links[] = $front_page; + } + elseif ( $post_type !== 'page' ) { + /** + * Filter the URL Yoast SEO uses in the XML sitemap for this post type archive. + * + * @param string $archive_url The URL of this archive + * @param string $post_type The post type this archive is for. + */ + $archive_url = apply_filters( + 'wpseo_sitemap_post_type_archive_link', + $this->get_post_type_archive_link( $post_type ), + $post_type + ); + } + + if ( $archive_url ) { + + $links[] = [ + 'loc' => $archive_url, + 'mod' => WPSEO_Sitemaps::get_last_modified_gmt( $post_type ), + + // Deprecated, kept for backwards data compat. R. + 'chf' => 'daily', + 'pri' => 1, + ]; + } + + /** + * Filters the first post type links. + * + * @param array $links The first post type links. + * @param string $post_type The post type this archive is for. + */ + return apply_filters( 'wpseo_sitemap_post_type_first_links', $links, $post_type ); + } + + /** + * Get URL for a post type archive. + * + * @since 5.3 + * + * @param string $post_type Post type. + * + * @return string|bool URL or false if it should be excluded. + */ + protected function get_post_type_archive_link( $post_type ) { + + $pt_archive_page_id = -1; + + if ( $post_type === 'post' ) { + + if ( get_option( 'show_on_front' ) === 'posts' ) { + return YoastSEO()->helpers->url->home(); + } + + $pt_archive_page_id = (int) get_option( 'page_for_posts' ); + + // Post archive should be excluded if posts page isn't set. + if ( $pt_archive_page_id <= 0 ) { + return false; + } + } + + if ( ! $this->is_post_type_archive_indexable( $post_type, $pt_archive_page_id ) ) { + return false; + } + + return get_post_type_archive_link( $post_type ); + } + + /** + * Determines whether a post type archive is indexable. + * + * @since 11.5 + * + * @param string $post_type Post type. + * @param int $archive_page_id The page id. + * + * @return bool True when post type archive is indexable. + */ + protected function is_post_type_archive_indexable( $post_type, $archive_page_id = -1 ) { + + if ( WPSEO_Options::get( 'noindex-ptarchive-' . $post_type, false ) ) { + return false; + } + + /** + * Filter the page which is dedicated to this post type archive. + * + * @since 9.3 + * + * @param string $archive_page_id The post_id of the page. + * @param string $post_type The post type this archive is for. + */ + $archive_page_id = (int) apply_filters( 'wpseo_sitemap_page_for_post_type_archive', $archive_page_id, $post_type ); + + if ( $archive_page_id > 0 && WPSEO_Meta::get_value( 'meta-robots-noindex', $archive_page_id ) === '1' ) { + return false; + } + + return true; + } + + /** + * Retrieve set of posts with optimized query routine. + * + * @param string $post_type Post type to retrieve. + * @param int $count Count of posts to retrieve. + * @param int $offset Starting offset. + * + * @return object[] + */ + protected function get_posts( $post_type, $count, $offset ) { + + global $wpdb; + + static $filters = []; + + if ( ! isset( $filters[ $post_type ] ) ) { + // Make sure you're wpdb->preparing everything you throw into this!! + $filters[ $post_type ] = [ + /** + * Filter JOIN query part for the post type. + * + * @param string $join SQL part, defaults to false. + * @param string $post_type Post type name. + */ + 'join' => apply_filters( 'wpseo_posts_join', false, $post_type ), + + /** + * Filter WHERE query part for the post type. + * + * @param string $where SQL part, defaults to false. + * @param string $post_type Post type name. + */ + 'where' => apply_filters( 'wpseo_posts_where', false, $post_type ), + ]; + } + + $join_filter = $filters[ $post_type ]['join']; + $where_filter = $filters[ $post_type ]['where']; + $where = $this->get_sql_where_clause( $post_type ); + + /* + * Optimized query per this thread: + * {@link http://wordpress.org/support/topic/plugin-wordpress-seo-by-yoast-performance-suggestion}. + * Also see {@link http://explainextended.com/2009/10/23/mysql-order-by-limit-performance-late-row-lookups/}. + */ + $sql = " + SELECT l.ID, post_title, post_content, post_name, post_parent, post_author, post_status, post_modified_gmt, post_date, post_date_gmt + FROM ( + SELECT {$wpdb->posts}.ID + FROM {$wpdb->posts} + {$join_filter} + {$where} + {$where_filter} + ORDER BY {$wpdb->posts}.post_modified ASC LIMIT %d OFFSET %d + ) + o JOIN {$wpdb->posts} l ON l.ID = o.ID + "; + + $posts = $wpdb->get_results( $wpdb->prepare( $sql, $count, $offset ) ); + + $post_ids = []; + + foreach ( $posts as $post_index => $post ) { + $post->post_type = $post_type; + $sanitized_post = sanitize_post( $post, 'raw' ); + $posts[ $post_index ] = new WP_Post( $sanitized_post ); + + $post_ids[] = $sanitized_post->ID; + } + + update_meta_cache( 'post', $post_ids ); + + return $posts; + } + + /** + * Constructs an SQL where clause for a given post type. + * + * @param string $post_type Post type slug. + * + * @return string + */ + protected function get_sql_where_clause( $post_type ) { + + global $wpdb; + + $join = ''; + $post_statuses = array_map( 'esc_sql', WPSEO_Sitemaps::get_post_statuses( $post_type ) ); + $status_where = "{$wpdb->posts}.post_status IN ('" . implode( "','", $post_statuses ) . "')"; + + // Based on WP_Query->get_posts(). R. + if ( $post_type === 'attachment' ) { + $join = " LEFT JOIN {$wpdb->posts} AS p2 ON ({$wpdb->posts}.post_parent = p2.ID) "; + $parent_statuses = array_diff( $post_statuses, [ 'inherit' ] ); + $status_where = "p2.post_status IN ('" . implode( "','", $parent_statuses ) . "') AND p2.post_password = ''"; + } + + $where_clause = " + {$join} + WHERE {$status_where} + AND {$wpdb->posts}.post_type = %s + AND {$wpdb->posts}.post_password = '' + AND {$wpdb->posts}.post_date != '0000-00-00 00:00:00' + "; + + return $wpdb->prepare( $where_clause, $post_type ); + } + + /** + * Produce array of URL parts for given post object. + * + * @param object $post Post object to get URL parts for. + * + * @return array|bool + */ + protected function get_url( $post ) { + + $url = []; + + /** + * Filter the URL Yoast SEO uses in the XML sitemap. + * + * Note that only absolute local URLs are allowed as the check after this removes external URLs. + * + * @param string $url URL to use in the XML sitemap + * @param object $post Post object for the URL. + */ + $url['loc'] = apply_filters( 'wpseo_xml_sitemap_post_url', get_permalink( $post ), $post ); + $link_type = YoastSEO()->helpers->url->get_link_type( + wp_parse_url( $url['loc'] ), + $this->get_parsed_home_url() + ); + + /* + * Do not include external URLs. + * + * {@link https://wordpress.org/plugins/page-links-to/} can rewrite permalinks to external URLs. + */ + if ( $link_type === SEO_Links::TYPE_EXTERNAL ) { + return false; + } + + $modified = max( $post->post_modified_gmt, $post->post_date_gmt ); + + if ( $modified !== '0000-00-00 00:00:00' ) { + $url['mod'] = $modified; + } + + $url['chf'] = 'daily'; // Deprecated, kept for backwards data compat. R. + + $canonical = WPSEO_Meta::get_value( 'canonical', $post->ID ); + + if ( $canonical !== '' && $canonical !== $url['loc'] ) { + /* + * Let's assume that if a canonical is set for this page and it's different from + * the URL of this post, that page is either already in the XML sitemap OR is on + * an external site, either way, we shouldn't include it here. + */ + return false; + } + unset( $canonical ); + + $url['pri'] = 1; // Deprecated, kept for backwards data compat. R. + + if ( $this->include_images ) { + $url['images'] = $this->get_image_parser()->get_images( $post ); + } + + return $url; + } + + /** + * Get all dates for a post type by using the WITH clause for performance. + * + * @param string $post_type Post type to retrieve dates for. + * @param int $max_entries Maximum number of entries to retrieve. + * + * @return array Array of dates. + */ + private function get_all_dates_using_with_clause( $post_type, $max_entries ) { + global $wpdb; + + $post_statuses = array_map( 'esc_sql', WPSEO_Sitemaps::get_post_statuses( $post_type ) ); + + $replacements = array_merge( + [ + 'ordering', + 'post_modified_gmt', + $wpdb->posts, + 'type_status_date', + 'post_status', + ], + $post_statuses, + [ + 'post_type', + $post_type, + 'post_modified_gmt', + 'post_modified_gmt', + 'ordering', + $max_entries, + ] + ); + + //phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- We need to use a direct query here. + //phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + return $wpdb->get_col( + //phpcs:disable WordPress.DB.PreparedSQLPlaceholders -- %i placeholder is still not recognized. + $wpdb->prepare( + ' + WITH %i AS (SELECT ROW_NUMBER() OVER (ORDER BY %i) AS n, post_modified_gmt + FROM %i USE INDEX ( %i ) + WHERE %i IN (' . implode( ', ', array_fill( 0, count( $post_statuses ), '%s' ) ) . ') + AND %i = %s + ORDER BY %i) + SELECT %i + FROM %i + WHERE MOD(n, %d) = 0; + ', + $replacements + ) + ); + } + + /** + * Get all dates for a post type. + * + * @param string $post_type Post type to retrieve dates for. + * @param int $max_entries Maximum number of entries to retrieve. + * + * @return array Array of dates. + */ + private function get_all_dates( $post_type, $max_entries ) { + global $wpdb; + + $post_statuses = array_map( 'esc_sql', WPSEO_Sitemaps::get_post_statuses( $post_type ) ); + $replacements = array_merge( + [ + 'post_modified_gmt', + $wpdb->posts, + 'type_status_date', + 'post_status', + ], + $post_statuses, + [ + 'post_type', + $post_type, + $max_entries, + 'post_modified_gmt', + ] + ); + + return $wpdb->get_col( + //phpcs:disable WordPress.DB.PreparedSQLPlaceholders -- %i placeholder is still not recognized. + $wpdb->prepare( + ' + SELECT %i + FROM ( SELECT @rownum:=0 ) init + JOIN %i USE INDEX( %i ) + WHERE %i IN (' . implode( ', ', array_fill( 0, count( $post_statuses ), '%s' ) ) . ') + AND %i = %s + AND ( @rownum:=@rownum+1 ) %% %d = 0 + ORDER BY %i ASC + ', + $replacements + ) + ); + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-cache-data.php b/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-cache-data.php new file mode 100644 index 00000000..495afa12 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-cache-data.php @@ -0,0 +1,200 @@ +sitemap = $sitemap; + + /* + * Empty sitemap is not usable. + */ + if ( ! empty( $sitemap ) ) { + $this->set_status( self::OK ); + } + else { + $this->set_status( self::ERROR ); + } + } + + /** + * Set the status of the sitemap, is it usable. + * + * @param bool|string $usable Is the sitemap usable or not. + * + * @return void + */ + public function set_status( $usable ) { + + if ( $usable === self::OK ) { + $this->status = self::OK; + + return; + } + + if ( $usable === self::ERROR ) { + $this->status = self::ERROR; + $this->sitemap = ''; + + return; + } + + $this->status = self::UNKNOWN; + } + + /** + * Is the sitemap usable. + * + * @return bool True if usable, False if bad or unknown. + */ + public function is_usable() { + + return $this->status === self::OK; + } + + /** + * Get the XML content of the sitemap. + * + * @return string The content of the sitemap. + */ + public function get_sitemap() { + + return $this->sitemap; + } + + /** + * Get the status of the sitemap. + * + * @return string Status of the sitemap, 'ok'/'error'/'unknown'. + */ + public function get_status() { + + return $this->status; + } + + /** + * String representation of object. + * + * {@internal This magic method is only "magic" as of PHP 7.4 in which the magic method was introduced.} + * + * @link https://www.php.net/language.oop5.magic#object.serialize + * @link https://wiki.php.net/rfc/custom_object_serialization + * + * @since 17.8.0 + * + * @return array The data to be serialized. + */ + public function __serialize() { // phpcs:ignore PHPCompatibility.FunctionNameRestrictions.NewMagicMethods.__serializeFound + + $data = [ + 'status' => $this->status, + 'xml' => $this->sitemap, + ]; + + return $data; + } + + /** + * Constructs the object. + * + * {@internal This magic method is only "magic" as of PHP 7.4 in which the magic method was introduced.} + * + * @link https://www.php.net/language.oop5.magic#object.serialize + * @link https://wiki.php.net/rfc/custom_object_serialization + * + * @since 17.8.0 + * + * @param array $data The unserialized data to use to (re)construct the object. + * + * @return void + */ + public function __unserialize( $data ) { // phpcs:ignore PHPCompatibility.FunctionNameRestrictions.NewMagicMethods.__unserializeFound + + $this->set_sitemap( $data['xml'] ); + $this->set_status( $data['status'] ); + } + + /** + * String representation of object. + * + * {@internal The magic methods take precedence over the Serializable interface. + * This means that in practice, this method will now only be called on PHP < 7.4. + * For PHP 7.4 and higher, the magic methods will be used instead.} + * + * {@internal The Serializable interface is being phased out, in favour of the magic methods. + * This method should be deprecated and removed and the class should no longer + * implement the `Serializable` interface. + * This change, however, can't be made until the minimum PHP version goes up to PHP 7.4 or higher.} + * + * @link http://php.net/manual/en/serializable.serialize.php + * @link https://wiki.php.net/rfc/phase_out_serializable + * + * @since 5.1.0 + * + * @return string The string representation of the object or null in C-format. + */ + public function serialize() { + + return serialize( $this->__serialize() ); + } + + /** + * Constructs the object. + * + * {@internal The magic methods take precedence over the Serializable interface. + * This means that in practice, this method will now only be called on PHP < 7.4. + * For PHP 7.4 and higher, the magic methods will be used instead.} + * + * {@internal The Serializable interface is being phased out, in favour of the magic methods. + * This method should be deprecated and removed and the class should no longer + * implement the `Serializable` interface. + * This change, however, can't be made until the minimum PHP version goes up to PHP 7.4 or higher.} + * + * @link http://php.net/manual/en/serializable.unserialize.php + * @link https://wiki.php.net/rfc/phase_out_serializable + * + * @since 5.1.0 + * + * @param string $data The string representation of the object in C or O-format. + * + * @return void + */ + public function unserialize( $data ) { + + $data = unserialize( $data ); + $this->__unserialize( $data ); + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-image-parser.php b/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-image-parser.php new file mode 100644 index 00000000..58d8ec5a --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-image-parser.php @@ -0,0 +1,509 @@ +home_url = home_url(); + $parsed_home = wp_parse_url( $this->home_url ); + + if ( ! empty( $parsed_home['host'] ) ) { + $this->host = str_replace( 'www.', '', $parsed_home['host'] ); + } + + if ( ! empty( $parsed_home['scheme'] ) ) { + $this->scheme = $parsed_home['scheme']; + } + + $this->charset = esc_attr( get_bloginfo( 'charset' ) ); + } + + /** + * Get set of image data sets for the given post. + * + * @param object $post Post object to get images for. + * + * @return array + */ + public function get_images( $post ) { + + $images = []; + + if ( ! is_object( $post ) ) { + return $images; + } + + $thumbnail_id = get_post_thumbnail_id( $post->ID ); + + if ( $thumbnail_id ) { + + $src = $this->get_absolute_url( $this->image_url( $thumbnail_id ) ); + $images[] = $this->get_image_item( $post, $src ); + } + + /** + * Filter: 'wpseo_sitemap_content_before_parse_html_images' - Filters the post content + * before it is parsed for images. + * + * @param string $content The raw/unprocessed post content. + */ + $content = apply_filters( 'wpseo_sitemap_content_before_parse_html_images', $post->post_content ); + + $unfiltered_images = $this->parse_html_images( $content ); + + foreach ( $unfiltered_images as $image ) { + $images[] = $this->get_image_item( $post, $image['src'] ); + } + + foreach ( $this->parse_galleries( $content, $post->ID ) as $attachment ) { + $src = $this->get_absolute_url( $this->image_url( $attachment->ID ) ); + $images[] = $this->get_image_item( $post, $src ); + } + + if ( $post->post_type === 'attachment' && wp_attachment_is_image( $post ) ) { + $src = $this->get_absolute_url( $this->image_url( $post->ID ) ); + $images[] = $this->get_image_item( $post, $src ); + } + + foreach ( $images as $key => $image ) { + + if ( empty( $image['src'] ) ) { + unset( $images[ $key ] ); + } + } + + /** + * Filter images to be included for the post in XML sitemap. + * + * @param array $images Array of image items. + * @param int $post_id ID of the post. + */ + $image_list = apply_filters( 'wpseo_sitemap_urlimages', $images, $post->ID ); + if ( isset( $image_list ) && is_array( $image_list ) ) { + $images = $image_list; + } + + return $images; + } + + /** + * Get the images in the term description. + * + * @param object $term Term to get images from description for. + * + * @return array + */ + public function get_term_images( $term ) { + + $images = $this->parse_html_images( $term->description ); + + foreach ( $this->parse_galleries( $term->description ) as $attachment ) { + + $images[] = [ + 'src' => $this->get_absolute_url( $this->image_url( $attachment->ID ) ), + ]; + } + + /** + * Filter images to be included for the term in XML sitemap. + * + * @param array $image_list Array of image items. + * @param int $term_id ID of the post. + */ + $image_list = apply_filters( 'wpseo_sitemap_urlimages_term', $images, $term->term_id ); + if ( isset( $image_list ) && is_array( $image_list ) ) { + $images = $image_list; + } + + return $images; + } + + /** + * Parse `` tags in content. + * + * @param string $content Content string to parse. + * + * @return array + */ + private function parse_html_images( $content ) { + + $images = []; + + if ( ! class_exists( 'DOMDocument' ) ) { + return $images; + } + + if ( empty( $content ) ) { + return $images; + } + + // Prevent DOMDocument from bubbling warnings about invalid HTML. + libxml_use_internal_errors( true ); + + $post_dom = new DOMDocument(); + $post_dom->loadHTML( 'charset . '">' . $content ); + + // Clear the errors, so they don't get kept in memory. + libxml_clear_errors(); + + /** + * Image attribute. + * + * @var DOMElement $img + */ + foreach ( $post_dom->getElementsByTagName( 'img' ) as $img ) { + + $src = $img->getAttribute( 'src' ); + + if ( empty( $src ) ) { + continue; + } + + $class = $img->getAttribute( 'class' ); + + if ( // This detects WP-inserted images, which we need to upsize. R. + ! empty( $class ) + && ( strpos( $class, 'size-full' ) === false ) + && preg_match( '|wp-image-(?P\d+)|', $class, $matches ) + && get_post_status( $matches['id'] ) + ) { + $query_params = wp_parse_url( $src, PHP_URL_QUERY ); + $src = $this->image_url( $matches['id'] ); + + if ( $query_params ) { + $src .= '?' . $query_params; + } + } + + $src = $this->get_absolute_url( $src ); + + if ( strpos( $src, $this->host ) === false ) { + continue; + } + + if ( $src !== esc_url( $src, null, 'attribute' ) ) { + continue; + } + + $images[] = [ + 'src' => $src, + ]; + } + + return $images; + } + + /** + * Parse gallery shortcodes in a given content. + * + * @param string $content Content string. + * @param int $post_id Optional. ID of post being parsed. + * + * @return array Set of attachment objects. + */ + protected function parse_galleries( $content, $post_id = 0 ) { + + $attachments = []; + $galleries = $this->get_content_galleries( $content ); + + foreach ( $galleries as $gallery ) { + + $id = $post_id; + + if ( ! empty( $gallery['id'] ) ) { + $id = intval( $gallery['id'] ); + } + + // Forked from core gallery_shortcode() to have exact same logic. R. + if ( ! empty( $gallery['ids'] ) ) { + $gallery['include'] = $gallery['ids']; + } + + $gallery_attachments = $this->get_gallery_attachments( $id, $gallery ); + + $attachments = array_merge( $attachments, $gallery_attachments ); + } + + return array_unique( $attachments, SORT_REGULAR ); + } + + /** + * Retrieves galleries from the passed content. + * + * Forked from core to skip executing shortcodes for performance. + * + * @param string $content Content to parse for shortcodes. + * + * @return array A list of arrays, each containing gallery data. + */ + protected function get_content_galleries( $content ) { + + $galleries = []; + + if ( ! preg_match_all( '/' . get_shortcode_regex( [ 'gallery' ] ) . '/s', $content, $matches, PREG_SET_ORDER ) ) { + return $galleries; + } + + foreach ( $matches as $shortcode ) { + + $attributes = shortcode_parse_atts( $shortcode[3] ); + + if ( $attributes === '' ) { // Valid shortcode without any attributes. R. + $attributes = []; + } + + $galleries[] = $attributes; + } + + return $galleries; + } + + /** + * Get image item array with filters applied. + * + * @param WP_Post $post Post object for the context. + * @param string $src Image URL. + * + * @return array + */ + protected function get_image_item( $post, $src ) { + + $image = []; + + /** + * Filter image URL to be included in XML sitemap for the post. + * + * @param string $src Image URL. + * @param object $post Post object. + */ + $image['src'] = apply_filters( 'wpseo_xml_sitemap_img_src', $src, $post ); + + /** + * Filter image data to be included in XML sitemap for the post. + * + * @param array $image { + * Array of image data. + * + * @type string $src Image URL. + * } + * + * @param object $post Post object. + */ + return apply_filters( 'wpseo_xml_sitemap_img', $image, $post ); + } + + /** + * Get attached image URL with filters applied. Adapted from core for speed. + * + * @param int $post_id ID of the post. + * + * @return string + */ + private function image_url( $post_id ) { + + static $uploads; + + if ( empty( $uploads ) ) { + $uploads = wp_upload_dir(); + } + + if ( $uploads['error'] !== false ) { + return ''; + } + + $file = get_post_meta( $post_id, '_wp_attached_file', true ); + + if ( empty( $file ) ) { + return ''; + } + + // Check that the upload base exists in the file location. + if ( strpos( $file, $uploads['basedir'] ) === 0 ) { + $src = str_replace( $uploads['basedir'], $uploads['baseurl'], $file ); + } + elseif ( strpos( $file, 'wp-content/uploads' ) !== false ) { + $src = $uploads['baseurl'] . substr( $file, ( strpos( $file, 'wp-content/uploads' ) + 18 ) ); + } + else { + // It's a newly uploaded file, therefore $file is relative to the baseurl. + $src = $uploads['baseurl'] . '/' . $file; + } + + return apply_filters( 'wp_get_attachment_url', $src, $post_id ); + } + + /** + * Make absolute URL for domain or protocol-relative one. + * + * @param string $src URL to process. + * + * @return string + */ + protected function get_absolute_url( $src ) { + + if ( empty( $src ) || ! is_string( $src ) ) { + return $src; + } + + if ( YoastSEO()->helpers->url->is_relative( $src ) === true ) { + + if ( $src[0] !== '/' ) { + return $src; + } + + // The URL is relative, we'll have to make it absolute. + return $this->home_url . $src; + } + + if ( strpos( $src, 'http' ) !== 0 ) { + // Protocol relative URL, we add the scheme as the standard requires a protocol. + return $this->scheme . ':' . $src; + } + + return $src; + } + + /** + * Returns the attachments for a gallery. + * + * @param int $id The post ID. + * @param array $gallery The gallery config. + * + * @return array The selected attachments. + */ + protected function get_gallery_attachments( $id, $gallery ) { + + // When there are attachments to include. + if ( ! empty( $gallery['include'] ) ) { + return $this->get_gallery_attachments_for_included( $gallery['include'] ); + } + + // When $id is empty, just return empty array. + if ( empty( $id ) ) { + return []; + } + + return $this->get_gallery_attachments_for_parent( $id, $gallery ); + } + + /** + * Returns the attachments for the given ID. + * + * @param int $id The post ID. + * @param array $gallery The gallery config. + * + * @return array The selected attachments. + */ + protected function get_gallery_attachments_for_parent( $id, $gallery ) { + $query = [ + 'posts_per_page' => -1, + 'post_parent' => $id, + ]; + + // When there are posts that should be excluded from result set. + if ( ! empty( $gallery['exclude'] ) ) { + $query['post__not_in'] = wp_parse_id_list( $gallery['exclude'] ); + } + + return $this->get_attachments( $query ); + } + + /** + * Returns an array with attachments for the post IDs that will be included. + * + * @param array $included_ids Array with IDs to include. + * + * @return array The found attachments. + */ + protected function get_gallery_attachments_for_included( $included_ids ) { + $ids_to_include = wp_parse_id_list( $included_ids ); + $attachments = $this->get_attachments( + [ + 'posts_per_page' => count( $ids_to_include ), + 'post__in' => $ids_to_include, + ] + ); + + $gallery_attachments = []; + foreach ( $attachments as $val ) { + $gallery_attachments[ $val->ID ] = $val; + } + + return $gallery_attachments; + } + + /** + * Returns the attachments. + * + * @param array $args Array with query args. + * + * @return array The found attachments. + */ + protected function get_attachments( $args ) { + $default_args = [ + 'post_status' => 'inherit', + 'post_type' => 'attachment', + 'post_mime_type' => 'image', + + // Defaults taken from function get_posts. + 'orderby' => 'date', + 'order' => 'DESC', + 'meta_key' => '', + 'meta_value' => '', + 'suppress_filters' => true, + 'ignore_sticky_posts' => true, + 'no_found_rows' => true, + ]; + + $args = wp_parse_args( $args, $default_args ); + + $get_attachments = new WP_Query(); + return $get_attachments->query( $args ); + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-admin.php b/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-admin.php new file mode 100644 index 00000000..10b8fcd6 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-admin.php @@ -0,0 +1,125 @@ +status_transition_bulk( $new_status, $old_status, $post ); + + return; + } + + $post_type = get_post_type( $post ); + + wp_cache_delete( 'lastpostmodified:gmt:' . $post_type, 'timeinfo' ); // #17455. + } + + /** + * Notify Google of the updated sitemap. + * + * @deprecated 22.0 + * @codeCoverageIgnore + * + * @return void + */ + public function ping_search_engines() { + _deprecated_function( __METHOD__, 'Yoast SEO 22.0' ); + } + + /** + * While bulk importing, just save unique post_types. + * + * When importing is done, if we have a post_type that is saved in the sitemap + * try to ping the search engines. + * + * @param string $new_status New post status. + * @param string $old_status Old post status. + * @param WP_Post $post Post object. + * + * @return void + */ + private function status_transition_bulk( $new_status, $old_status, $post ) { + $this->importing_post_types[] = get_post_type( $post ); + $this->importing_post_types = array_unique( $this->importing_post_types ); + } + + /** + * After import finished, walk through imported post_types and update info. + * + * @return void + */ + public function status_transition_bulk_finished() { + if ( ! defined( 'WP_IMPORTING' ) ) { + return; + } + + if ( empty( $this->importing_post_types ) ) { + return; + } + + $ping_search_engines = false; + + foreach ( $this->importing_post_types as $post_type ) { + wp_cache_delete( 'lastpostmodified:gmt:' . $post_type, 'timeinfo' ); // #17455. + + // Just have the cache deleted for nav_menu_item. + if ( $post_type === 'nav_menu_item' ) { + continue; + } + + if ( WPSEO_Options::get( 'noindex-' . $post_type, false ) === false ) { + $ping_search_engines = true; + } + } + + // Nothing to do. + if ( $ping_search_engines === false ) { + return; + } + + if ( WP_CACHE ) { + do_action( 'wpseo_hit_sitemap_index' ); + } + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-cache-validator.php b/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-cache-validator.php new file mode 100644 index 00000000..7d478743 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-cache-validator.php @@ -0,0 +1,326 @@ + $max_length ) { + + if ( $max_length < 15 ) { + /* + * If this happens the most likely cause is a page number that is too high. + * + * So this would not happen unintentionally. + * Either by trying to cause a high server load, finding backdoors or misconfiguration. + */ + throw new OutOfRangeException( + __( + 'Trying to build the sitemap cache key, but the postfix and prefix combination leaves too little room to do this. You are probably requesting a page that is way out of the expected range.', + 'wordpress-seo' + ) + ); + } + + $half = ( $max_length / 2 ); + + $first_part = substr( $type, 0, ( ceil( $half ) - 1 ) ); + $last_part = substr( $type, ( 1 - floor( $half ) ) ); + + $type = $first_part . '..' . $last_part; + } + + return $type; + } + + /** + * Invalidate sitemap cache. + * + * @since 3.2 + * + * @param string|null $type The type to get the key for. Null for all caches. + * + * @return void + */ + public static function invalidate_storage( $type = null ) { + + // Global validator gets cleared when no type is provided. + $old_validator = null; + + // Get the current type validator. + if ( ! is_null( $type ) ) { + $old_validator = self::get_validator( $type ); + } + + // Refresh validator. + self::create_validator( $type ); + + if ( ! wp_using_ext_object_cache() ) { + // Clean up current cache from the database. + self::cleanup_database( $type, $old_validator ); + } + + // External object cache pushes old and unretrieved items out by itself so we don't have to do anything for that. + } + + /** + * Cleanup invalidated database cache. + * + * @since 3.2 + * + * @param string|null $type The type of sitemap to clear cache for. + * @param string|null $validator The validator to clear cache of. + * + * @return void + */ + public static function cleanup_database( $type = null, $validator = null ) { + + global $wpdb; + + if ( is_null( $type ) ) { + // Clear all cache if no type is provided. + $like = sprintf( '%s%%', self::STORAGE_KEY_PREFIX ); + } + else { + // Clear type cache for all type keys. + $like = sprintf( '%1$s%2$s_%%', self::STORAGE_KEY_PREFIX, $type ); + } + + /* + * Add slashes to the LIKE "_" single character wildcard. + * + * We can't use `esc_like` here because we need the % in the query. + */ + $where = []; + $where[] = sprintf( "option_name LIKE '%s'", addcslashes( '_transient_' . $like, '_' ) ); + $where[] = sprintf( "option_name LIKE '%s'", addcslashes( '_transient_timeout_' . $like, '_' ) ); + + // Delete transients. + //phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- We need to use a direct query here. + //phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + $wpdb->query( + $wpdb->prepare( + //phpcs:disable WordPress.DB.PreparedSQLPlaceholders -- %i placeholder is still not recognized. + 'DELETE FROM %i WHERE ' . implode( ' OR ', array_fill( 0, count( $where ), '%s' ) ), + array_merge( [ $wpdb->options ], $where ) + ) + ); + + wp_cache_delete( 'alloptions', 'options' ); + } + + /** + * Get the current cache validator. + * + * Without the type the global validator is returned. + * This can invalidate -all- keys in cache at once. + * + * With the type parameter the validator for that specific type can be invalidated. + * + * @since 3.2 + * + * @param string $type Provide a type for a specific type validator, empty for global validator. + * + * @return string|null The validator for the supplied type. + */ + public static function get_validator( $type = '' ) { + + $key = self::get_validator_key( $type ); + + $current = get_option( $key, null ); + if ( ! is_null( $current ) ) { + return $current; + } + + if ( self::create_validator( $type ) ) { + return self::get_validator( $type ); + } + + return null; + } + + /** + * Get the cache validator option key for the specified type. + * + * @since 3.2 + * + * @param string $type Provide a type for a specific type validator, empty for global validator. + * + * @return string Validator to be used to generate the cache key. + */ + public static function get_validator_key( $type = '' ) { + + if ( empty( $type ) ) { + return self::VALIDATION_GLOBAL_KEY; + } + + return sprintf( self::VALIDATION_TYPE_KEY_FORMAT, $type ); + } + + /** + * Refresh the cache validator value. + * + * @since 3.2 + * + * @param string $type Provide a type for a specific type validator, empty for global validator. + * + * @return bool True if validator key has been saved as option. + */ + public static function create_validator( $type = '' ) { + + $key = self::get_validator_key( $type ); + + // Generate new validator. + $microtime = microtime(); + + // Remove space. + list( $milliseconds, $seconds ) = explode( ' ', $microtime ); + + // Transients are purged every 24h. + $seconds = ( $seconds % DAY_IN_SECONDS ); + $milliseconds = intval( substr( $milliseconds, 2, 3 ), 10 ); + + // Combine seconds and milliseconds and convert to integer. + $validator = intval( $seconds . '' . $milliseconds, 10 ); + + // Apply base 61 encoding. + $compressed = self::convert_base10_to_base61( $validator ); + + return update_option( $key, $compressed, false ); + } + + /** + * Encode to base61 format. + * + * This is base64 (numeric + alpha + alpha upper case) without the 0. + * + * @since 3.2 + * + * @param int $base10 The number that has to be converted to base 61. + * + * @return string Base 61 converted string. + * + * @throws InvalidArgumentException When the input is not an integer. + */ + public static function convert_base10_to_base61( $base10 ) { + + if ( ! is_int( $base10 ) ) { + throw new InvalidArgumentException( __( 'Expected an integer as input.', 'wordpress-seo' ) ); + } + + // Characters that will be used in the conversion. + $characters = '123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + $length = strlen( $characters ); + + $remainder = $base10; + $output = ''; + + do { + // Building from right to left in the result. + $index = ( $remainder % $length ); + + // Prepend the character to the output. + $output = $characters[ $index ] . $output; + + // Determine the remainder after removing the applied number. + $remainder = floor( $remainder / $length ); + + // Keep doing it until we have no remainder left. + } while ( $remainder ); + + return $output; + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-cache.php b/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-cache.php new file mode 100644 index 00000000..a74e569c --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-cache.php @@ -0,0 +1,359 @@ +is_enabled(); + } + + /** + * If cache is enabled. + * + * @since 3.2 + * + * @return bool + */ + public function is_enabled() { + + /** + * Filter if XML sitemap transient cache is enabled. + * + * @param bool $unsigned Enable cache or not, defaults to true. + */ + return apply_filters( 'wpseo_enable_xml_sitemap_transient_caching', false ); + } + + /** + * Retrieve the sitemap page from cache. + * + * @since 3.2 + * + * @param string $type Sitemap type. + * @param int $page Page number to retrieve. + * + * @return string|bool + */ + public function get_sitemap( $type, $page ) { + + $transient_key = WPSEO_Sitemaps_Cache_Validator::get_storage_key( $type, $page ); + if ( $transient_key === false ) { + return false; + } + + return get_transient( $transient_key ); + } + + /** + * Get the sitemap that is cached. + * + * @param string $type Sitemap type. + * @param int $page Page number to retrieve. + * + * @return WPSEO_Sitemap_Cache_Data|null Null on no cache found otherwise object containing sitemap and meta data. + */ + public function get_sitemap_data( $type, $page ) { + + $sitemap = $this->get_sitemap( $type, $page ); + + if ( empty( $sitemap ) ) { + return null; + } + + /* + * Unserialize Cache Data object as is_serialized() doesn't recognize classes in C format. + * This work-around should no longer be needed once the minimum PHP version has gone up to PHP 7.4, + * as the `WPSEO_Sitemap_Cache_Data` class uses O format serialization in PHP 7.4 and higher. + * + * @link https://wiki.php.net/rfc/custom_object_serialization + */ + if ( is_string( $sitemap ) && strpos( $sitemap, 'C:24:"WPSEO_Sitemap_Cache_Data"' ) === 0 ) { + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_unserialize -- Can't be avoided due to how WP stores options. + $sitemap = unserialize( $sitemap ); + } + + // What we expect it to be if it is set. + if ( $sitemap instanceof WPSEO_Sitemap_Cache_Data_Interface ) { + return $sitemap; + } + + return null; + } + + /** + * Store the sitemap page from cache. + * + * @since 3.2 + * + * @param string $type Sitemap type. + * @param int $page Page number to store. + * @param string $sitemap Sitemap body to store. + * @param bool $usable Is this a valid sitemap or a cache of an invalid sitemap. + * + * @return bool + */ + public function store_sitemap( $type, $page, $sitemap, $usable = true ) { + + $transient_key = WPSEO_Sitemaps_Cache_Validator::get_storage_key( $type, $page ); + + if ( $transient_key === false ) { + return false; + } + + $status = ( $usable ) ? WPSEO_Sitemap_Cache_Data::OK : WPSEO_Sitemap_Cache_Data::ERROR; + + $sitemap_data = new WPSEO_Sitemap_Cache_Data(); + $sitemap_data->set_sitemap( $sitemap ); + $sitemap_data->set_status( $status ); + + return set_transient( $transient_key, $sitemap_data, DAY_IN_SECONDS ); + } + + /** + * Delete cache transients for index and specific type. + * + * Always deletes the main index sitemaps cache, as that's always invalidated by any other change. + * + * @since 1.5.4 + * @since 3.2 Changed from function wpseo_invalidate_sitemap_cache() to method in this class. + * + * @param string $type Sitemap type to invalidate. + * + * @return void + */ + public static function invalidate( $type ) { + + self::clear( [ $type ] ); + } + + /** + * Helper to invalidate in hooks where type is passed as second argument. + * + * @since 3.2 + * + * @param int $unused Unused term ID value. + * @param string $type Taxonomy to invalidate. + * + * @return void + */ + public static function invalidate_helper( $unused, $type ) { + + if ( + WPSEO_Options::get( 'noindex-' . $type ) === false + || WPSEO_Options::get( 'noindex-tax-' . $type ) === false + ) { + self::invalidate( $type ); + } + } + + /** + * Invalidate sitemap cache for authors. + * + * @param int $user_id User ID. + * + * @return bool True if the sitemap was properly invalidated. False otherwise. + */ + public static function invalidate_author( $user_id ) { + + $user = get_user_by( 'id', $user_id ); + + if ( $user === false ) { + return false; + } + + if ( current_action() === 'user_register' ) { + update_user_meta( $user_id, '_yoast_wpseo_profile_updated', time() ); + } + + if ( empty( $user->roles ) || in_array( 'subscriber', $user->roles, true ) ) { + return false; + } + + self::invalidate( 'author' ); + + return true; + } + + /** + * Invalidate sitemap cache for the post type of a post. + * + * Don't invalidate for revisions. + * + * @since 1.5.4 + * @since 3.2 Changed from function wpseo_invalidate_sitemap_cache_on_save_post() to method in this class. + * + * @param int $post_id Post ID to invalidate type for. + * + * @return void + */ + public static function invalidate_post( $post_id ) { + + if ( wp_is_post_revision( $post_id ) ) { + return; + } + + self::invalidate( get_post_type( $post_id ) ); + } + + /** + * Delete cache transients for given sitemaps types or all by default. + * + * @since 1.8.0 + * @since 3.2 Moved from WPSEO_Utils to this class. + * + * @param array $types Set of sitemap types to delete cache transients for. + * + * @return void + */ + public static function clear( $types = [] ) { + + if ( ! self::$is_enabled ) { + return; + } + + // No types provided, clear all. + if ( empty( $types ) ) { + self::$clear_all = true; + + return; + } + + // Always invalidate the index sitemap as well. + if ( ! in_array( WPSEO_Sitemaps::SITEMAP_INDEX_TYPE, $types, true ) ) { + array_unshift( $types, WPSEO_Sitemaps::SITEMAP_INDEX_TYPE ); + } + + foreach ( $types as $type ) { + if ( ! in_array( $type, self::$clear_types, true ) ) { + self::$clear_types[] = $type; + } + } + } + + /** + * Invalidate storage for cache types queued to clear. + * + * @return void + */ + public static function clear_queued() { + + if ( self::$clear_all ) { + + WPSEO_Sitemaps_Cache_Validator::invalidate_storage(); + self::$clear_all = false; + self::$clear_types = []; + + return; + } + + foreach ( self::$clear_types as $type ) { + WPSEO_Sitemaps_Cache_Validator::invalidate_storage( $type ); + } + + self::$clear_types = []; + } + + /** + * Adds a hook that when given option is updated, the cache is cleared. + * + * @since 3.2 + * + * @param string $option Option name. + * @param string $type Sitemap type. + * + * @return void + */ + public static function register_clear_on_option_update( $option, $type = '' ) { + + self::$cache_clear[ $option ] = $type; + } + + /** + * Clears the transient cache when a given option is updated, if that option has been registered before. + * + * @since 3.2 + * + * @param string $option The option name that's being updated. + * + * @return void + */ + public static function clear_on_option_update( $option ) { + + if ( array_key_exists( $option, self::$cache_clear ) ) { + + if ( empty( self::$cache_clear[ $option ] ) ) { + // Clear all caches. + self::clear(); + } + else { + // Clear specific provided type(s). + $types = (array) self::$cache_clear[ $option ]; + self::clear( $types ); + } + } + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-renderer.php b/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-renderer.php new file mode 100644 index 00000000..255d4490 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-renderer.php @@ -0,0 +1,355 @@ +get_xsl_url() ); + $this->stylesheet = ''; + $this->charset = get_bloginfo( 'charset' ); + $this->output_charset = $this->charset; + + if ( + $this->charset !== 'UTF-8' + && function_exists( 'mb_list_encodings' ) + && in_array( $this->charset, mb_list_encodings(), true ) + ) { + $this->output_charset = 'UTF-8'; + } + + $this->needs_conversion = $this->output_charset !== $this->charset; + } + + /** + * Builds the sitemap index. + * + * @param array $links Set of sitemaps index links. + * + * @return string + */ + public function get_index( $links ) { + + $xml = '' . "\n"; + + foreach ( $links as $link ) { + $xml .= $this->sitemap_index_url( $link ); + } + + /** + * Filter to append sitemaps to the index. + * + * @param string $index String to append to sitemaps index, defaults to empty. + */ + $xml .= apply_filters( 'wpseo_sitemap_index', '' ); + $xml .= ''; + + return $xml; + } + + /** + * Builds the sitemap. + * + * @param array $links Set of sitemap links. + * @param string $type Sitemap type. + * @param int $current_page Current sitemap page number. + * + * @return string + */ + public function get_sitemap( $links, $type, $current_page ) { + + $urlset = '' . "\n"; + + /** + * Filters the `urlset` for all sitemaps. + * + * @param string $urlset The output for the sitemap's `urlset`. + */ + $urlset = apply_filters( 'wpseo_sitemap_urlset', $urlset ); + + /** + * Filters the `urlset` for a sitemap by type. + * + * @param string $urlset The output for the sitemap's `urlset`. + */ + $xml = apply_filters( "wpseo_sitemap_{$type}_urlset", $urlset ); + + foreach ( $links as $url ) { + $xml .= $this->sitemap_url( $url ); + } + + /** + * Filter to add extra URLs to the XML sitemap by type. + * + * Only runs for the first page, not on all. + * + * @param string $content String content to add, defaults to empty. + */ + if ( $current_page === 1 ) { + $xml .= apply_filters( "wpseo_sitemap_{$type}_content", '' ); + } + + $xml .= ''; + + return $xml; + } + + /** + * Produce final XML output with debug information. + * + * @param string $sitemap Sitemap XML. + * + * @return string + */ + public function get_output( $sitemap ) { + + $output = 'output_charset ) . '"?>'; + + if ( $this->stylesheet ) { + /** + * Filter the stylesheet URL for the XML sitemap. + * + * @param string $stylesheet Stylesheet URL. + */ + $output .= apply_filters( 'wpseo_stylesheet_url', $this->stylesheet ) . "\n"; + } + + $output .= $sitemap; + $output .= "\n"; + + return $output; + } + + /** + * Get charset for the output. + * + * @return string + */ + public function get_output_charset() { + return $this->output_charset; + } + + /** + * Set a custom stylesheet for this sitemap. Set to empty to just remove the default stylesheet. + * + * @param string $stylesheet Full XML-stylesheet declaration. + * + * @return void + */ + public function set_stylesheet( $stylesheet ) { + $this->stylesheet = $stylesheet; + } + + /** + * Build the `` tag for a given URL. + * + * @param array $url Array of parts that make up this entry. + * + * @return string + */ + protected function sitemap_index_url( $url ) { + + $date = null; + + if ( ! empty( $url['lastmod'] ) ) { + $date = YoastSEO()->helpers->date->format( $url['lastmod'] ); + } + + $url['loc'] = htmlspecialchars( $url['loc'], ENT_COMPAT, $this->output_charset, false ); + + $output = "\t\n"; + $output .= "\t\t" . $url['loc'] . "\n"; + $output .= empty( $date ) ? '' : "\t\t" . htmlspecialchars( $date, ENT_COMPAT, $this->output_charset, false ) . "\n"; + $output .= "\t\n"; + + return $output; + } + + /** + * Build the `` tag for a given URL. + * + * Public access for backwards compatibility reasons. + * + * @param array $url Array of parts that make up this entry. + * + * @return string + */ + public function sitemap_url( $url ) { + + $date = null; + + if ( ! empty( $url['mod'] ) ) { + // Create a DateTime object date in the correct timezone. + $date = YoastSEO()->helpers->date->format( $url['mod'] ); + } + + $output = "\t\n"; + $output .= "\t\t" . $this->encode_and_escape( $url['loc'] ) . "\n"; + $output .= empty( $date ) ? '' : "\t\t" . htmlspecialchars( $date, ENT_COMPAT, $this->output_charset, false ) . "\n"; + + if ( empty( $url['images'] ) ) { + $url['images'] = []; + } + + foreach ( $url['images'] as $img ) { + + if ( empty( $img['src'] ) ) { + continue; + } + + $output .= "\t\t\n"; + $output .= "\t\t\t" . $this->encode_and_escape( $img['src'] ) . "\n"; + $output .= "\t\t\n"; + } + unset( $img ); + + $output .= "\t\n"; + + /** + * Filters the output for the sitemap URL tag. + * + * @param string $output The output for the sitemap url tag. + * @param array $url The sitemap URL array on which the output is based. + */ + return apply_filters( 'wpseo_sitemap_url', $output, $url ); + } + + /** + * Ensure the URL is encoded per RFC3986 and correctly escaped for use in an XML sitemap. + * + * This method works around a two quirks in esc_url(): + * 1. `esc_url()` leaves schema-relative URLs alone, while according to the sitemap specs, + * the URL must always begin with a protocol. + * 2. `esc_url()` escapes ampersands as `&` instead of the more common `&`. + * According to the specs, `&` should be used, and even though this shouldn't + * really make a difference in practice, to quote Jono: "I'd be nervous about & + * given how many weird and wonderful things eat sitemaps", so better safe than sorry. + * + * @link https://www.sitemaps.org/protocol.html#xmlTagDefinitions + * @link https://www.sitemaps.org/protocol.html#escaping + * @link https://developer.wordpress.org/reference/functions/esc_url/ + * + * @param string $url URL to encode and escape. + * + * @return string + */ + protected function encode_and_escape( $url ) { + $url = $this->encode_url_rfc3986( $url ); + $url = esc_url( $url ); + $url = str_replace( '&', '&', $url ); + $url = str_replace( ''', ''', $url ); + + if ( strpos( $url, '//' ) === 0 ) { + // Schema-relative URL for which esc_url() does not add a scheme. + $url = 'http:' . $url; + } + + return $url; + } + + /** + * Apply some best effort conversion to comply with RFC3986. + * + * @param string $url URL to encode. + * + * @return string + */ + protected function encode_url_rfc3986( $url ) { + + if ( filter_var( $url, FILTER_VALIDATE_URL ) ) { + return $url; + } + + $path = wp_parse_url( $url, PHP_URL_PATH ); + + if ( ! empty( $path ) && $path !== '/' ) { + $encoded_path = explode( '/', $path ); + + // First decode the path, to prevent double encoding. + $encoded_path = array_map( 'rawurldecode', $encoded_path ); + + $encoded_path = array_map( 'rawurlencode', $encoded_path ); + $encoded_path = implode( '/', $encoded_path ); + + $url = str_replace( $path, $encoded_path, $url ); + } + + $query = wp_parse_url( $url, PHP_URL_QUERY ); + + if ( ! empty( $query ) ) { + + parse_str( $query, $parsed_query ); + + $parsed_query = http_build_query( $parsed_query, '', '&', PHP_QUERY_RFC3986 ); + + $url = str_replace( $query, $parsed_query, $url ); + } + + return $url; + } + + /** + * Retrieves the XSL URL that should be used in the current environment + * + * When home_url and site_url are not the same, the home_url should be used. + * This is because the XSL needs to be served from the same domain, protocol and port + * as the XML file that is loading it. + * + * @return string The XSL URL that needs to be used. + */ + protected function get_xsl_url() { + if ( home_url() !== site_url() ) { + return home_url( 'main-sitemap.xsl' ); + } + + /* + * Fallback to circumvent a cross-domain security problem when the XLS file is + * loaded from a different (sub)domain. + */ + if ( strpos( plugins_url(), home_url() ) !== 0 ) { + return home_url( 'main-sitemap.xsl' ); + } + + return plugin_dir_url( WPSEO_FILE ) . 'css/main-sitemap.xsl'; + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-router.php b/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-router.php new file mode 100644 index 00000000..8b923146 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-router.php @@ -0,0 +1,161 @@ +classes->get( Deactivating_Yoast_Seo_Conditional::class )->is_met() ) { + return; + } + + add_action( 'yoast_add_dynamic_rewrite_rules', [ $this, 'add_rewrite_rules' ] ); + add_filter( 'query_vars', [ $this, 'add_query_vars' ] ); + + add_filter( 'redirect_canonical', [ $this, 'redirect_canonical' ] ); + add_action( 'template_redirect', [ $this, 'template_redirect' ], 0 ); + } + + /** + * Adds rewrite routes for sitemaps. + * + * @param Yoast_Dynamic_Rewrites $dynamic_rewrites Dynamic rewrites handler instance. + * + * @return void + */ + public function add_rewrite_rules( $dynamic_rewrites ) { + $dynamic_rewrites->add_rule( 'sitemap_index\.xml$', 'index.php?sitemap=1', 'top' ); + $dynamic_rewrites->add_rule( '([^/]+?)-sitemap([0-9]+)?\.xml$', 'index.php?sitemap=$matches[1]&sitemap_n=$matches[2]', 'top' ); + $dynamic_rewrites->add_rule( '([a-z]+)?-?sitemap\.xsl$', 'index.php?yoast-sitemap-xsl=$matches[1]', 'top' ); + } + + /** + * Adds query variables for sitemaps. + * + * @param array $query_vars List of query variables to filter. + * + * @return array Filtered query variables. + */ + public function add_query_vars( $query_vars ) { + $query_vars[] = 'sitemap'; + $query_vars[] = 'sitemap_n'; + $query_vars[] = 'yoast-sitemap-xsl'; + + return $query_vars; + } + + /** + * Sets up rewrite rules. + * + * @deprecated 21.8 + * @codeCoverageIgnore + * + * @return void + */ + public function init() { + _deprecated_function( __METHOD__, 'Yoast SEO 21.8' ); + } + + /** + * Stop trailing slashes on sitemap.xml URLs. + * + * @param string $redirect The redirect URL currently determined. + * + * @return bool|string + */ + public function redirect_canonical( $redirect ) { + + if ( get_query_var( 'sitemap' ) || get_query_var( 'yoast-sitemap-xsl' ) ) { + return false; + } + + return $redirect; + } + + /** + * Redirects sitemap.xml to sitemap_index.xml. + * + * @return void + */ + public function template_redirect() { + if ( ! $this->needs_sitemap_index_redirect() ) { + return; + } + + YoastSEO()->helpers->redirect->do_safe_redirect( home_url( '/sitemap_index.xml' ), 301, 'Yoast SEO' ); + } + + /** + * Checks whether the current request needs to be redirected to sitemap_index.xml. + * + * @global WP_Query $wp_query Current query. + * + * @return bool True if redirect is needed, false otherwise. + */ + public function needs_sitemap_index_redirect() { + global $wp_query; + + $protocol = 'http://'; + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + if ( ! empty( $_SERVER['HTTPS'] ) && strtolower( $_SERVER['HTTPS'] ) === 'on' ) { + $protocol = 'https://'; + } + + $domain = ''; + if ( isset( $_SERVER['SERVER_NAME'] ) ) { + $domain = sanitize_text_field( wp_unslash( $_SERVER['SERVER_NAME'] ) ); + } + + $path = ''; + if ( isset( $_SERVER['REQUEST_URI'] ) ) { + $path = sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ); + } + + // Due to different environment configurations, we need to check both SERVER_NAME and HTTP_HOST. + $check_urls = [ $protocol . $domain . $path ]; + if ( ! empty( $_SERVER['HTTP_HOST'] ) ) { + $check_urls[] = $protocol . sanitize_text_field( wp_unslash( $_SERVER['HTTP_HOST'] ) ) . $path; + } + + return $wp_query->is_404 && in_array( home_url( '/sitemap.xml' ), $check_urls, true ); + } + + /** + * Create base URL for the sitemap. + * + * @param string $page Page to append to the base URL. + * + * @return string base URL (incl page) + */ + public static function get_base_url( $page ) { + + global $wp_rewrite; + + $base = $wp_rewrite->using_index_permalinks() ? 'index.php/' : '/'; + + /** + * Filter the base URL of the sitemaps. + * + * @param string $base The string that should be added to home_url() to make the full base URL. + */ + $base = apply_filters( 'wpseo_sitemaps_base_url', $base ); + + /* + * Get the scheme from the configured home URL instead of letting WordPress + * determine the scheme based on the requested URI. + */ + return home_url( $base . $page, wp_parse_url( get_option( 'home' ), PHP_URL_SCHEME ) ); + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps.php b/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps.php new file mode 100644 index 00000000..2fbb567c --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps.php @@ -0,0 +1,674 @@ +router = new WPSEO_Sitemaps_Router(); + $this->renderer = new WPSEO_Sitemaps_Renderer(); + $this->cache = new WPSEO_Sitemaps_Cache(); + + if ( ! empty( $_SERVER['SERVER_PROTOCOL'] ) ) { + $this->http_protocol = sanitize_text_field( wp_unslash( $_SERVER['SERVER_PROTOCOL'] ) ); + } + } + + /** + * Initialize sitemap providers classes. + * + * @since 5.3 + * + * @return void + */ + public function init_sitemaps_providers() { + + $this->providers = [ + new WPSEO_Post_Type_Sitemap_Provider(), + new WPSEO_Taxonomy_Sitemap_Provider(), + new WPSEO_Author_Sitemap_Provider(), + ]; + + $external_providers = apply_filters( 'wpseo_sitemaps_providers', [] ); + + foreach ( $external_providers as $provider ) { + if ( is_object( $provider ) && $provider instanceof WPSEO_Sitemap_Provider ) { + $this->providers[] = $provider; + } + } + } + + /** + * Check the current request URI, if we can determine it's probably an XML sitemap, kill loading the widgets. + * + * @return void + */ + public function reduce_query_load() { + if ( ! isset( $_SERVER['REQUEST_URI'] ) ) { + return; + } + $request_uri = sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ); + $extension = substr( $request_uri, -4 ); + if ( stripos( $request_uri, 'sitemap' ) !== false && in_array( $extension, [ '.xml', '.xsl' ], true ) ) { + remove_all_actions( 'widgets_init' ); + } + } + + /** + * Register your own sitemap. Call this during 'init'. + * + * @param string $name The name of the sitemap. + * @param callback $building_function Function to build your sitemap. + * @param string $rewrite Optional. Regular expression to match your sitemap with. + * + * @return void + */ + public function register_sitemap( $name, $building_function, $rewrite = '' ) { + add_action( 'wpseo_do_sitemap_' . $name, $building_function ); + if ( $rewrite ) { + Yoast_Dynamic_Rewrites::instance()->add_rule( $rewrite, 'index.php?sitemap=' . $name, 'top' ); + } + } + + /** + * Register your own XSL file. Call this during 'init'. + * + * @since 1.4.23 + * + * @param string $name The name of the XSL file. + * @param callback $building_function Function to build your XSL file. + * @param string $rewrite Optional. Regular expression to match your sitemap with. + * + * @return void + */ + public function register_xsl( $name, $building_function, $rewrite = '' ) { + add_action( 'wpseo_xsl_' . $name, $building_function ); + if ( $rewrite ) { + Yoast_Dynamic_Rewrites::instance()->add_rule( $rewrite, 'index.php?yoast-sitemap-xsl=' . $name, 'top' ); + } + } + + /** + * Set the sitemap current page to allow creating partial sitemaps with WP-CLI + * in a one-off process. + * + * @param int $current_page The part that should be generated. + * + * @return void + */ + public function set_n( $current_page ) { + if ( is_scalar( $current_page ) && intval( $current_page ) > 0 ) { + $this->current_page = intval( $current_page ); + } + } + + /** + * Set the sitemap content to display after you have generated it. + * + * @param string $sitemap The generated sitemap to output. + * + * @return void + */ + public function set_sitemap( $sitemap ) { + $this->sitemap = $sitemap; + } + + /** + * Set as true to make the request 404. Used stop the display of empty sitemaps or invalid requests. + * + * @param bool $is_bad Is this a bad request. True or false. + * + * @return void + */ + public function set_bad_sitemap( $is_bad ) { + $this->bad_sitemap = (bool) $is_bad; + } + + /** + * Prevent stupid plugins from running shutdown scripts when we're obviously not outputting HTML. + * + * @since 1.4.16 + * + * @return void + */ + public function sitemap_close() { + remove_all_actions( 'wp_footer' ); + die(); + } + + /** + * Hijack requests for potential sitemaps and XSL files. + * + * @param WP_Query $query Main query instance. + * + * @return void + */ + public function redirect( $query ) { + + if ( ! $query->is_main_query() ) { + return; + } + + $yoast_sitemap_xsl = get_query_var( 'yoast-sitemap-xsl' ); + + if ( ! empty( $yoast_sitemap_xsl ) ) { + /* + * This is a method to provide the XSL via the home_url. + * Needed when the site_url and home_url are not the same. + * Loading the XSL needs to come from the same domain, protocol and port as the XML. + * + * Whenever home_url and site_url are the same, the file can be loaded directly. + */ + $this->xsl_output( $yoast_sitemap_xsl ); + $this->sitemap_close(); + + return; + } + + $type = get_query_var( 'sitemap' ); + + if ( empty( $type ) ) { + return; + } + + if ( get_query_var( 'sitemap_n' ) === '1' || get_query_var( 'sitemap_n' ) === '0' ) { + wp_safe_redirect( home_url( "/$type-sitemap.xml" ), 301, 'Yoast SEO' ); + exit; + } + + $this->set_n( get_query_var( 'sitemap_n' ) ); + + if ( ! $this->get_sitemap_from_cache( $type, $this->current_page ) ) { + $this->build_sitemap( $type ); + } + + if ( $this->bad_sitemap ) { + $query->set_404(); + status_header( 404 ); + + return; + } + + $this->output(); + $this->sitemap_close(); + } + + /** + * Try to get the sitemap from cache. + * + * @param string $type Sitemap type. + * @param int $page_number The page number to retrieve. + * + * @return bool If the sitemap has been retrieved from cache. + */ + private function get_sitemap_from_cache( $type, $page_number ) { + + $this->transient = false; + + if ( $this->cache->is_enabled() !== true ) { + return false; + } + + /** + * Fires before the attempt to retrieve XML sitemap from the transient cache. + * + * @param WPSEO_Sitemaps $sitemaps Sitemaps object. + */ + do_action( 'wpseo_sitemap_stylesheet_cache_' . $type, $this ); + + $sitemap_cache_data = $this->cache->get_sitemap_data( $type, $page_number ); + + // No cache was found, refresh it because cache is enabled. + if ( empty( $sitemap_cache_data ) ) { + return $this->refresh_sitemap_cache( $type, $page_number ); + } + + // Cache object was found, parse information. + $this->transient = true; + + $this->sitemap = $sitemap_cache_data->get_sitemap(); + $this->bad_sitemap = ! $sitemap_cache_data->is_usable(); + + return true; + } + + /** + * Build and save sitemap to cache. + * + * @param string $type Sitemap type. + * @param int $page_number The page number to save to. + * + * @return bool + */ + private function refresh_sitemap_cache( $type, $page_number ) { + $this->set_n( $page_number ); + $this->build_sitemap( $type ); + + return $this->cache->store_sitemap( $type, $page_number, $this->sitemap, ! $this->bad_sitemap ); + } + + /** + * Attempts to build the requested sitemap. + * + * Sets $bad_sitemap if this isn't for the root sitemap, a post type or taxonomy. + * + * @param string $type The requested sitemap's identifier. + * + * @return void + */ + public function build_sitemap( $type ) { + + /** + * Filter the type of sitemap to build. + * + * @param string $type Sitemap type, determined by the request. + */ + $type = apply_filters( 'wpseo_build_sitemap_post_type', $type ); + + if ( $type === '1' ) { + $this->build_root_map(); + + return; + } + + $entries_per_page = $this->get_entries_per_page(); + + foreach ( $this->providers as $provider ) { + if ( ! $provider->handles_type( $type ) ) { + continue; + } + + try { + $links = $provider->get_sitemap_links( $type, $entries_per_page, $this->current_page ); + } catch ( OutOfBoundsException $exception ) { + $this->bad_sitemap = true; + + return; + } + + $this->sitemap = $this->renderer->get_sitemap( $links, $type, $this->current_page ); + + return; + } + + if ( has_action( 'wpseo_do_sitemap_' . $type ) ) { + /** + * Fires custom handler, if hooked to generate sitemap for the type. + */ + do_action( 'wpseo_do_sitemap_' . $type ); + + return; + } + + $this->bad_sitemap = true; + } + + /** + * Build the root sitemap (example.com/sitemap_index.xml) which lists sub-sitemaps for other content types. + * + * @return void + */ + public function build_root_map() { + + $links = []; + $entries_per_page = $this->get_entries_per_page(); + + foreach ( $this->providers as $provider ) { + $links = array_merge( $links, $provider->get_index_links( $entries_per_page ) ); + } + + /** + * Filter the sitemap links array before the index sitemap is built. + * + * @param array $links Array of sitemap links + */ + $links = apply_filters( 'wpseo_sitemap_index_links', $links ); + + if ( empty( $links ) ) { + $this->bad_sitemap = true; + $this->sitemap = ''; + + return; + } + + $this->sitemap = $this->renderer->get_index( $links ); + } + + /** + * Spits out the XSL for the XML sitemap. + * + * @since 1.4.13 + * + * @param string $type Type to output. + * + * @return void + */ + public function xsl_output( $type ) { + + if ( $type !== 'main' ) { + + /** + * Fires for the output of XSL for XML sitemaps, other than type "main". + */ + do_action( 'wpseo_xsl_' . $type ); + + return; + } + + header( $this->http_protocol . ' 200 OK', true, 200 ); + // Prevent the search engines from indexing the XML Sitemap. + header( 'X-Robots-Tag: noindex, follow', true ); + header( 'Content-Type: text/xml' ); + + // Make the browser cache this file properly. + $expires = YEAR_IN_SECONDS; + header( 'Pragma: public' ); + header( 'Cache-Control: max-age=' . $expires ); + header( 'Expires: ' . YoastSEO()->helpers->date->format_timestamp( ( time() + $expires ), 'D, d M Y H:i:s' ) . ' GMT' ); + + // Don't use WP_Filesystem() here because that's not initialized yet. See https://yoast.atlassian.net/browse/QAK-2043. + readfile( WPSEO_PATH . 'css/main-sitemap.xsl' ); + } + + /** + * Spit out the generated sitemap. + * + * @return void + */ + public function output() { + $this->send_headers(); + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Escaping sitemap as either xml or html results in empty document. + echo $this->renderer->get_output( $this->sitemap ); + } + + /** + * Makes a request to the sitemap index to cache it before the arrival of the search engines. + * + * @return void + */ + public function hit_sitemap_index() { + if ( ! $this->cache->is_enabled() ) { + return; + } + + wp_remote_get( WPSEO_Sitemaps_Router::get_base_url( 'sitemap_index.xml' ) ); + } + + /** + * Get the GMT modification date for the last modified post in the post type. + * + * @since 3.2 + * + * @param string|array $post_types Post type or array of types. + * @param bool $return_all Flag to return array of values. + * + * @return string|array|false + */ + public static function get_last_modified_gmt( $post_types, $return_all = false ) { + + global $wpdb; + + static $post_type_dates = null; + + if ( ! is_array( $post_types ) ) { + $post_types = [ $post_types ]; + } + + foreach ( $post_types as $post_type ) { + if ( ! isset( $post_type_dates[ $post_type ] ) ) { // If we hadn't seen post type before. R. + $post_type_dates = null; + break; + } + } + + if ( is_null( $post_type_dates ) ) { + + $post_type_dates = []; + $post_type_names = WPSEO_Post_Type::get_accessible_post_types(); + + if ( ! empty( $post_type_names ) ) { + $post_statuses = array_map( 'esc_sql', self::get_post_statuses() ); + $replacements = array_merge( + [ + 'post_type', + 'post_modified_gmt', + 'date', + $wpdb->posts, + 'post_status', + ], + $post_statuses, + [ 'post_type' ], + array_keys( $post_type_names ), + [ + 'post_type', + 'date', + ] + ); + + //phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- We need to use a direct query here. + //phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + $dates = $wpdb->get_results( + //phpcs:disable WordPress.DB.PreparedSQLPlaceholders -- %i placeholder is still not recognized. + $wpdb->prepare( + ' + SELECT %i, MAX(%i) AS %i + FROM %i + WHERE %i IN (' . implode( ', ', array_fill( 0, count( $post_statuses ), '%s' ) ) . ') + AND %i IN (' . implode( ', ', array_fill( 0, count( $post_type_names ), '%s' ) ) . ') + GROUP BY %i + ORDER BY %i DESC + ', + $replacements + ) + ); + + foreach ( $dates as $obj ) { + $post_type_dates[ $obj->post_type ] = $obj->date; + } + } + } + + $dates = array_intersect_key( $post_type_dates, array_flip( $post_types ) ); + + if ( count( $dates ) > 0 ) { + if ( $return_all ) { + return $dates; + } + + return max( $dates ); + } + + return false; + } + + /** + * Get the modification date for the last modified post in the post type. + * + * @param array $post_types Post types to get the last modification date for. + * + * @return string + */ + public function get_last_modified( $post_types ) { + return YoastSEO()->helpers->date->format( self::get_last_modified_gmt( $post_types ) ); + } + + /** + * Get the maximum number of entries per XML sitemap. + * + * @return int The maximum number of entries. + */ + protected function get_entries_per_page() { + /** + * Filter the maximum number of entries per XML sitemap. + * + * After changing the output of the filter, make sure that you disable and enable the + * sitemaps to make sure the value is picked up for the sitemap cache. + * + * @param int $entries The maximum number of entries per XML sitemap. + */ + $entries = (int) apply_filters( 'wpseo_sitemap_entries_per_page', 1000 ); + + return $entries; + } + + /** + * Get post statuses for post_type or the root sitemap. + * + * @since 10.2 + * + * @param string $type Provide a type for a post_type sitemap, SITEMAP_INDEX_TYPE for the root sitemap. + * + * @return array List of post statuses. + */ + public static function get_post_statuses( $type = self::SITEMAP_INDEX_TYPE ) { + /** + * Filter post status list for sitemap query for the post type. + * + * @param array $post_statuses Post status list, defaults to array( 'publish' ). + * @param string $type Post type or SITEMAP_INDEX_TYPE. + */ + $post_statuses = apply_filters( 'wpseo_sitemap_post_statuses', [ 'publish' ], $type ); + + if ( ! is_array( $post_statuses ) || empty( $post_statuses ) ) { + $post_statuses = [ 'publish' ]; + } + + if ( ( $type === self::SITEMAP_INDEX_TYPE || $type === 'attachment' ) + && ! in_array( 'inherit', $post_statuses, true ) + ) { + $post_statuses[] = 'inherit'; + } + + return $post_statuses; + } + + /** + * Sends all the required HTTP Headers. + * + * @return void + */ + private function send_headers() { + if ( headers_sent() ) { + return; + } + + $headers = [ + $this->http_protocol . ' 200 OK' => 200, + // Prevent the search engines from indexing the XML Sitemap. + 'X-Robots-Tag: noindex, follow' => '', + 'Content-Type: text/xml; charset=' . esc_attr( $this->renderer->get_output_charset() ) => '', + ]; + + /** + * Filter the HTTP headers we send before an XML sitemap. + * + * @param array $headers The HTTP headers we're going to send out. + */ + $headers = apply_filters( 'wpseo_sitemap_http_headers', $headers ); + + foreach ( $headers as $header => $status ) { + if ( is_numeric( $status ) ) { + header( $header, true, $status ); + continue; + } + header( $header, true ); + } + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/sitemaps/class-taxonomy-sitemap-provider.php b/wp-content/plugins/wordpress-seo/inc/sitemaps/class-taxonomy-sitemap-provider.php new file mode 100644 index 00000000..e69f0e79 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/sitemaps/class-taxonomy-sitemap-provider.php @@ -0,0 +1,351 @@ +include_images = apply_filters( 'wpseo_xml_sitemap_include_images', true ); + } + + /** + * Check if provider supports given item type. + * + * @param string $type Type string to check for. + * + * @return bool + */ + public function handles_type( $type ) { + + $taxonomy = get_taxonomy( $type ); + + if ( $taxonomy === false || ! $this->is_valid_taxonomy( $taxonomy->name ) || ! $taxonomy->public ) { + return false; + } + + return true; + } + + /** + * Retrieves the links for the sitemap. + * + * @param int $max_entries Entries per sitemap. + * + * @return array + */ + public function get_index_links( $max_entries ) { + + $taxonomies = get_taxonomies( [ 'public' => true ], 'objects' ); + + if ( empty( $taxonomies ) ) { + return []; + } + + $taxonomy_names = array_filter( array_keys( $taxonomies ), [ $this, 'is_valid_taxonomy' ] ); + $taxonomies = array_intersect_key( $taxonomies, array_flip( $taxonomy_names ) ); + + // Retrieve all the taxonomies and their terms so we can do a proper count on them. + + /** + * Filter the setting of excluding empty terms from the XML sitemap. + * + * @param bool $exclude Defaults to true. + * @param array $taxonomy_names Array of names for the taxonomies being processed. + */ + $hide_empty = apply_filters( 'wpseo_sitemap_exclude_empty_terms', true, $taxonomy_names ); + + $all_taxonomies = []; + + foreach ( $taxonomy_names as $taxonomy_name ) { + /** + * Filter the setting of excluding empty terms from the XML sitemap for a specific taxonomy. + * + * @param bool $exclude Defaults to the sitewide setting. + * @param string $taxonomy_name The name of the taxonomy being processed. + */ + $hide_empty_tax = apply_filters( 'wpseo_sitemap_exclude_empty_terms_taxonomy', $hide_empty, $taxonomy_name ); + + $term_args = [ + 'taxonomy' => $taxonomy_name, + 'hide_empty' => $hide_empty_tax, + 'fields' => 'ids', + ]; + $taxonomy_terms = get_terms( $term_args ); + + if ( count( $taxonomy_terms ) > 0 ) { + $all_taxonomies[ $taxonomy_name ] = $taxonomy_terms; + } + } + + $index = []; + + foreach ( $taxonomies as $tax_name => $tax ) { + + if ( ! isset( $all_taxonomies[ $tax_name ] ) ) { // No eligible terms found. + continue; + } + + $total_count = ( isset( $all_taxonomies[ $tax_name ] ) ) ? count( $all_taxonomies[ $tax_name ] ) : 1; + $max_pages = 1; + + if ( $total_count > $max_entries ) { + $max_pages = (int) ceil( $total_count / $max_entries ); + } + + $last_modified_gmt = WPSEO_Sitemaps::get_last_modified_gmt( $tax->object_type ); + + for ( $page_counter = 0; $page_counter < $max_pages; $page_counter++ ) { + + $current_page = ( $page_counter === 0 ) ? '' : ( $page_counter + 1 ); + + if ( ! is_array( $tax->object_type ) || count( $tax->object_type ) === 0 ) { + continue; + } + + $terms = array_splice( $all_taxonomies[ $tax_name ], 0, $max_entries ); + + if ( ! $terms ) { + continue; + } + + $args = [ + 'post_type' => $tax->object_type, + 'tax_query' => [ + [ + 'taxonomy' => $tax_name, + 'terms' => $terms, + ], + ], + 'orderby' => 'modified', + 'order' => 'DESC', + 'posts_per_page' => 1, + ]; + $query = new WP_Query( $args ); + + if ( $query->have_posts() ) { + $date = $query->posts[0]->post_modified_gmt; + } + else { + $date = $last_modified_gmt; + } + + $index[] = [ + 'loc' => WPSEO_Sitemaps_Router::get_base_url( $tax_name . '-sitemap' . $current_page . '.xml' ), + 'lastmod' => $date, + ]; + } + } + + return $index; + } + + /** + * Get set of sitemap link data. + * + * @param string $type Sitemap type. + * @param int $max_entries Entries per sitemap. + * @param int $current_page Current page of the sitemap. + * + * @return array + * + * @throws OutOfBoundsException When an invalid page is requested. + */ + public function get_sitemap_links( $type, $max_entries, $current_page ) { + global $wpdb; + + $links = []; + if ( ! $this->handles_type( $type ) ) { + return $links; + } + + $taxonomy = get_taxonomy( $type ); + + $steps = $max_entries; + $offset = ( $current_page > 1 ) ? ( ( $current_page - 1 ) * $max_entries ) : 0; + + /** This filter is documented in inc/sitemaps/class-taxonomy-sitemap-provider.php */ + $hide_empty = apply_filters( 'wpseo_sitemap_exclude_empty_terms', true, [ $taxonomy->name ] ); + /** This filter is documented in inc/sitemaps/class-taxonomy-sitemap-provider.php */ + $hide_empty_tax = apply_filters( 'wpseo_sitemap_exclude_empty_terms_taxonomy', $hide_empty, $taxonomy->name ); + $terms = get_terms( + [ + 'taxonomy' => $taxonomy->name, + 'hide_empty' => $hide_empty_tax, + 'update_term_meta_cache' => false, + 'offset' => $offset, + 'number' => $steps, + ] + ); + + // If there are no terms fetched for this range, we are on an invalid page. + if ( empty( $terms ) ) { + throw new OutOfBoundsException( 'Invalid sitemap page requested' ); + } + + $post_statuses = array_map( 'esc_sql', WPSEO_Sitemaps::get_post_statuses() ); + + $replacements = array_merge( + [ + 'post_modified_gmt', + $wpdb->posts, + $wpdb->term_relationships, + 'object_id', + 'ID', + $wpdb->term_taxonomy, + 'term_taxonomy_id', + 'term_taxonomy_id', + 'taxonomy', + 'term_id', + 'post_status', + ], + $post_statuses, + [ 'post_password' ] + ); + + /** + * Filter: 'wpseo_exclude_from_sitemap_by_term_ids' - Allow excluding terms by ID. + * + * @param array $terms_to_exclude The terms to exclude. + */ + $terms_to_exclude = apply_filters( 'wpseo_exclude_from_sitemap_by_term_ids', [] ); + + foreach ( $terms as $term ) { + + if ( in_array( $term->term_id, $terms_to_exclude, true ) ) { + continue; + } + + $url = []; + + $tax_noindex = WPSEO_Taxonomy_Meta::get_term_meta( $term, $term->taxonomy, 'noindex' ); + + if ( $tax_noindex === 'noindex' ) { + continue; + } + + $canonical = WPSEO_Taxonomy_Meta::get_term_meta( $term, $term->taxonomy, 'canonical' ); + $url['loc'] = get_term_link( $term, $term->taxonomy ); + + if ( is_string( $canonical ) && $canonical !== '' && $canonical !== $url['loc'] ) { + continue; + } + + $current_replacements = $replacements; + array_splice( $current_replacements, 9, 0, $term->taxonomy ); + array_splice( $current_replacements, 11, 0, $term->term_id ); + + //phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- We need to use a direct query here. + //phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches. + $url['mod'] = $wpdb->get_var( + //phpcs:disable WordPress.DB.PreparedSQLPlaceholders -- %i placeholder is still not recognized. + $wpdb->prepare( + ' + SELECT MAX(p.%i) AS lastmod + FROM %i AS p + INNER JOIN %i AS term_rel + ON term_rel.%i = p.%i + INNER JOIN %i AS term_tax + ON term_tax.%i = term_rel.%i + AND term_tax.%i = %s + AND term_tax.%i = %d + WHERE p.%i IN (' . implode( ', ', array_fill( 0, count( $post_statuses ), '%s' ) ) . ") + AND p.%i = '' + ", + $current_replacements + ) + ); + + if ( $this->include_images ) { + $url['images'] = $this->get_image_parser()->get_term_images( $term ); + } + + // Deprecated, kept for backwards data compat. R. + $url['chf'] = 'daily'; + $url['pri'] = 1; + + /** This filter is documented at inc/sitemaps/class-post-type-sitemap-provider.php */ + $url = apply_filters( 'wpseo_sitemap_entry', $url, 'term', $term ); + + if ( ! empty( $url ) ) { + $links[] = $url; + } + } + + return $links; + } + + /** + * Check if taxonomy by name is valid to appear in sitemaps. + * + * @param string $taxonomy_name Taxonomy name to check. + * + * @return bool + */ + public function is_valid_taxonomy( $taxonomy_name ) { + + if ( WPSEO_Options::get( "noindex-tax-{$taxonomy_name}" ) === true ) { + return false; + } + + if ( in_array( $taxonomy_name, [ 'link_category', 'nav_menu', 'wp_pattern_category' ], true ) ) { + return false; + } + + if ( $taxonomy_name === 'post_format' && WPSEO_Options::get( 'disable-post_format', false ) ) { + return false; + } + + /** + * Filter to exclude the taxonomy from the XML sitemap. + * + * @param bool $exclude Defaults to false. + * @param string $taxonomy_name Name of the taxonomy to exclude.. + */ + if ( apply_filters( 'wpseo_sitemap_exclude_taxonomy', false, $taxonomy_name ) ) { + return false; + } + + return true; + } + + /** + * Get the Image Parser. + * + * @return WPSEO_Sitemap_Image_Parser + */ + protected function get_image_parser() { + if ( ! isset( self::$image_parser ) ) { + self::$image_parser = new WPSEO_Sitemap_Image_Parser(); + } + + return self::$image_parser; + } +} diff --git a/wp-content/plugins/wordpress-seo/inc/sitemaps/interface-sitemap-cache-data.php b/wp-content/plugins/wordpress-seo/inc/sitemaps/interface-sitemap-cache-data.php new file mode 100644 index 00000000..9cfdf0aa --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/sitemaps/interface-sitemap-cache-data.php @@ -0,0 +1,72 @@ +ID ); + return $primary_term->get_primary_term(); + } +} + +if ( ! function_exists( 'yoast_get_primary_term' ) ) { + /** + * Get the primary term name. + * + * @param string $taxonomy Optional. The taxonomy to get the primary term for. Defaults to category. + * @param int|WP_Post|null $post Optional. Post to get the primary term for. + * + * @return string Name of the primary term. + */ + function yoast_get_primary_term( $taxonomy = 'category', $post = null ) { + $primary_term_id = yoast_get_primary_term_id( $taxonomy, $post ); + + $term = get_term( $primary_term_id ); + if ( ! is_wp_error( $term ) && ! empty( $term ) ) { + return $term->name; + } + + return ''; + } +} + +/** + * Replace `%%variable_placeholders%%` with their real value based on the current requested page/post/cpt. + * + * @param string $text The string to replace the variables in. + * @param object $args The object some of the replacement values might come from, + * could be a post, taxonomy or term. + * @param array $omit Variables that should not be replaced by this function. + * + * @return string + */ +function wpseo_replace_vars( $text, $args, $omit = [] ) { + $replacer = new WPSEO_Replace_Vars(); + + return $replacer->replace( $text, $args, $omit ); +} + +/** + * Register a new variable replacement. + * + * This function is for use by other plugins/themes to easily add their own additional variables to replace. + * This function should be called from a function on the 'wpseo_register_extra_replacements' action hook. + * The use of this function is preferred over the older 'wpseo_replacements' filter as a way to add new replacements. + * The 'wpseo_replacements' filter should still be used to adjust standard WPSEO replacement values. + * The function can not be used to replace standard WPSEO replacement value functions and will thrown a warning + * if you accidently try. + * To avoid conflicts with variables registered by WPSEO and other themes/plugins, try and make the + * name of your variable unique. Variable names also can not start with "%%cf_" or "%%ct_" as these are reserved + * for the standard WPSEO variable variables 'cf_', 'ct_' and + * 'ct_desc_'. + * The replacement function will be passed the undelimited name (i.e. stripped of the %%) of the variable + * to replace in case you need it. + * + * Example code: + * + * + * + * + * @since 1.5.4 + * + * @param string $replacevar_name The name of the variable to replace, i.e. '%%var%%'. + * Note: the surrounding %% are optional, name can only contain [A-Za-z0-9_-]. + * @param mixed $replace_function Function or method to call to retrieve the replacement value for the variable. + * Uses the same format as add_filter/add_action function parameter and + * should *return* the replacement value. DON'T echo it. + * @param string $type Type of variable: 'basic' or 'advanced', defaults to 'advanced'. + * @param string $help_text Help text to be added to the help tab for this variable. + * + * @return bool Whether the replacement function was successfully registered. + */ +function wpseo_register_var_replacement( $replacevar_name, $replace_function, $type = 'advanced', $help_text = '' ) { + return WPSEO_Replace_Vars::register_replacement( $replacevar_name, $replace_function, $type, $help_text ); +} + +/** + * WPML plugin support: Set titles for custom types / taxonomies as translatable. + * + * It adds new keys to a wpml-config.xml file for a custom post type title, metadesc, + * title-ptarchive and metadesc-ptarchive fields translation. + * Documentation: http://wpml.org/documentation/support/language-configuration-files/ + * + * @global $sitepress + * + * @param array $config WPML configuration data to filter. + * + * @return array + */ +function wpseo_wpml_config( $config ) { + global $sitepress; + + if ( ( is_array( $config ) && isset( $config['wpml-config']['admin-texts']['key'] ) ) && ( is_array( $config['wpml-config']['admin-texts']['key'] ) && $config['wpml-config']['admin-texts']['key'] !== [] ) ) { + $admin_texts = $config['wpml-config']['admin-texts']['key']; + foreach ( $admin_texts as $k => $val ) { + if ( $val['attr']['name'] === 'wpseo_titles' ) { + $translate_cp = array_keys( $sitepress->get_translatable_documents() ); + if ( is_array( $translate_cp ) && $translate_cp !== [] ) { + foreach ( $translate_cp as $post_type ) { + $admin_texts[ $k ]['key'][]['attr']['name'] = 'title-' . $post_type; + $admin_texts[ $k ]['key'][]['attr']['name'] = 'metadesc-' . $post_type; + $admin_texts[ $k ]['key'][]['attr']['name'] = 'title-ptarchive-' . $post_type; + $admin_texts[ $k ]['key'][]['attr']['name'] = 'metadesc-ptarchive-' . $post_type; + + $translate_tax = $sitepress->get_translatable_taxonomies( false, $post_type ); + if ( is_array( $translate_tax ) && $translate_tax !== [] ) { + foreach ( $translate_tax as $taxonomy ) { + $admin_texts[ $k ]['key'][]['attr']['name'] = 'title-tax-' . $taxonomy; + $admin_texts[ $k ]['key'][]['attr']['name'] = 'metadesc-tax-' . $taxonomy; + } + } + } + } + break; + } + } + $config['wpml-config']['admin-texts']['key'] = $admin_texts; + } + + return $config; +} + +add_filter( 'icl_wpml_config_array', 'wpseo_wpml_config' ); + +if ( ! function_exists( 'ctype_digit' ) ) { + /** + * Emulate PHP native ctype_digit() function for when the ctype extension would be disabled *sigh*. + * Only emulates the behaviour for when the input is a string, does not handle integer input as ascii value. + * + * @param string $text String input to validate. + * + * @return bool + */ + function ctype_digit( $text ) { + $return = false; + if ( ( is_string( $text ) && $text !== '' ) && preg_match( '`^\d+$`', $text ) === 1 ) { + $return = true; + } + + return $return; + } +} + +/** + * Makes sure the taxonomy meta is updated when a taxonomy term is split. + * + * @link https://make.wordpress.org/core/2015/02/16/taxonomy-term-splitting-in-4-2-a-developer-guide/ Article explaining the taxonomy term splitting in WP 4.2. + * + * @param string $old_term_id Old term id of the taxonomy term that was splitted. + * @param string $new_term_id New term id of the taxonomy term that was splitted. + * @param string $term_taxonomy_id Term taxonomy id for the taxonomy that was affected. + * @param string $taxonomy The taxonomy that the taxonomy term was splitted for. + * + * @return void + */ +function wpseo_split_shared_term( $old_term_id, $new_term_id, $term_taxonomy_id, $taxonomy ) { + $tax_meta = get_option( 'wpseo_taxonomy_meta', [] ); + + if ( ! empty( $tax_meta[ $taxonomy ][ $old_term_id ] ) ) { + $tax_meta[ $taxonomy ][ $new_term_id ] = $tax_meta[ $taxonomy ][ $old_term_id ]; + unset( $tax_meta[ $taxonomy ][ $old_term_id ] ); + update_option( 'wpseo_taxonomy_meta', $tax_meta ); + } +} + +add_action( 'split_shared_term', 'wpseo_split_shared_term', 10, 4 ); + +/** + * Get all WPSEO related capabilities. + * + * @since 8.3 + * @return array + */ +function wpseo_get_capabilities() { + if ( ! did_action( 'wpseo_register_capabilities' ) ) { + do_action( 'wpseo_register_capabilities' ); + } + return WPSEO_Capability_Manager_Factory::get()->get_capabilities(); +} diff --git a/wp-content/plugins/wordpress-seo/inc/wpseo-non-ajax-functions.php b/wp-content/plugins/wordpress-seo/inc/wpseo-non-ajax-functions.php new file mode 100644 index 00000000..3563be68 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/inc/wpseo-non-ajax-functions.php @@ -0,0 +1,57 @@ +register_hooks(); +} +add_action( 'wp_loaded', 'wpseo_initialize_admin_bar' ); + +/** + * Allows editing of the meta fields through weblog editors like Marsedit. + * + * @param array $required_capabilities Capabilities that must all be true to allow action. + * @param array $capabilities Array of capabilities to be checked, unused here. + * @param array $args List of arguments for the specific capabilities to be checked. + * + * @return array Filtered capabilities. + */ +function allow_custom_field_edits( $required_capabilities, $capabilities, $args ) { + if ( ! in_array( $args[0], [ 'edit_post_meta', 'add_post_meta' ], true ) ) { + return $required_capabilities; + } + + // If this is provided, it is the post ID. + if ( empty( $args[2] ) ) { + return $required_capabilities; + } + + // If this is provided, it is the custom field. + if ( empty( $args[3] ) ) { + return $required_capabilities; + } + + // If the meta key is part of the plugin, grant capabilities accordingly. + if ( strpos( $args[3], WPSEO_Meta::$meta_prefix ) === 0 && current_user_can( 'edit_post', $args[2] ) ) { + $required_capabilities[ $args[0] ] = true; + } + + return $required_capabilities; +} + +add_filter( 'user_has_cap', 'allow_custom_field_edits', 0, 3 ); diff --git a/wp-content/plugins/wordpress-seo/index.php b/wp-content/plugins/wordpress-seo/index.php new file mode 100644 index 00000000..e94d9a42 --- /dev/null +++ b/wp-content/plugins/wordpress-seo/index.php @@ -0,0 +1,4 @@ +{"use strict";var e={n:t=>{var s=t&&t.__esModule?()=>t.default:()=>t;return e.d(s,{a:s}),s},d:(t,s)=>{for(var a in s)e.o(s,a)&&!e.o(t,a)&&Object.defineProperty(t,a,{enumerable:!0,get:s[a]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const t=window.React,s=window.wp.components,a=window.wp.data,r=window.wp.domReady;var i=e.n(r);const o=window.wp.element,n=window.yoast.uiLibrary,l=window.lodash,d=window.yoast.reduxJsToolkit,c=window.wp.url,u="linkParams",y=(0,d.createSlice)({name:u,initialState:{},reducers:{setLinkParams:(e,{payload:t})=>t}}),p=y.getInitialState,m={selectLinkParam:(e,t,s={})=>(0,l.get)(e,`${u}.${t}`,s),selectLinkParams:e=>(0,l.get)(e,u,{})};m.selectLink=(0,d.createSelector)([m.selectLinkParams,(e,t)=>t,(e,t,s={})=>s],((e,t,s)=>(0,c.addQueryArgs)(t,{...e,...s})));const g=y.actions,h=y.reducer,w=(0,d.createSlice)({name:"notifications",initialState:{},reducers:{addNotification:{reducer:(e,{payload:t})=>{e[t.id]={id:t.id,variant:t.variant,size:t.size,title:t.title,description:t.description}},prepare:({id:e,variant:t="info",size:s="default",title:a,description:r})=>({payload:{id:e||(0,d.nanoid)(),variant:t,size:s,title:a||"",description:r}})},removeNotification:(e,{payload:t})=>(0,l.omit)(e,t)}}),f=(w.getInitialState,w.actions,w.reducer,"pluginUrl"),k=(0,d.createSlice)({name:f,initialState:"",reducers:{setPluginUrl:(e,{payload:t})=>t}}),_=(k.getInitialState,{selectPluginUrl:e=>(0,l.get)(e,f,"")});_.selectImageLink=(0,d.createSelector)([_.selectPluginUrl,(e,t,s="images")=>s,(e,t)=>t],((e,t,s)=>[(0,l.trimEnd)(e,"/"),(0,l.trim)(t,"/"),(0,l.trimStart)(s,"/")].join("/"))),k.actions,k.reducer,window.wp.apiFetch;const E="wistiaEmbedPermission",b=(0,d.createSlice)({name:E,initialState:{value:!1,status:"idle",error:{}},reducers:{setWistiaEmbedPermissionValue:(e,{payload:t})=>{e.value=Boolean(t)}},extraReducers:e=>{e.addCase(`${E}/request`,(e=>{e.status="loading"})),e.addCase(`${E}/success`,((e,{payload:t})=>{e.status="success",e.value=Boolean(t&&t.value)})),e.addCase(`${E}/error`,((e,{payload:t})=>{e.status="error",e.value=Boolean(t&&t.value),e.error={code:(0,l.get)(t,"error.code",500),message:(0,l.get)(t,"error.message","Unknown")}}))}});b.getInitialState,b.actions,b.reducer;const v=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z"}))})),S=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"}))})),L=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{fillRule:"evenodd",d:"M10.293 5.293a1 1 0 011.414 0l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414-1.414L12.586 11H5a1 1 0 110-2h7.586l-2.293-2.293a1 1 0 010-1.414z",clipRule:"evenodd"}))})),P=window.wp.i18n,A="@yoast/academy",O=(e,t=[],...s)=>(0,a.useSelect)((t=>{var a,r;return null===(a=(r=t(A))[e])||void 0===a?void 0:a.call(r,...s)}),t),x=(e,t)=>!(!(0,l.isEmpty)(e)&&!t)||Object.values(e).every((e=>!0===e)),I=()=>{const e=O("selectLinkParams"),s=O("selectPreference",[],"pluginUrl",""),a=O("selectPreference",[],"isPremium",""),r=O("selectPreference",[],"isWooActive",""),i=O("selectPreference",[],"isLocalActive",""),d=O("selectUpsellSettingsAsProps"),u=(0,n.useSvgAria)(),y=(0,o.useMemo)((()=>[{id:"ai_for_seo",title:"AI for SEO",description:(0,P.__)("Join the Yoast team to learn how to harness the power of AI to revolutionize your SEO approach. Gain a competitive edge, future-proof your keyword strategies, and soar to the top of search rankings – all designed to empower busy small business owners.","wordpress-seo"),image:`${s}/images/academy/ai_for_seo_icon_my_yoast.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/ai-for-seo-start",e),upsellLink:(0,c.addQueryArgs)("https://yoa.st/ai-for-seo-unlock",e),dependencies:{PREMIUM:a},hasTrial:!0},{id:"seo_for_beginners",title:"SEO for beginners",description:(0,P.__)("In this free course, you'll get quick wins to make your site rank higher in Google, Bing, and Yahoo.","wordpress-seo"),image:`${s}/images/academy/seo_for_beginners.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-seo-beginners-start",e),dependencies:{},hasTrial:!0},{id:"seo_for_wp",title:"Yoast SEO for WordPress (block editor)",description:(0,P.sprintf)(/* translators: %1$s expands to Yoast SEO. */ +(0,P.__)("In this course, you'll learn about how to set up and use the %1$s for WordPress plugin so it makes SEO even easier. This course is meant for users of the block editor.","wordpress-seo"),"Yoast SEO"),image:`${s}/images/academy/seo_for_wp.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-seo-wordpress-block-editor-start",e),dependencies:{},hasTrial:!0},{id:"all_around_seo",title:"All-around SEO",description:(0,P.__)("In this course, you'll learn practical SEO skills on every key aspect of SEO, to make your site stand out.","wordpress-seo"),image:`${s}/images/academy/all_around_seo.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-all-around-seo-start",e),upsellLink:(0,c.addQueryArgs)("https://yoa.st/academy-all-around-seo-unlock",e),dependencies:{PREMIUM:a},hasTrial:!0},{id:"wp_for_beginners",title:"WordPress for beginners",description:(0,P.__)("Do you want to set up your own WordPress site? This course will teach you the ins and outs of creating and maintaining a WordPress website!","wordpress-seo"),image:`${s}/images/academy/wp_for_beginners.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-wordpress-beginners-start",e),dependencies:{},hasTrial:!0},{id:"copywriting",title:"SEO copywriting",description:(0,P.__)("In this course, you'll learn how to write awesome copy that is optimized for ranking in search engines.","wordpress-seo"),image:`${s}/images/academy/copywriting.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-seo-copywriting-start",e),upsellLink:(0,c.addQueryArgs)("https://yoa.st/academy-seo-copywriting-unlock",e),dependencies:{PREMIUM:a},hasTrial:!0},{id:"structured_data_for_beginners",title:"Structured data for beginners",description:(0,P.__)("Learn how to make your site stand out from the crowd by adding structured data!","wordpress-seo"),image:`${s}/images/academy/structured_data_for_beginners.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-structured-data-beginners-start",e),dependencies:{},hasTrial:!0},{id:"keyword_research",title:"Keyword research",description:(0,P.__)("Do you know the essential first step of good SEO? It's keyword research. In this training, you'll learn how to research and select the keywords that will guide searchers to your pages.","wordpress-seo"),image:`${s}/images/academy/keyword_research.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-keyword-research-start",e),upsellLink:(0,c.addQueryArgs)("https://yoa.st/academy-keyword-research-unlock",e),dependencies:{PREMIUM:a},hasTrial:!0},{id:"block_editor",title:"Block editor training",description:(0,P.__)("Start creating block-tastic content with the new WordPress block editor! Learn all about the block editor and what you can do with it.","wordpress-seo"),image:`${s}/images/academy/block_editor.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-block-editor-start",e),dependencies:{},hasTrial:!0},{id:"site_structure",title:"Site structure",description:(0,P.__)("A clear site structure benefits your users and is of great importance for SEO. Still, most people seem to forget about this. Get ahead of your competition and learn how to improve your site structure!","wordpress-seo"),image:`${s}/images/academy/site_structure.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-site-structure-start",e),upsellLink:(0,c.addQueryArgs)("https://yoa.st/academy-site-structure-unlock",e),dependencies:{PREMIUM:a},hasTrial:!0},{id:"local",title:"Local SEO",description:(0,P.__)("Do you own a local business? This course will teach you how to make sure your local audience can find you in the search results and on Google Maps!","wordpress-seo"),image:`${s}/images/academy/local.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-local-seo-start",e),upsellLink:(0,c.addQueryArgs)("https://yoa.st/academy-local-seo-unlock",e),dependencies:{LOCAL:i},hasTrial:!0},{id:"ecommerce",title:"Ecommerce SEO",description:(0,P.__)("Learn how to optimize your online shop for your customers and for search engines!","wordpress-seo"),image:`${s}/images/academy/ecommerce.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-ecommerce-seo-start",e),upsellLink:(0,c.addQueryArgs)("https://yoa.st/academy-ecommerce-seo-unlock",e),dependencies:{WOO:r},hasTrial:!0},{id:"understanding_structured_data",title:"Understanding structured data",description:(0,P.__)("Do you want to take a deep dive into structured data? In this course, you'll learn the theory related to structured data in detail.","wordpress-seo"),image:`${s}/images/academy/understanding_structured_data.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-understanding-structured-data-start",e),upsellLink:(0,c.addQueryArgs)("https://yoa.st/academy-understanding-structured-data-unlock",e),dependencies:{PREMIUM:a},hasTrial:!1},{id:"multilingual",title:"International SEO",description:(0,P.__)("Are you selling in countries all over the world? In this course, you’ll learn all about setting up and managing a site that targets people in different languages and locales.","wordpress-seo"),image:`${s}/images/academy/multilingual.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-international-seo-start",e),upsellLink:(0,c.addQueryArgs)("https://yoa.st/academy-international-seo-unlock",e),dependencies:{PREMIUM:a},hasTrial:!0},{id:"crawlability",title:"Technical SEO: Crawlability and indexability",description:(0,P.__)("You have to make it possible for search engines to find your site, so they can display it in the search results. We'll tell you all about how that works in this course!","wordpress-seo"),image:`${s}/images/academy/crawlability.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-technical-seo-crawlability-indexability-start",e),upsellLink:(0,c.addQueryArgs)("https://yoa.st/academy-technical-seo-crawlability-indexability-unlock",e),dependencies:{PREMIUM:a},hasTrial:!0},{id:"hosting_and_server",title:"Technical SEO: Hosting and server configuration",description:(0,P.__)("Choosing the right type of hosting for your site is the basis of a solid Technical SEO strategy. Learn all about it in this course!","wordpress-seo"),image:`${s}/images/academy/hosting_and_server.png`,startLink:(0,c.addQueryArgs)("https://yoa.st/academy-technical-seo-hosting-server-configuration-start",e),upsellLink:(0,c.addQueryArgs)("https://yoa.st/academy-technical-seo-hosting-server-configuration-unlock",e),dependencies:{PREMIUM:a},hasTrial:!1}]),[e]);return(0,t.createElement)("div",{className:"yst-p-4 min-[783px]:yst-p-8 yst-mb-8 xl:yst-mb-0"},(0,t.createElement)(n.Paper,{as:"main"},(0,t.createElement)("header",{className:"yst-p-8 yst-border-b yst-border-slate-200"},(0,t.createElement)("div",{className:"yst-max-w-screen-sm"},(0,t.createElement)(n.Title,null,(0,P.__)("Academy","wordpress-seo")),(0,t.createElement)("p",{className:"yst-text-tiny yst-mt-3"},a&&(0,P.sprintf)( +// translators: %s for Yoast SEO Premium. +(0,P.__)("Learn vital SEO skills that you can apply at once! Let us take you by the hand and give you practical SEO tips to help you outrank your competitors. Maximize your SEO game! Because your %s subscription gives you unlimited access to all courses.","wordpress-seo"),"Yoast SEO Premium"),!a&&(0,t.createElement)(t.Fragment,null,(0,P.sprintf)( +// translators: %s for Yoast SEO. +(0,P.__)("Learn vital SEO skills that you can apply at once! Let us take you by the hand and give you practical SEO tips to help you outrank your competitors. %s comes with five free courses.","wordpress-seo"),"Yoast SEO")," ",(0,t.createElement)(n.Link,{href:(0,c.addQueryArgs)("https://yoa.st/academy-page-upsell/",e),target:"_blank",...d},(0,P.sprintf)( +// translators: %s for Yoast SEO Premium. +(0,P.__)("Maximize your SEO game by purchasing %s, which grants you unlimited access to all courses.","wordpress-seo"),"Yoast SEO Premium")))))),(0,t.createElement)("div",{className:"yst-h-full yst-p-8"},(0,t.createElement)("div",{className:"yst-max-w-6xl yst-grid yst-gap-6 yst-grid-cols-1 sm:yst-grid-cols-2 min-[783px]:yst-grid-cols-1 lg:yst-grid-cols-2 xl:yst-grid-cols-4"},y.map((e=>(0,t.createElement)(n.Card,{key:`card-course-${e.id}`},(0,t.createElement)(n.Card.Header,{className:"yst-h-auto yst-p-0"},(0,t.createElement)("img",{className:"yst-w-full yst-transition yst-duration-200",src:e.image,alt:"",width:500,height:250,loading:"lazy",decoding:"async"}),((e,t)=>!(0,l.isEmpty)(e)&&(t||e.WOO||e.LOCAL))(e.dependencies,a)&&(0,t.createElement)("div",{className:"yst-absolute yst-top-2 yst-right-2 yst-flex yst-gap-1.5"},(0,t.createElement)(n.Badge,{size:"small",variant:"upsell"},(0,P.__)("Premium","wordpress-seo")))),(0,t.createElement)(n.Card.Content,{className:"yst-flex yst-flex-col yst-gap-3"},(0,t.createElement)(n.Title,{as:"h3"},e.title),e.description,!x(e.dependencies,a)&&(0,t.createElement)(n.Link,{href:e.startLink,className:"yst-flex yst-items-center yst-mt-3 yst-no-underline yst-font-medium yst-text-primary-500",target:"_blank"},(0,P.__)("Start free trial lesson","wordpress-seo"),(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */ +(0,P.__)("(Opens in a new browser tab)","wordpress-seo")),(0,t.createElement)(L,{className:"yst-h-4 yst-w-4 yst-ml-1 yst-icon-rtl"}))),(0,t.createElement)(n.Card.Footer,null,(0,t.createElement)(t.Fragment,null,!x(e.dependencies,a)&&(0,t.createElement)(n.Button,{as:"a",id:`button-get-course-${e.id}`,className:"yst-gap-2 yst-w-full yst-px-2",variant:"upsell",href:null==e?void 0:e.upsellLink,target:"_blank",rel:"noopener",...d},(0,t.createElement)(v,{className:"yst-w-5 yst-h-5 yst--ml-1 yst-shrink-0",...u}),(0,P.sprintf)(/* translators: %1$s expands to Premium. */ +(0,P.__)("Unlock with %1$s","wordpress-seo"),"Premium")),x(e.dependencies,a)&&(0,t.createElement)(n.Button,{as:"a",id:`button-start-course-${e.id}`,className:"yst-gap-2 yst-w-full yst-px-2 yst-leading-5",variant:"primary",href:e.startLink,target:"_blank",rel:"noopener"},(0,P.__)("Start the course","wordpress-seo"),(0,t.createElement)(S,{className:"yst--mr-1 yst-ml-1 yst-h-5 yst-w-5 yst-text-white"})))))))))))},Q=()=>({...(0,l.get)(window,"wpseoScriptData.preferences",{})}),$=(0,d.createSlice)({name:"preferences",initialState:Q(),reducers:{}}),M={selectPreference:(e,t,s={})=>(0,l.get)(e,`preferences.${t}`,s),selectPreferences:e=>(0,l.get)(e,"preferences",{})};M.selectUpsellSettingsAsProps=(0,d.createSelector)([e=>M.selectPreference(e,"upsellSettings",{}),(e,t="premiumCtbId")=>t],((e,t)=>({"data-action":null==e?void 0:e.actionId,"data-ctb-id":null==e?void 0:e[t]})));const T=$.actions,R=$.reducer;i()((()=>{const e=document.getElementById("yoast-seo-academy");if(!e)return;(({initialState:e={}}={})=>{(0,a.register)((({initialState:e})=>(0,a.createReduxStore)(A,{actions:{...g,...T},selectors:{...m,...M},initialState:(0,l.merge)({},{[u]:p(),preferences:Q()},e),reducer:(0,a.combineReducers)({[u]:h,preferences:R})}))({initialState:e}))})({initialState:{[u]:(0,l.get)(window,"wpseoScriptData.linkParams",{})}}),(()=>{const e=document.getElementById("wpcontent"),t=document.getElementById("adminmenuwrap");e&&t&&(e.style.minHeight=`${t.offsetHeight}px`)})();const r=(0,a.select)(A).selectPreference("isRtl",!1);(0,o.render)((0,t.createElement)(n.Root,{context:{isRtl:r}},(0,t.createElement)(s.SlotFillProvider,null,(0,t.createElement)(I,null))),e)}))})(); \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/js/dist/addon-installation.js b/wp-content/plugins/wordpress-seo/js/dist/addon-installation.js new file mode 100644 index 00000000..2503cf3a --- /dev/null +++ b/wp-content/plugins/wordpress-seo/js/dist/addon-installation.js @@ -0,0 +1,7 @@ +(()=>{"use strict";var e={n:n=>{var t=n&&n.__esModule?()=>n.default:()=>n;return e.d(t,{a:t}),t},d:(n,t)=>{for(var o in t)e.o(t,o)&&!e.o(n,o)&&Object.defineProperty(n,o,{enumerable:!0,get:t[o]})},o:(e,n)=>Object.prototype.hasOwnProperty.call(e,n)};const n=window.React,t=window.wp.element,o=window.yoast.propTypes;var a=e.n(o);const s=window.yoast.componentsNew,l=window.wp.i18n,i=window.yoast.styledComponents;var r=e.n(i);const d=window.wp.components,c=e=>{const{title:t,className:o,showYoastIcon:a,additionalClassName:s,...l}=e,i=a?(0,n.createElement)("span",{className:"yoast-icon"}):null;return(0,n.createElement)(d.Modal,{title:t,className:`${o} ${s}`,icon:i,...l},e.children)};c.propTypes={title:a().string,className:a().string,showYoastIcon:a().bool,children:a().oneOfType([a().node,a().arrayOf(a().node)]),additionalClassName:a().string},c.defaultProps={title:"Yoast SEO",className:"yoast yoast-gutenberg-modal",showYoastIcon:!0,children:null,additionalClassName:""};const p=c;var m,w;function u(){return u=Object.assign?Object.assign.bind():function(e){for(var n=1;nn.createElement("svg",u({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 425 456.27"},e),m||(m=n.createElement("path",{d:"M73 405.26a66.79 66.79 0 0 1-6.54-1.7 64.75 64.75 0 0 1-6.28-2.31c-1-.42-2-.89-3-1.37-1.49-.72-3-1.56-4.77-2.56-1.5-.88-2.71-1.64-3.83-2.39-.9-.61-1.8-1.26-2.68-1.92a70.154 70.154 0 0 1-5.08-4.19 69.21 69.21 0 0 1-8.4-9.17c-.92-1.2-1.68-2.25-2.35-3.24a70.747 70.747 0 0 1-3.44-5.64 68.29 68.29 0 0 1-8.29-32.55V142.13a68.26 68.26 0 0 1 8.29-32.55c1-1.92 2.21-3.82 3.44-5.64s2.55-3.58 4-5.27a69.26 69.26 0 0 1 14.49-13.25C50.37 84.19 52.27 83 54.2 82A67.59 67.59 0 0 1 73 75.09a68.75 68.75 0 0 1 13.75-1.39h169.66L263 55.39H86.75A86.84 86.84 0 0 0 0 142.13v196.09A86.84 86.84 0 0 0 86.75 425h11.32v-18.35H86.75A68.75 68.75 0 0 1 73 405.26zM368.55 60.85l-1.41-.53-6.41 17.18 1.41.53a68.06 68.06 0 0 1 8.66 4c1.93 1 3.82 2.2 5.65 3.43A69.19 69.19 0 0 1 391 98.67c1.4 1.68 2.72 3.46 3.95 5.27s2.39 3.72 3.44 5.64a68.29 68.29 0 0 1 8.29 32.55v264.52H233.55l-.44.76c-3.07 5.37-6.26 10.48-9.49 15.19L222 425h203V142.13a87.2 87.2 0 0 0-56.45-81.28z"})),w||(w=n.createElement("path",{stroke:"#000",strokeMiterlimit:10,strokeWidth:3.81,d:"M119.8 408.28v46c28.49-1.12 50.73-10.6 69.61-29.58 19.45-19.55 36.17-50 52.61-96L363.94 1.9H305l-98.25 272.89-48.86-153h-54l71.7 184.18a75.67 75.67 0 0 1 0 55.12c-7.3 18.68-20.25 40.66-55.79 47.19z"}))),y=r().div` + display: flex; + justify-content: flex-end; + gap: 8px; +`,f=e=>{const[o,a]=(0,t.useState)(!0);function i(){a(!1)}const r=(0,l.sprintf)(/* translators: %s expands to Yoast */ +(0,l.__)("%s SEO installation","wordpress-seo"),"Yoast");let d,c=(0,l.__)("the following addons","wordpress-seo");return 1===e.addons.length&&(c=e.addons[0]),1!==e.addons.length&&(d=(0,n.createElement)("ul",{className:"ul-disc"},e.addons.map(((e,t)=>(0,n.createElement)("li",{key:"addon-"+t},e))))),o?(0,n.createElement)(p,{title:r,onRequestClose:i,icon:(0,n.createElement)(h,null),isDismissible:!1},(0,n.createElement)("p",null,(0,l.sprintf)(/* translators: %s expands to Yoast SEO Premium */ +(0,l.__)("Please confirm below that you would like to install %s on this site.","wordpress-seo"),c)),d,(0,n.createElement)(y,null,(0,n.createElement)(s.Button,{onClick:i,id:"close-addon-installation-dialog"},(0,l.__)("Cancel","wordpress-seo")),(0,n.createElement)(s.Button,{onClick:function(){window.location.href="admin.php?page=wpseo_licenses&action=install&nonce="+e.nonce},id:"continue-addon-installation-dialog",className:"yoast-button--primary"},(0,l.__)("Install and activate","wordpress-seo")))):null};f.propTypes={nonce:a().string.isRequired,addons:a().array},f.defaultProps={addons:[]};const g=f,v=document.createElement("div");v.setAttribute("id","wpseo-app-element"),document.getElementById("extensions").append(v),(0,t.render)((0,n.createElement)(g,{nonce:wpseoAddonInstallationL10n.nonce,addons:wpseoAddonInstallationL10n.addons}),v)})(); \ No newline at end of file diff --git a/wp-content/plugins/wordpress-seo/js/dist/admin-global.js b/wp-content/plugins/wordpress-seo/js/dist/admin-global.js new file mode 100644 index 00000000..cd015e9a --- /dev/null +++ b/wp-content/plugins/wordpress-seo/js/dist/admin-global.js @@ -0,0 +1 @@ +(()=>{"use strict";var t={n:o=>{var a=o&&o.__esModule?()=>o.default:()=>o;return t.d(a,{a}),a},d:(o,a)=>{for(var e in a)t.o(a,e)&&!t.o(o,e)&&Object.defineProperty(o,e,{enumerable:!0,get:a[e]})},o:(t,o)=>Object.prototype.hasOwnProperty.call(t,o)};const o=window.jQuery;var a=t.n(o);!function(t){function o(t,o,e){const s=new FormData,n={action:"wpseo_set_ignore",option:t,_wpnonce:e};for(const[t,o]of Object.entries(n))s.append(t,o);return fetch(ajaxurl,{method:"POST",body:s}).then((e=>(e&&(a()("#"+o).hide(),a()("#hidden_ignore_"+t).val("ignore")),e)))}function e(){t("#wp-admin-bar-root-default > li").off("mouseenter.yoastalertpopup mouseleave.yoastalertpopup"),t(".yoast-issue-added").fadeOut(200)}function s(o,a){if(t(".yoast-notification-holder").off("click",".restore").off("click",".dismiss"),void 0!==a.html){a.html&&(o.closest(".yoast-container").html(a.html),n());var e=t("#wp-admin-bar-wpseo-menu"),s=e.find(".yoast-issue-counter");s.length||(e.find("> a:first-child").append('
    '),s=e.find(".yoast-issue-counter")),s.html(a.total),0===a.total?s.hide():s.show(),t("#toplevel_page_wpseo_dashboard .update-plugins").removeClass().addClass("update-plugins count-"+a.total),t("#toplevel_page_wpseo_dashboard .plugin-count").html(a.total)}}function n(){var o=t(".yoast-notification-holder");o.on("click",".dismiss",(function(){var o=t(this),a=o.closest(".yoast-notification-holder");o.closest(".yoast-container").append('
    '),t.post(ajaxurl,{action:"yoast_dismiss_notification",notification:a.attr("id"),nonce:a.data("nonce"),data:o.data("json")||a.data("json")},s.bind(this,a),"json")})),o.on("click",".restore",(function(){var o=t(this),a=o.closest(".yoast-notification-holder");o.closest(".yoast-container").append('
    '),t.post(ajaxurl,{action:"yoast_restore_notification",notification:a.attr("id"),nonce:a.data("nonce"),data:a.data("json")},s.bind(this,a),"json")}))}function i(t){t.is(":hidden")||(t.outerWidth()>t.parent().outerWidth()?(t.data("scrollHint").addClass("yoast-has-scroll"),t.data("scrollContainer").addClass("yoast-has-scroll")):(t.data("scrollHint").removeClass("yoast-has-scroll"),t.data("scrollContainer").removeClass("yoast-has-scroll")))}function l(){window.wpseoScrollableTables=t(".yoast-table-scrollable"),window.wpseoScrollableTables.length&&window.wpseoScrollableTables.each((function(){var o=t(this);if(!o.data("scrollContainer")){var a=t("
    ",{class:"yoast-table-scrollable__hintwrapper",html:"