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 +272 -78 18.3 → 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,35 +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 - 'dismiss_configuration_workout_notice' => false,
85 - 'importing_completed' => [],
86 - 'wincher_integration_active' => true,
87 - 'wincher_tokens' => [],
88 - 'wincher_automatically_add_keyphrases' => false,
89 - 'wincher_website_id' => '',
90 - 'first_time_install' => false,
91 - 'should_redirect_after_install_free' => false,
92 - 'activation_redirect_timestamp_free' => 0,
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,
93 161 ];
94 162
95 163 /**
96 164 * Sub-options which should not be overloaded with multi-site defaults.
@@ -103,8 +171,9 @@
103 171 'baiduverify',
104 172 'googleverify',
105 173 'msverify',
106 174 'yandexverify',
175 + 'ahrefsverify',
107 176 ];
108 177
109 178 /**
110 179 * Possible values for the site_type option.
@@ -127,8 +196,9 @@
127 196 * @var array
128 197 */
129 198 protected $environment_types = [
130 199 '',
200 + 'local',
131 201 'production',
132 202 'staging',
133 203 'development',
134 204 ];
@@ -163,9 +233,9 @@
163 233
164 234 /**
165 235 * Filter: 'wpseo_enable_tracking' - Enables the data tracking of Yoast SEO Premium.
166 236 *
167 - * @api string $is_enabled The enabled state. Default is false.
237 + * @param string|false $is_enabled The enabled state. Default is false.
168 238 */
169 239 $this->defaults['tracking'] = apply_filters( 'wpseo_enable_tracking', false );
170 240
171 241 /* Clear the cache on update/add. */
@@ -272,15 +342,24 @@
272 342 case 'previous_version':
273 343 case 'semrush_country_code':
274 344 case 'license_server_version':
275 345 case 'home_url':
276 - case 'zapier_api_key':
346 + case 'index_now_key':
277 347 case 'wincher_website_id':
348 + case 'clean_permalinks_extra_variables':
349 + case 'indexables_overview_state':
278 350 if ( isset( $dirty[ $key ] ) ) {
279 351 $clean[ $key ] = $dirty[ $key ];
280 352 }
281 353 break;
282 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':
283 362 if ( isset( $dirty[ $key ] ) ) {
284 363 $clean[ $key ] = sanitize_text_field( $dirty[ $key ] );
285 364 }
286 365 break;
@@ -289,8 +368,9 @@
289 368 case 'baiduverify':
290 369 case 'googleverify':
291 370 case 'msverify':
292 371 case 'yandexverify':
372 + case 'ahrefsverify':
293 373 $this->validate_verification_string( $key, $dirty, $old, $clean );
294 374 break;
295 375
296 376 /*
@@ -331,8 +411,9 @@
331 411
332 412 case 'first_activated_on':
333 413 case 'indexing_started':
334 414 case 'activation_redirect_timestamp_free':
415 + case 'last_updated_on':
335 416 $clean[ $key ] = false;
336 417 if ( isset( $dirty[ $key ] ) ) {
337 418 if ( $dirty[ $key ] === false || WPSEO_Utils::validate_int( $dirty[ $key ] ) ) {
338 419 $clean[ $key ] = $dirty[ $key ];
@@ -339,8 +420,18 @@
339 420 }
340 421 }
341 422 break;
342 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 +
343 434 case 'tracking':
344 435 $clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : null );
345 436 break;
346 437
@@ -346,11 +437,22 @@
346 437
347 438 case 'myyoast_oauth':
348 439 case 'semrush_tokens':
349 440 case 'custom_taxonomy_slugs':
350 - case 'zapier_subscription':
351 441 case 'wincher_tokens':
352 442 case 'workouts_data':
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':
353 455 $clean[ $key ] = $old[ $key ];
354 456
355 457 if ( isset( $dirty[ $key ] ) ) {
356 458 $items = $dirty[ $key ];
@@ -372,8 +474,14 @@
372 474 $clean[ $key ] = sanitize_option( $key, $dirty[ $key ] );
373 475 }
374 476 break;
375 477
478 + case 'search_character_limit':
479 + if ( isset( $dirty[ $key ] ) ) {
480 + $clean[ $key ] = (int) $dirty[ $key ];
481 + }
482 + break;
483 +
376 484 case 'import_cursors':
377 485 case 'importing_completed':
378 486 if ( isset( $dirty[ $key ] ) && is_array( $dirty[ $key ] ) ) {
379 487 $clean[ $key ] = $dirty[ $key ];
@@ -379,13 +487,29 @@
379 487 $clean[ $key ] = $dirty[ $key ];
380 488 }
381 489 break;
382 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 +
383 509 /*
384 510 * Boolean (checkbox) fields.
385 - */
386 -
387 - /*
511 + *
388 512 * Covers:
389 513 * 'disableadvanced_meta'
390 514 * 'enable_headless_rest_endpoints'
391 515 * 'yoast_tracking'
@@ -391,9 +515,47 @@
391 515 * 'yoast_tracking'
392 516 * 'dynamic_permalinks'
393 517 * 'indexing_first_time'
394 518 * 'first_time_install'
519 + * 'remove_feed_global'
520 + * 'remove_feed_global_comments'
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'
395 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',
396 558 * and most of the feature variables.
397 559 */
398 560 default:
399 561 $clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : false );
@@ -417,24 +579,56 @@
417 579 }
418 580
419 581 // For the feature variables, set their values to off in case they are disabled.
420 582 $feature_vars = [
421 - 'disableadvanced_meta' => false,
422 - 'ryte_indexability' => false,
423 - 'content_analysis_active' => false,
424 - 'keyword_analysis_active' => false,
425 - 'enable_admin_bar_menu' => false,
426 - 'enable_cornerstone_content' => false,
427 - 'enable_xml_sitemap' => false,
428 - 'enable_text_link_counter' => false,
429 - 'enable_metabox_insights' => false,
430 - 'enable_link_suggestions' => false,
431 - 'enable_headless_rest_endpoints' => false,
432 - 'tracking' => false,
433 - 'enable_enhanced_slack_sharing' => false,
434 - 'semrush_integration_active' => false,
435 - 'zapier_integration_active' => false,
436 - 'wincher_integration_active' => 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,
437 631 ];
438 632
439 633 // We can reuse this logic from the base class with the above defaults to parse with the correct feature values.
440 634 $options = $this->prevent_disabled_options_update( $options, $feature_vars );