PluginProbe
Yoast SEO – Advanced SEO with real-time guidance and built-in AI / trunk
Yoast SEO – Advanced SEO with real-time guidance and built-in AI vtrunk
28.5 28.4 28.3 28.2 28.1 28.0 27.9 27.8 27.7 27.6 27.5 trunk 18.0 18.1 18.2 18.3 18.4 18.4.1 18.5 18.5.1 18.6 18.7 18.8 18.9 19.0 All 129 releases
← All changes | inc/options/class-wpseo-option-wpseo.php +270 -81 19.0 → trunk View file →
@@ -25,39 +25,46 @@
25 25 * @var array
26 26 */
27 27 protected $defaults = [
28 28 // Non-form fields, set via (ajax) function.
29 - 'tracking' => null,
30 - 'license_server_version' => false,
31 - 'ms_defaults_set' => false,
32 - 'ignore_search_engines_discouraged_notice' => false,
33 - 'indexing_first_time' => true,
34 - 'indexing_started' => null,
35 - 'indexing_reason' => '',
36 - 'indexables_indexing_completed' => false,
29 + 'tracking' => null,
30 + 'toggled_tracking' => false,
31 + 'license_server_version' => false,
32 + 'ms_defaults_set' => false,
33 + 'ignore_search_engines_discouraged_notice' => false,
34 + 'indexing_first_time' => true,
35 + 'indexing_started' => null,
36 + 'indexing_reason' => '',
37 + 'indexables_indexing_completed' => false,
38 + 'index_now_key' => '',
37 39 // Non-form field, should only be set via validation routine.
38 - 'version' => '', // Leave default as empty to ensure activation/upgrade works.
39 - 'previous_version' => '',
40 + 'version' => '', // Leave default as empty to ensure activation/upgrade works.
41 + 'previous_version' => '',
40 42 // Form fields.
41 - 'disableadvanced_meta' => true,
42 - 'enable_headless_rest_endpoints' => true,
43 - 'ryte_indexability' => true,
44 - 'baiduverify' => '', // Text field.
45 - 'googleverify' => '', // Text field.
46 - 'msverify' => '', // Text field.
47 - 'yandexverify' => '',
48 - 'site_type' => '', // List of options.
49 - 'has_multiple_authors' => '',
50 - 'environment_type' => '',
51 - 'content_analysis_active' => true,
52 - 'keyword_analysis_active' => true,
53 - 'enable_admin_bar_menu' => true,
54 - 'enable_cornerstone_content' => true,
55 - 'enable_xml_sitemap' => true,
56 - 'enable_text_link_counter' => true,
57 - 'show_onboarding_notice' => false,
58 - 'first_activated_on' => false,
59 - 'myyoast-oauth' => [
43 + 'disableadvanced_meta' => true,
44 + 'enable_headless_rest_endpoints' => true,
45 + 'ryte_indexability' => false,
46 + 'baiduverify' => '', // Text field.
47 + 'googleverify' => '', // Text field.
48 + 'msverify' => '', // Text field.
49 + 'yandexverify' => '',
50 + 'ahrefsverify' => '',
51 + 'site_type' => '', // List of options.
52 + 'has_multiple_authors' => '',
53 + 'environment_type' => '',
54 + 'content_analysis_active' => true,
55 + 'keyword_analysis_active' => true,
56 + 'inclusive_language_analysis_active' => false,
57 + 'enable_admin_bar_menu' => true,
58 + 'enable_cornerstone_content' => true,
59 + 'enable_xml_sitemap' => true,
60 + 'enable_text_link_counter' => true,
61 + 'enable_index_now' => true,
62 + 'enable_ai_generator' => true,
63 + 'ai_enabled_pre_default' => false,
64 + 'show_onboarding_notice' => false,
65 + 'first_activated_on' => false,
66 + 'myyoast-oauth' => [
60 67 'config' => [
61 68 'clientId' => null,
62 69 'secret' => null,
63 70 ],
@@ -62,37 +69,96 @@
62 69 'secret' => null,
63 70 ],
64 71 'access_tokens' => [],
65 72 ],
66 - 'semrush_integration_active' => true,
67 - 'semrush_tokens' => [],
68 - 'semrush_country_code' => 'us',
69 - 'permalink_structure' => '',
70 - 'home_url' => '',
71 - 'dynamic_permalinks' => false,
72 - 'category_base_url' => '',
73 - 'tag_base_url' => '',
74 - 'custom_taxonomy_slugs' => [],
75 - 'enable_enhanced_slack_sharing' => true,
76 - 'zapier_integration_active' => false,
77 - 'zapier_subscription' => [],
78 - 'zapier_api_key' => '',
79 - 'enable_metabox_insights' => true,
80 - 'enable_link_suggestions' => true,
81 - 'algolia_integration_active' => false,
82 - 'import_cursors' => [],
83 - 'workouts_data' => [ 'configuration' => [ 'finishedSteps' => [] ] ],
84 - 'configuration_finished_steps' => [],
85 - 'dismiss_configuration_workout_notice' => false,
86 - 'importing_completed' => [],
87 - 'wincher_integration_active' => true,
88 - 'wincher_tokens' => [],
89 - 'wincher_automatically_add_keyphrases' => false,
90 - 'wincher_website_id' => '',
91 - 'first_time_install' => false,
92 - 'should_redirect_after_install_free' => false,
93 - 'activation_redirect_timestamp_free' => 0,
94 - 'remove_feed_post_comments' => false,
73 + 'semrush_integration_active' => true,
74 + 'semrush_tokens' => [],
75 + 'semrush_country_code' => 'us',
76 + 'permalink_structure' => '',
77 + 'home_url' => '',
78 + 'dynamic_permalinks' => false,
79 + 'category_base_url' => '',
80 + 'tag_base_url' => '',
81 + 'custom_taxonomy_slugs' => [],
82 + 'enable_enhanced_slack_sharing' => true,
83 + 'enable_metabox_insights' => true,
84 + 'enable_link_suggestions' => true,
85 + 'algolia_integration_active' => false,
86 + 'import_cursors' => [],
87 + 'workouts_data' => [ 'configuration' => [ 'finishedSteps' => [] ] ],
88 + 'configuration_finished_steps' => [],
89 + 'dismiss_configuration_workout_notice' => false,
90 + 'dismiss_premium_deactivated_notice' => false,
91 + 'importing_completed' => [],
92 + 'wincher_integration_active' => true,
93 + 'wincher_tokens' => [],
94 + 'wincher_automatically_add_keyphrases' => false,
95 + 'wincher_website_id' => '',
96 + 'first_time_install' => false,
97 + 'should_redirect_after_install_free' => false,
98 + 'activation_redirect_timestamp_free' => 0,
99 + 'remove_feed_global' => false,
100 + 'remove_feed_global_comments' => false,
101 + 'remove_feed_post_comments' => false,
102 + 'remove_feed_authors' => false,
103 + 'remove_feed_categories' => false,
104 + 'remove_feed_tags' => false,
105 + 'remove_feed_custom_taxonomies' => false,
106 + 'remove_feed_post_types' => false,
107 + 'remove_feed_search' => false,
108 + 'remove_atom_rdf_feeds' => false,
109 + 'remove_shortlinks' => false,
110 + 'remove_rest_api_links' => false,
111 + 'remove_rsd_wlw_links' => false,
112 + 'remove_oembed_links' => false,
113 + 'remove_generator' => false,
114 + 'remove_emoji_scripts' => false,
115 + 'remove_powered_by_header' => false,
116 + 'remove_pingback_header' => false,
117 + 'clean_campaign_tracking_urls' => false,
118 + 'clean_permalinks' => false,
119 + 'clean_permalinks_extra_variables' => '',
120 + 'search_cleanup' => false,
121 + 'search_cleanup_emoji' => false,
122 + 'search_cleanup_patterns' => false,
123 + 'search_character_limit' => 50,
124 + 'deny_search_crawling' => false,
125 + 'deny_wp_json_crawling' => false,
126 + 'deny_adsbot_crawling' => false,
127 + 'deny_ccbot_crawling' => false,
128 + 'deny_google_extended_crawling' => false,
129 + 'deny_gptbot_crawling' => false,
130 + 'redirect_search_pretty_urls' => false,
131 + 'least_readability_ignore_list' => [],
132 + 'least_seo_score_ignore_list' => [],
133 + 'most_linked_ignore_list' => [],
134 + 'least_linked_ignore_list' => [],
135 + 'indexables_page_reading_list' => [ false, false, false, false, false ],
136 + 'indexables_overview_state' => 'dashboard-not-visited',
137 + 'last_known_public_post_types' => [],
138 + 'last_known_public_taxonomies' => [],
139 + 'last_known_no_unindexed' => [],
140 + 'new_post_types' => [],
141 + 'new_taxonomies' => [],
142 + 'show_new_content_type_notification' => false,
143 + 'site_kit_configuration_permanently_dismissed' => false,
144 + 'site_kit_connected' => false,
145 + 'site_kit_tracking_setup_widget_loaded' => 'no',
146 + 'site_kit_tracking_first_interaction_stage' => '',
147 + 'site_kit_tracking_last_interaction_stage' => '',
148 + 'site_kit_tracking_setup_widget_temporarily_dismissed' => 'no',
149 + 'site_kit_tracking_setup_widget_permanently_dismissed' => 'no',
150 + 'google_site_kit_feature_enabled' => false, // No longer used.
151 + 'ai_free_sparks_started_on' => null,
152 + 'enable_llms_txt' => false,
153 + 'last_updated_on' => false,
154 + 'default_seo_title' => [],
155 + 'default_seo_meta_desc' => [],
156 + 'first_activated_by' => 0,
157 + 'enable_schema_aggregation_endpoint' => false,
158 + 'schema_aggregation_endpoint_enabled_on' => null,
159 + 'enable_task_list' => true,
160 + 'enable_schema' => true,
95 161 ];
96 162
97 163 /**
98 164 * Sub-options which should not be overloaded with multi-site defaults.
@@ -105,8 +171,9 @@
105 171 'baiduverify',
106 172 'googleverify',
107 173 'msverify',
108 174 'yandexverify',
175 + 'ahrefsverify',
109 176 ];
110 177
111 178 /**
112 179 * Possible values for the site_type option.
@@ -129,8 +196,9 @@
129 196 * @var array
130 197 */
131 198 protected $environment_types = [
132 199 '',
200 + 'local',
133 201 'production',
134 202 'staging',
135 203 'development',
136 204 ];
@@ -165,9 +233,9 @@
165 233
166 234 /**
167 235 * Filter: 'wpseo_enable_tracking' - Enables the data tracking of Yoast SEO Premium.
168 236 *
169 - * @api string $is_enabled The enabled state. Default is false.
237 + * @param string|false $is_enabled The enabled state. Default is false.
170 238 */
171 239 $this->defaults['tracking'] = apply_filters( 'wpseo_enable_tracking', false );
172 240
173 241 /* Clear the cache on update/add. */
@@ -274,15 +342,24 @@
274 342 case 'previous_version':
275 343 case 'semrush_country_code':
276 344 case 'license_server_version':
277 345 case 'home_url':
278 - case 'zapier_api_key':
346 + case 'index_now_key':
279 347 case 'wincher_website_id':
348 + case 'clean_permalinks_extra_variables':
349 + case 'indexables_overview_state':
280 350 if ( isset( $dirty[ $key ] ) ) {
281 351 $clean[ $key ] = $dirty[ $key ];
282 352 }
283 353 break;
284 354 case 'indexing_reason':
355 + case 'site_kit_tracking_setup_widget_loaded':
356 + case 'site_kit_tracking_first_interaction_stage':
357 + case 'site_kit_tracking_last_interaction_stage':
358 + case 'site_kit_tracking_setup_widget_temporarily_dismissed':
359 + case 'site_kit_tracking_setup_widget_permanently_dismissed':
360 + case 'ai_free_sparks_started_on':
361 + case 'schema_aggregation_endpoint_enabled_on':
285 362 if ( isset( $dirty[ $key ] ) ) {
286 363 $clean[ $key ] = sanitize_text_field( $dirty[ $key ] );
287 364 }
288 365 break;
@@ -291,8 +368,9 @@
291 368 case 'baiduverify':
292 369 case 'googleverify':
293 370 case 'msverify':
294 371 case 'yandexverify':
372 + case 'ahrefsverify':
295 373 $this->validate_verification_string( $key, $dirty, $old, $clean );
296 374 break;
297 375
298 376 /*
@@ -333,8 +411,9 @@
333 411
334 412 case 'first_activated_on':
335 413 case 'indexing_started':
336 414 case 'activation_redirect_timestamp_free':
415 + case 'last_updated_on':
337 416 $clean[ $key ] = false;
338 417 if ( isset( $dirty[ $key ] ) ) {
339 418 if ( $dirty[ $key ] === false || WPSEO_Utils::validate_int( $dirty[ $key ] ) ) {
340 419 $clean[ $key ] = $dirty[ $key ];
@@ -341,8 +420,18 @@
341 420 }
342 421 }
343 422 break;
344 423
424 + case 'first_activated_by':
425 + // A slight change from the other integer fields, as we want to allow '0' here, but don't want to have much impact elsewhere.
426 + $clean[ $key ] = false;
427 + if ( isset( $dirty[ $key ] ) ) {
428 + if ( $dirty[ $key ] === false || WPSEO_Utils::validate_int( $dirty[ $key ] ) !== false ) {
429 + $clean[ $key ] = $dirty[ $key ];
430 + }
431 + }
432 + break;
433 +
345 434 case 'tracking':
346 435 $clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : null );
347 436 break;
348 437
@@ -348,12 +437,22 @@
348 437
349 438 case 'myyoast_oauth':
350 439 case 'semrush_tokens':
351 440 case 'custom_taxonomy_slugs':
352 - case 'zapier_subscription':
353 441 case 'wincher_tokens':
354 442 case 'workouts_data':
355 443 case 'configuration_finished_steps':
444 + case 'least_readability_ignore_list':
445 + case 'least_seo_score_ignore_list':
446 + case 'most_linked_ignore_list':
447 + case 'least_linked_ignore_list':
448 + case 'indexables_page_reading_list':
449 + case 'last_known_public_post_types':
450 + case 'last_known_public_taxonomies':
451 + case 'new_post_types':
452 + case 'new_taxonomies':
453 + case 'default_seo_title':
454 + case 'default_seo_meta_desc':
356 455 $clean[ $key ] = $old[ $key ];
357 456
358 457 if ( isset( $dirty[ $key ] ) ) {
359 458 $items = $dirty[ $key ];
@@ -375,8 +474,14 @@
375 474 $clean[ $key ] = sanitize_option( $key, $dirty[ $key ] );
376 475 }
377 476 break;
378 477
478 + case 'search_character_limit':
479 + if ( isset( $dirty[ $key ] ) ) {
480 + $clean[ $key ] = (int) $dirty[ $key ];
481 + }
482 + break;
483 +
379 484 case 'import_cursors':
380 485 case 'importing_completed':
381 486 if ( isset( $dirty[ $key ] ) && is_array( $dirty[ $key ] ) ) {
382 487 $clean[ $key ] = $dirty[ $key ];
@@ -382,13 +487,29 @@
382 487 $clean[ $key ] = $dirty[ $key ];
383 488 }
384 489 break;
385 490
491 + case 'last_known_no_unindexed':
492 + $clean[ $key ] = $old[ $key ];
493 +
494 + if ( isset( $dirty[ $key ] ) ) {
495 + $items = $dirty[ $key ];
496 +
497 + if ( is_array( $items ) ) {
498 + foreach ( $items as $item_key => $item ) {
499 + if ( ! is_string( $item_key ) || ! is_numeric( $item ) ) {
500 + unset( $items[ $item_key ] );
501 + }
502 + }
503 + $clean[ $key ] = $items;
504 + }
505 + }
506 +
507 + break;
508 +
386 509 /*
387 510 * Boolean (checkbox) fields.
388 - */
389 -
390 - /*
511 + *
391 512 * Covers:
392 513 * 'disableadvanced_meta'
393 514 * 'enable_headless_rest_endpoints'
394 515 * 'yoast_tracking'
@@ -394,10 +515,47 @@
394 515 * 'yoast_tracking'
395 516 * 'dynamic_permalinks'
396 517 * 'indexing_first_time'
397 518 * 'first_time_install'
519 + * 'remove_feed_global'
520 + * 'remove_feed_global_comments'
398 521 * 'remove_feed_post_comments'
522 + * 'remove_feed_authors'
523 + * 'remove_feed_categories'
524 + * 'remove_feed_tags'
525 + * 'remove_feed_custom_taxonomies'
526 + * 'remove_feed_post_types'
527 + * 'remove_feed_search'
528 + * 'remove_atom_rdf_feeds'
529 + * 'remove_shortlinks'
530 + * 'remove_rest_api_links'
531 + * 'remove_rsd_wlw_links'
532 + * 'remove_oembed_links'
533 + * 'remove_generator'
534 + * 'remove_emoji_scripts'
535 + * 'remove_powered_by_header'
536 + * 'remove_pingback_header'
537 + * 'clean_campaign_tracking_urls'
538 + * 'clean_permalinks'
539 + * 'clean_permalinks_extra_variables'
540 + * 'search_cleanup'
541 + * 'search_cleanup_emoji'
542 + * 'search_cleanup_patterns'
543 + * 'deny_wp_json_crawling'
544 + * 'deny_adsbot_crawling'
545 + * 'deny_ccbot_crawling'
546 + * 'deny_google_extended_crawling'
547 + * 'deny_gptbot_crawling'
548 + * 'redirect_search_pretty_urls'
399 549 * 'should_redirect_after_install_free'
550 + * 'show_new_content_type_notification'
551 + * 'site_kit_configuration_permanently_dismissed',
552 + * 'site_kit_connected',
553 + * 'google_site_kit_feature_enabled',
554 + * 'enable_llms_txt',
555 + * 'enable_schema_aggregation_endpoint'
556 + * 'enable_task_list',
557 + * 'enable_schema',
400 558 * and most of the feature variables.
401 559 */
402 560 default:
403 561 $clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : false );
@@ -421,25 +579,56 @@
421 579 }
422 580
423 581 // For the feature variables, set their values to off in case they are disabled.
424 582 $feature_vars = [
425 - 'disableadvanced_meta' => false,
426 - 'ryte_indexability' => false,
427 - 'content_analysis_active' => false,
428 - 'keyword_analysis_active' => false,
429 - 'enable_admin_bar_menu' => false,
430 - 'enable_cornerstone_content' => false,
431 - 'enable_xml_sitemap' => false,
432 - 'enable_text_link_counter' => false,
433 - 'enable_metabox_insights' => false,
434 - 'enable_link_suggestions' => false,
435 - 'enable_headless_rest_endpoints' => false,
436 - 'tracking' => false,
437 - 'enable_enhanced_slack_sharing' => false,
438 - 'semrush_integration_active' => false,
439 - 'zapier_integration_active' => false,
440 - 'wincher_integration_active' => false,
441 - 'remove_feed_post_comments' => false,
583 + 'disableadvanced_meta' => false,
584 + 'ryte_indexability' => false,
585 + 'content_analysis_active' => false,
586 + 'keyword_analysis_active' => false,
587 + 'inclusive_language_analysis_active' => false,
588 + 'enable_admin_bar_menu' => false,
589 + 'enable_cornerstone_content' => false,
590 + 'enable_xml_sitemap' => false,
591 + 'enable_text_link_counter' => false,
592 + 'enable_metabox_insights' => false,
593 + 'enable_link_suggestions' => false,
594 + 'enable_headless_rest_endpoints' => false,
595 + 'tracking' => false,
596 + 'enable_enhanced_slack_sharing' => false,
597 + 'semrush_integration_active' => false,
598 + 'wincher_integration_active' => false,
599 + 'remove_feed_global' => false,
600 + 'remove_feed_global_comments' => false,
601 + 'remove_feed_post_comments' => false,
602 + 'enable_index_now' => false,
603 + 'enable_ai_generator' => false,
604 + 'remove_feed_authors' => false,
605 + 'remove_feed_categories' => false,
606 + 'remove_feed_tags' => false,
607 + 'remove_feed_custom_taxonomies' => false,
608 + 'remove_feed_post_types' => false,
609 + 'remove_feed_search' => false,
610 + 'remove_atom_rdf_feeds' => false,
611 + 'remove_shortlinks' => false,
612 + 'remove_rest_api_links' => false,
613 + 'remove_rsd_wlw_links' => false,
614 + 'remove_oembed_links' => false,
615 + 'remove_generator' => false,
616 + 'remove_emoji_scripts' => false,
617 + 'remove_powered_by_header' => false,
618 + 'remove_pingback_header' => false,
619 + 'clean_campaign_tracking_urls' => false,
620 + 'clean_permalinks' => false,
621 + 'search_cleanup' => false,
622 + 'search_cleanup_emoji' => false,
623 + 'search_cleanup_patterns' => false,
624 + 'redirect_search_pretty_urls' => false,
625 + 'algolia_integration_active' => false,
626 + 'google_site_kit_feature_enabled' => false,
627 + 'enable_llms_txt' => false,
628 + 'enable_task_list' => false,
629 + 'enable_schema_aggregation_endpoint' => false,
630 + 'enable_schema' => false,
442 631 ];
443 632
444 633 // We can reuse this logic from the base class with the above defaults to parse with the correct feature values.
445 634 $options = $this->prevent_disabled_options_update( $options, $feature_vars );