PluginProbe ʕ •ᴥ•ʔ
Yoast SEO – Advanced SEO with real-time guidance and built-in AI / 18.6
Yoast SEO – Advanced SEO with real-time guidance and built-in AI v18.6
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 19.1 19.10 19.11 19.12 19.13 19.14 19.2 19.3 19.4 19.5 19.5.1 19.6 19.6.1 19.7 19.7.1 19.7.2 19.8 19.9 20.0 20.1 20.10 20.11 20.12 20.13 20.2 20.2.1 20.3 20.4 20.5 20.6 20.7 20.8 20.9 21.0 21.1 21.2 21.3 21.4 21.5 21.6 21.7 21.8 21.8.1 21.9 21.9.1 22.0 22.1 22.2 22.3 22.4 22.5 22.6 22.7 22.8 22.9 23.0 23.1 23.2 23.3 23.4 23.5 23.6 23.7 23.8 23.9 24.0 24.1 24.2 24.3 24.4 24.5 24.6 24.7 24.8 24.8.1 24.9 25.0 25.1 25.2 25.3 25.3.1 25.4 25.5 25.6 25.7 25.8 25.9 26.0 26.1 26.1.1 26.2 26.3 26.4 26.5 26.6 26.7 26.8 26.9 27.0 27.1 27.1.1 27.2 27.3 27.4
wordpress-seo / inc / class-upgrade.php
wordpress-seo / inc Last commit date
exceptions 5 years ago options 4 years ago sitemaps 4 years ago class-addon-manager.php 4 years ago class-my-yoast-api-request.php 5 years ago class-post-type.php 5 years ago class-rewrite.php 4 years ago class-upgrade-history.php 5 years ago class-upgrade.php 4 years ago class-wpseo-admin-bar-menu.php 4 years ago class-wpseo-content-images.php 4 years ago class-wpseo-custom-fields.php 6 years ago class-wpseo-custom-taxonomies.php 6 years ago class-wpseo-features.php 5 years ago class-wpseo-image-utils.php 4 years ago class-wpseo-installation.php 5 years ago class-wpseo-meta.php 4 years ago class-wpseo-primary-term.php 6 years ago class-wpseo-rank.php 5 years ago class-wpseo-replace-vars.php 4 years ago class-wpseo-replacement-variable.php 5 years ago class-wpseo-shortlinker.php 4 years ago class-wpseo-statistics.php 5 years ago class-wpseo-utils.php 4 years ago date-helper.php 5 years ago index.php 10 years ago interface-wpseo-wordpress-ajax-integration.php 7 years ago interface-wpseo-wordpress-integration.php 7 years ago language-utils.php 5 years ago wpseo-functions-deprecated.php 5 years ago wpseo-functions.php 4 years ago wpseo-non-ajax-functions.php 5 years ago
class-upgrade.php
1277 lines
1 <?php
2 /**
3 * WPSEO plugin file.
4 *
5 * @package WPSEO\Internal
6 */
7
8 use Yoast\WP\Lib\Model;
9
10 /**
11 * This code handles the option upgrades.
12 */
13 class WPSEO_Upgrade {
14
15 /**
16 * The taxonomy helper.
17 *
18 * @var \Yoast\WP\SEO\Helpers\Taxonomy_Helper
19 */
20 private $taxonomy_helper;
21
22 /**
23 * Class constructor.
24 */
25 public function __construct() {
26 $this->taxonomy_helper = YoastSEO()->helpers->taxonomy;
27
28 $version = WPSEO_Options::get( 'version' );
29
30 WPSEO_Options::maybe_set_multisite_defaults( false );
31
32 $routines = [
33 '1.5.0' => 'upgrade_15',
34 '2.0' => 'upgrade_20',
35 '2.1' => 'upgrade_21',
36 '2.2' => 'upgrade_22',
37 '2.3' => 'upgrade_23',
38 '3.0' => 'upgrade_30',
39 '3.3' => 'upgrade_33',
40 '3.6' => 'upgrade_36',
41 '4.0' => 'upgrade_40',
42 '4.4' => 'upgrade_44',
43 '4.7' => 'upgrade_47',
44 '4.9' => 'upgrade_49',
45 '5.0' => 'upgrade_50',
46 '5.5' => 'upgrade_55',
47 '6.3' => 'upgrade_63',
48 '7.0-RC0' => 'upgrade_70',
49 '7.1-RC0' => 'upgrade_71',
50 '7.3-RC0' => 'upgrade_73',
51 '7.4-RC0' => 'upgrade_74',
52 '7.5.3' => 'upgrade_753',
53 '7.7-RC0' => 'upgrade_77',
54 '7.7.2-RC0' => 'upgrade_772',
55 '9.0-RC0' => 'upgrade_90',
56 '10.0-RC0' => 'upgrade_100',
57 '11.1-RC0' => 'upgrade_111',
58 // Reset notifications because we removed the AMP Glue plugin notification.
59 '12.1-RC0' => 'clean_all_notifications',
60 '12.3-RC0' => 'upgrade_123',
61 '12.4-RC0' => 'upgrade_124',
62 '12.8-RC0' => 'upgrade_128',
63 '13.2-RC0' => 'upgrade_132',
64 '14.0.3-RC0' => 'upgrade_1403',
65 '14.1-RC0' => 'upgrade_141',
66 '14.2-RC0' => 'upgrade_142',
67 '14.5-RC0' => 'upgrade_145',
68 '14.9-RC0' => 'upgrade_149',
69 '15.1-RC0' => 'upgrade_151',
70 '15.3-RC0' => 'upgrade_153',
71 '15.5-RC0' => 'upgrade_155',
72 '15.7-RC0' => 'upgrade_157',
73 '15.9.1-RC0' => 'upgrade_1591',
74 '16.2-RC0' => 'upgrade_162',
75 '16.5-RC0' => 'upgrade_165',
76 '17.2-RC0' => 'upgrade_172',
77 '17.7.1-RC0' => 'upgrade_1771',
78 '17.9-RC0' => 'upgrade_179',
79 '18.3-RC3' => 'upgrade_183',
80 '18.6-RC0' => 'upgrade_186',
81 ];
82
83 array_walk( $routines, [ $this, 'run_upgrade_routine' ], $version );
84
85 if ( version_compare( $version, '12.5-RC0', '<' ) ) {
86 /*
87 * We have to run this by hook, because otherwise:
88 * - the theme support check isn't available.
89 * - the notification center notifications are not filled yet.
90 */
91 add_action( 'init', [ $this, 'upgrade_125' ] );
92 }
93
94 // Since 3.7.
95 $upsell_notice = new WPSEO_Product_Upsell_Notice();
96 $upsell_notice->set_upgrade_notice();
97
98 /**
99 * Filter: 'wpseo_run_upgrade' - Runs the upgrade hook which are dependent on Yoast SEO.
100 *
101 * @api string - The current version of Yoast SEO
102 */
103 do_action( 'wpseo_run_upgrade', $version );
104
105 $this->finish_up( $version );
106 }
107
108 /**
109 * Runs the upgrade routine.
110 *
111 * @param string $routine The method to call.
112 * @param string $version The new version.
113 * @param string $current_version The current set version.
114 *
115 * @return void
116 */
117 protected function run_upgrade_routine( $routine, $version, $current_version ) {
118 if ( version_compare( $current_version, $version, '<' ) ) {
119 $this->$routine( $current_version );
120 }
121 }
122
123 /**
124 * Adds a new upgrade history entry.
125 *
126 * @param string $current_version The old version from which we are upgrading.
127 * @param string $new_version The version we are upgrading to.
128 */
129 protected function add_upgrade_history( $current_version, $new_version ) {
130 $upgrade_history = new WPSEO_Upgrade_History();
131 $upgrade_history->add( $current_version, $new_version, array_keys( WPSEO_Options::$options ) );
132 }
133
134 /**
135 * Runs the needed cleanup after an update, setting the DB version to latest version, flushing caches etc.
136 *
137 * @param string|null $previous_version The previous version.
138 *
139 * @return void
140 */
141 protected function finish_up( $previous_version = null ) {
142 if ( $previous_version ) {
143 WPSEO_Options::set( 'previous_version', $previous_version );
144 }
145 WPSEO_Options::set( 'version', WPSEO_VERSION );
146
147 // Just flush rewrites, always, to at least make them work after an upgrade.
148 add_action( 'shutdown', 'flush_rewrite_rules' );
149
150 // Flush the sitemap cache.
151 WPSEO_Sitemaps_Cache::clear();
152
153 // Make sure all our options always exist - issue #1245.
154 WPSEO_Options::ensure_options_exist();
155 }
156
157 /**
158 * Run the Yoast SEO 1.5 upgrade routine.
159 *
160 * @param string $version Current plugin version.
161 */
162 private function upgrade_15( $version ) {
163 // Clean up options and meta.
164 WPSEO_Options::clean_up( null, $version );
165 WPSEO_Meta::clean_up();
166 }
167
168 /**
169 * Moves options that moved position in WPSEO 2.0.
170 */
171 private function upgrade_20() {
172 /**
173 * Clean up stray wpseo_ms options from the options table, option should only exist in the sitemeta table.
174 * This could have been caused in many version of Yoast SEO, so deleting it for everything below 2.0.
175 */
176 delete_option( 'wpseo_ms' );
177
178 $wpseo = $this->get_option_from_database( 'wpseo' );
179 $this->save_option_setting( $wpseo, 'pinterestverify' );
180
181 // Re-save option to trigger sanitization.
182 $this->cleanup_option_data( 'wpseo' );
183 }
184
185 /**
186 * Detects if taxonomy terms were split and updates the corresponding taxonomy meta's accordingly.
187 */
188 private function upgrade_21() {
189 $taxonomies = get_option( 'wpseo_taxonomy_meta', [] );
190
191 if ( ! empty( $taxonomies ) ) {
192 foreach ( $taxonomies as $taxonomy => $tax_metas ) {
193 foreach ( $tax_metas as $term_id => $tax_meta ) {
194 if ( function_exists( 'wp_get_split_term' ) ) {
195 $new_term_id = wp_get_split_term( $term_id, $taxonomy );
196 if ( $new_term_id !== false ) {
197 $taxonomies[ $taxonomy ][ $new_term_id ] = $taxonomies[ $taxonomy ][ $term_id ];
198 unset( $taxonomies[ $taxonomy ][ $term_id ] );
199 }
200 }
201 }
202 }
203
204 update_option( 'wpseo_taxonomy_meta', $taxonomies );
205 }
206 }
207
208 /**
209 * Performs upgrade functions to Yoast SEO 2.2.
210 */
211 private function upgrade_22() {
212 // Unschedule our tracking.
213 wp_clear_scheduled_hook( 'yoast_tracking' );
214
215 $this->cleanup_option_data( 'wpseo' );
216 }
217
218 /**
219 * Schedules upgrade function to Yoast SEO 2.3.
220 */
221 private function upgrade_23() {
222 add_action( 'wp', [ $this, 'upgrade_23_query' ], 90 );
223 add_action( 'admin_head', [ $this, 'upgrade_23_query' ], 90 );
224 }
225
226 /**
227 * Performs upgrade query to Yoast SEO 2.3.
228 */
229 public function upgrade_23_query() {
230 $wp_query = new WP_Query( 'post_type=any&meta_key=_yoast_wpseo_sitemap-include&meta_value=never&order=ASC' );
231
232 if ( ! empty( $wp_query->posts ) ) {
233 $options = get_option( 'wpseo_xml' );
234
235 $excluded_posts = [];
236 if ( $options['excluded-posts'] !== '' ) {
237 $excluded_posts = explode( ',', $options['excluded-posts'] );
238 }
239
240 foreach ( $wp_query->posts as $post ) {
241 if ( ! in_array( (string) $post->ID, $excluded_posts, true ) ) {
242 $excluded_posts[] = $post->ID;
243 }
244 }
245
246 // Updates the meta value.
247 $options['excluded-posts'] = implode( ',', $excluded_posts );
248
249 // Update the option.
250 update_option( 'wpseo_xml', $options );
251 }
252
253 // Remove the meta fields.
254 delete_post_meta_by_key( '_yoast_wpseo_sitemap-include' );
255 }
256
257 /**
258 * Performs upgrade functions to Yoast SEO 3.0.
259 */
260 private function upgrade_30() {
261 // Remove the meta fields for sitemap prio.
262 delete_post_meta_by_key( '_yoast_wpseo_sitemap-prio' );
263 }
264
265 /**
266 * Performs upgrade functions to Yoast SEO 3.3.
267 */
268 private function upgrade_33() {
269 // Notification dismissals have been moved to User Meta instead of global option.
270 delete_option( Yoast_Notification_Center::STORAGE_KEY );
271 }
272
273 /**
274 * Performs upgrade functions to Yoast SEO 3.6.
275 */
276 private function upgrade_36() {
277 global $wpdb;
278
279 // Between 3.2 and 3.4 the sitemap options were saved with autoloading enabled.
280 $wpdb->query( 'DELETE FROM ' . $wpdb->options . ' WHERE option_name LIKE "wpseo_sitemap_%" AND autoload = "yes"' );
281 }
282
283 /**
284 * Removes the about notice when its still in the database.
285 */
286 private function upgrade_40() {
287 $center = Yoast_Notification_Center::get();
288 $center->remove_notification_by_id( 'wpseo-dismiss-about' );
289 }
290
291 /**
292 * Moves the content-analysis-active and keyword-analysis-acive options from wpseo-titles to wpseo.
293 */
294 private function upgrade_44() {
295 $wpseo_titles = $this->get_option_from_database( 'wpseo_titles' );
296
297 $this->save_option_setting( $wpseo_titles, 'content-analysis-active', 'content_analysis_active' );
298 $this->save_option_setting( $wpseo_titles, 'keyword-analysis-active', 'keyword_analysis_active' );
299
300 // Remove irrelevant content from the option.
301 $this->cleanup_option_data( 'wpseo_titles' );
302 }
303
304 /**
305 * Renames the meta name for the cornerstone content. It was a public meta field and it has to be private.
306 */
307 private function upgrade_47() {
308 global $wpdb;
309
310 // The meta key has to be private, so prefix it.
311 $wpdb->query(
312 $wpdb->prepare(
313 'UPDATE ' . $wpdb->postmeta . ' SET meta_key = %s WHERE meta_key = "yst_is_cornerstone"',
314 WPSEO_Cornerstone_Filter::META_NAME
315 )
316 );
317 }
318
319 /**
320 * Removes the 'wpseo-dismiss-about' notice for every user that still has it.
321 */
322 private function upgrade_49() {
323 global $wpdb;
324
325 /*
326 * Using a filter to remove the notification for the current logged in user. The notification center is
327 * initializing the notifications before the upgrade routine has been executedd and is saving the stored
328 * notifications on shutdown. This causes the returning notification. By adding this filter the shutdown
329 * routine on the notification center will remove the notification.
330 */
331 add_filter( 'yoast_notifications_before_storage', [ $this, 'remove_about_notice' ] );
332
333 $meta_key = $wpdb->get_blog_prefix() . Yoast_Notification_Center::STORAGE_KEY;
334
335 $usermetas = $wpdb->get_results(
336 $wpdb->prepare(
337 '
338 SELECT user_id, meta_value
339 FROM ' . $wpdb->usermeta . '
340 WHERE meta_key = %s AND meta_value LIKE %s
341 ',
342 $meta_key,
343 '%wpseo-dismiss-about%'
344 ),
345 ARRAY_A
346 );
347
348 if ( empty( $usermetas ) ) {
349 return;
350 }
351
352 foreach ( $usermetas as $usermeta ) {
353 $notifications = maybe_unserialize( $usermeta['meta_value'] );
354
355 foreach ( $notifications as $notification_key => $notification ) {
356 if ( ! empty( $notification['options']['id'] ) && $notification['options']['id'] === 'wpseo-dismiss-about' ) {
357 unset( $notifications[ $notification_key ] );
358 }
359 }
360
361 update_user_option( $usermeta['user_id'], Yoast_Notification_Center::STORAGE_KEY, array_values( $notifications ) );
362 }
363 }
364
365 /**
366 * Removes the wpseo-dismiss-about notice from a list of notifications.
367 *
368 * @param Yoast_Notification[] $notifications The notifications to filter.
369 *
370 * @return Yoast_Notification[] The filtered list of notifications. Excluding the wpseo-dismiss-about notification.
371 */
372 public function remove_about_notice( $notifications ) {
373 foreach ( $notifications as $notification_key => $notification ) {
374 if ( $notification->get_id() === 'wpseo-dismiss-about' ) {
375 unset( $notifications[ $notification_key ] );
376 }
377 }
378
379 return $notifications;
380 }
381
382 /**
383 * Adds the yoast_seo_links table to the database.
384 */
385 private function upgrade_50() {
386 global $wpdb;
387
388 // Deletes the post meta value, which might created in the RC.
389 $wpdb->query( 'DELETE FROM ' . $wpdb->postmeta . ' WHERE meta_key = "_yst_content_links_processed"' );
390 }
391
392 /**
393 * Register new capabilities and roles.
394 */
395 private function upgrade_55() {
396 // Register roles.
397 do_action( 'wpseo_register_roles' );
398 WPSEO_Role_Manager_Factory::get()->add();
399
400 // Register capabilities.
401 do_action( 'wpseo_register_capabilities' );
402 WPSEO_Capability_Manager_Factory::get()->add();
403 }
404
405 /**
406 * Removes some no longer used options for noindexing subpages and for meta keywords and its associated templates.
407 *
408 * @return void
409 */
410 private function upgrade_63() {
411 $this->cleanup_option_data( 'wpseo_titles' );
412 }
413
414 /**
415 * Perform the 7.0 upgrade, moves settings around, deletes several options.
416 *
417 * @return void
418 */
419 private function upgrade_70() {
420
421 $wpseo_permalinks = $this->get_option_from_database( 'wpseo_permalinks' );
422 $wpseo_xml = $this->get_option_from_database( 'wpseo_xml' );
423 $wpseo_rss = $this->get_option_from_database( 'wpseo_rss' );
424 $wpseo = $this->get_option_from_database( 'wpseo' );
425 $wpseo_internallinks = $this->get_option_from_database( 'wpseo_internallinks' );
426
427 // Move some permalink settings, then delete the option.
428 $this->save_option_setting( $wpseo_permalinks, 'redirectattachment', 'disable-attachment' );
429 $this->save_option_setting( $wpseo_permalinks, 'stripcategorybase' );
430
431 // Move one XML sitemap setting, then delete the option.
432 $this->save_option_setting( $wpseo_xml, 'enablexmlsitemap', 'enable_xml_sitemap' );
433
434
435 // Move the RSS settings to the search appearance settings, then delete the RSS option.
436 $this->save_option_setting( $wpseo_rss, 'rssbefore' );
437 $this->save_option_setting( $wpseo_rss, 'rssafter' );
438
439 $this->save_option_setting( $wpseo, 'company_logo' );
440 $this->save_option_setting( $wpseo, 'company_name' );
441 $this->save_option_setting( $wpseo, 'company_or_person' );
442 $this->save_option_setting( $wpseo, 'person_name' );
443
444 // Remove the website name and altername name as we no longer need them.
445 $this->cleanup_option_data( 'wpseo' );
446
447 // All the breadcrumbs settings have moved to the search appearance settings.
448 foreach ( array_keys( $wpseo_internallinks ) as $key ) {
449 $this->save_option_setting( $wpseo_internallinks, $key );
450 }
451
452 // Convert hidden metabox options to display metabox options.
453 $title_options = get_option( 'wpseo_titles' );
454
455 foreach ( $title_options as $key => $value ) {
456 if ( strpos( $key, 'hideeditbox-tax-' ) === 0 ) {
457 $taxonomy = substr( $key, strlen( 'hideeditbox-tax-' ) );
458 WPSEO_Options::set( 'display-metabox-tax-' . $taxonomy, ! $value );
459 continue;
460 }
461
462 if ( strpos( $key, 'hideeditbox-' ) === 0 ) {
463 $post_type = substr( $key, strlen( 'hideeditbox-' ) );
464 WPSEO_Options::set( 'display-metabox-pt-' . $post_type, ! $value );
465 continue;
466 }
467 }
468
469 // Cleanup removed options.
470 delete_option( 'wpseo_xml' );
471 delete_option( 'wpseo_permalinks' );
472 delete_option( 'wpseo_rss' );
473 delete_option( 'wpseo_internallinks' );
474
475 // Remove possibly present plugin conflict notice for plugin that was removed from the list of conflicting plugins.
476 $yoast_plugin_conflict = WPSEO_Plugin_Conflict::get_instance();
477 $yoast_plugin_conflict->clear_error( 'header-footer/plugin.php' );
478
479 // Moves the user meta for excluding from the XML sitemap to a noindex.
480 global $wpdb;
481 $wpdb->query( "UPDATE $wpdb->usermeta SET meta_key = 'wpseo_noindex_author' WHERE meta_key = 'wpseo_excludeauthorsitemap'" );
482 }
483
484 /**
485 * Perform the 7.1 upgrade.
486 *
487 * @return void
488 */
489 private function upgrade_71() {
490 $this->cleanup_option_data( 'wpseo_social' );
491
492 // Move the breadcrumbs setting and invert it.
493 $title_options = $this->get_option_from_database( 'wpseo_titles' );
494
495 if ( array_key_exists( 'breadcrumbs-blog-remove', $title_options ) ) {
496 WPSEO_Options::set( 'breadcrumbs-display-blog-page', ! $title_options['breadcrumbs-blog-remove'] );
497
498 $this->cleanup_option_data( 'wpseo_titles' );
499 }
500 }
501
502 /**
503 * Perform the 7.3 upgrade.
504 *
505 * @return void
506 */
507 private function upgrade_73() {
508 global $wpdb;
509 // We've moved the cornerstone checkbox to our proper namespace.
510 $wpdb->query( "UPDATE $wpdb->postmeta SET meta_key = '_yoast_wpseo_is_cornerstone' WHERE meta_key = '_yst_is_cornerstone'" );
511
512 // Remove the previous Whip dismissed message, as this is a new one regarding PHP 5.2.
513 delete_option( 'whip_dismiss_timestamp' );
514 }
515
516 /**
517 * Performs the 7.4 upgrade.
518 *
519 * @return void
520 */
521 private function upgrade_74() {
522 $this->remove_sitemap_validators();
523 }
524
525 /**
526 * Performs the 7.5.3 upgrade.
527 *
528 * When upgrading purging media is potentially relevant.
529 *
530 * @return void
531 */
532 private function upgrade_753() {
533 // Only when attachments are not disabled.
534 if ( WPSEO_Options::get( 'disable-attachment' ) === true ) {
535 return;
536 }
537
538 // Only when attachments are not no-indexed.
539 if ( WPSEO_Options::get( 'noindex-attachment' ) === true ) {
540 return;
541 }
542
543 // Set purging relevancy.
544 WPSEO_Options::set( 'is-media-purge-relevant', true );
545 }
546
547 /**
548 * Performs the 7.7 upgrade.
549 *
550 * @return void
551 */
552 private function upgrade_77() {
553 // Remove all OpenGraph content image cache.
554 $this->delete_post_meta( '_yoast_wpseo_post_image_cache' );
555 }
556
557 /**
558 * Performs the 7.7.2 upgrade.
559 *
560 * @return void
561 */
562 private function upgrade_772() {
563 if ( YoastSEO()->helpers->woocommerce->is_active() ) {
564 $this->migrate_woocommerce_archive_setting_to_shop_page();
565 }
566 }
567
568 /**
569 * Performs the 9.0 upgrade.
570 *
571 * @return void
572 */
573 private function upgrade_90() {
574 global $wpdb;
575
576 // Invalidate all sitemap cache transients.
577 WPSEO_Sitemaps_Cache_Validator::cleanup_database();
578
579 // Removes all scheduled tasks for hitting the sitemap index.
580 wp_clear_scheduled_hook( 'wpseo_hit_sitemap_index' );
581
582 $wpdb->query( 'DELETE FROM ' . $wpdb->options . ' WHERE option_name LIKE "wpseo_sitemap_%"' );
583 }
584
585 /**
586 * Performs the 10.0 upgrade.
587 *
588 * @return void
589 */
590 private function upgrade_100() {
591 // Removes recalibration notifications.
592 $this->clean_all_notifications();
593
594 // Removes recalibration options.
595 WPSEO_Options::clean_up( 'wpseo' );
596 delete_option( 'wpseo_recalibration_beta_mailinglist_subscription' );
597 }
598
599 /**
600 * Performs the 11.1 upgrade.
601 *
602 * @return void
603 */
604 private function upgrade_111() {
605 // Set company_or_person to company when it's an invalid value.
606 $company_or_person = WPSEO_Options::get( 'company_or_person', '' );
607
608 if ( ! in_array( $company_or_person, [ 'company', 'person' ], true ) ) {
609 WPSEO_Options::set( 'company_or_person', 'company' );
610 }
611 }
612
613 /**
614 * Performs the 12.3 upgrade.
615 *
616 * Removes the about notice when its still in the database.
617 */
618 private function upgrade_123() {
619 $plugins = [
620 'yoast-seo-premium',
621 'video-seo-for-wordpress-seo-by-yoast',
622 'yoast-news-seo',
623 'local-seo-for-yoast-seo',
624 'yoast-woocommerce-seo',
625 'yoast-acf-analysis',
626 ];
627
628 $center = Yoast_Notification_Center::get();
629 foreach ( $plugins as $plugin ) {
630 $center->remove_notification_by_id( 'wpseo-outdated-yoast-seo-plugin-' . $plugin );
631 }
632 }
633
634 /**
635 * Performs the 12.4 upgrade.
636 *
637 * Removes the Google plus defaults from the database.
638 */
639 private function upgrade_124() {
640 $this->cleanup_option_data( 'wpseo_social' );
641 }
642
643 /**
644 * Performs the 12.5 upgrade.
645 */
646 public function upgrade_125() {
647 // Disables the force rewrite title when the theme supports it through WordPress.
648 if ( WPSEO_Options::get( 'forcerewritetitle', false ) && current_theme_supports( 'title-tag' ) ) {
649 WPSEO_Options::set( 'forcerewritetitle', false );
650 }
651
652 global $wpdb;
653 $wpdb->query( "DELETE FROM $wpdb->usermeta WHERE meta_key = 'wp_yoast_promo_hide_premium_upsell_admin_block'" );
654
655 // Removes the WordPress update notification, because it is no longer necessary when WordPress 5.3 is released.
656 $center = Yoast_Notification_Center::get();
657 $center->remove_notification_by_id( 'wpseo-dismiss-wordpress-upgrade' );
658 }
659
660 /**
661 * Performs the 12.8 upgrade.
662 */
663 private function upgrade_128() {
664 // Re-save wpseo to make sure bf_banner_2019_dismissed key is gone.
665 $this->cleanup_option_data( 'wpseo' );
666
667 Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-page_comments-notice' );
668 Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-wordpress-upgrade' );
669 }
670
671 /**
672 * Performs the 13.2 upgrade.
673 */
674 private function upgrade_132() {
675 Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-tagline-notice' );
676 Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-permalink-notice' );
677 Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-onpageorg' );
678
679 // Transfers the onpage option value to the ryte option.
680 $ryte_option = get_option( 'wpseo_ryte' );
681 $onpage_option = get_option( 'wpseo_onpage' );
682 if ( ! $ryte_option && $onpage_option ) {
683 update_option( 'wpseo_ryte', $onpage_option );
684 delete_option( 'wpseo_onpage' );
685 }
686
687 // Changes onpage_indexability to ryte_indexability.
688 $wpseo_option = get_option( 'wpseo' );
689 if ( isset( $wpseo_option['onpage_indexability'] ) && ! isset( $wpseo_option['ryte_indexability'] ) ) {
690 $wpseo_option['ryte_indexability'] = $wpseo_option['onpage_indexability'];
691 unset( $wpseo_option['onpage_indexability'] );
692 update_option( 'wpseo', $wpseo_option );
693 }
694
695 if ( wp_next_scheduled( 'wpseo_ryte_fetch' ) ) {
696 wp_clear_scheduled_hook( 'wpseo_ryte_fetch' );
697 }
698
699 /*
700 * Re-register capabilities to add the new `view_site_health_checks`
701 * capability to the SEO Manager role.
702 */
703 do_action( 'wpseo_register_capabilities' );
704 WPSEO_Capability_Manager_Factory::get()->add();
705 }
706
707 /**
708 * Perform the 14.0.3 upgrade.
709 */
710 private function upgrade_1403() {
711 WPSEO_Options::set( 'ignore_indexation_warning', false );
712 }
713
714 /**
715 * Performs the 14.1 upgrade.
716 */
717 private function upgrade_141() {
718 /*
719 * These notifications are retrieved from storage on the `init` hook with
720 * priority 1. We need to remove them after they're retrieved.
721 */
722 add_action( 'init', [ $this, 'remove_notifications_for_141' ] );
723 add_action( 'init', [ $this, 'clean_up_private_taxonomies_for_141' ] );
724
725 $this->reset_permalinks_of_attachments_for_141();
726 }
727
728 /**
729 * Performs the 14.2 upgrade.
730 *
731 * Removes the yoast-acf-analysis notice when it's still in the database.
732 */
733 private function upgrade_142() {
734 add_action( 'init', [ $this, 'remove_acf_notification_for_142' ] );
735 }
736
737 /**
738 * Performs the 14.5 upgrade.
739 */
740 private function upgrade_145() {
741 add_action( 'init', [ $this, 'set_indexation_completed_option_for_145' ] );
742 }
743
744 /**
745 * Performs the 14.9 upgrade.
746 */
747 private function upgrade_149() {
748 $version = get_option( 'wpseo_license_server_version', 2 );
749 WPSEO_Options::set( 'license_server_version', $version );
750 delete_option( 'wpseo_license_server_version' );
751 }
752
753 /**
754 * Performs the 15.1 upgrade.
755 *
756 * @return void
757 */
758 private function upgrade_151() {
759 $this->set_home_url_for_151();
760 $this->move_indexables_indexation_reason_for_151();
761
762 add_action( 'init', [ $this, 'set_permalink_structure_option_for_151' ] );
763 add_action( 'init', [ $this, 'store_custom_taxonomy_slugs_for_151' ] );
764 }
765
766 /**
767 * Performs the 15.3 upgrade.
768 *
769 * @return void
770 */
771 private function upgrade_153() {
772 WPSEO_Options::set( 'category_base_url', get_option( 'category_base' ) );
773 WPSEO_Options::set( 'tag_base_url', get_option( 'tag_base' ) );
774
775 // Rename a couple of options.
776 $indexation_started_value = WPSEO_Options::get( 'indexation_started' );
777 WPSEO_Options::set( 'indexing_started', $indexation_started_value );
778
779 $indexables_indexing_completed_value = WPSEO_Options::get( 'indexables_indexation_completed' );
780 WPSEO_Options::set( 'indexables_indexing_completed', $indexables_indexing_completed_value );
781 }
782
783 /**
784 * Performs the 15.5 upgrade.
785 *
786 * @return void
787 */
788 private function upgrade_155() {
789 // Unset the fbadminapp value in the wpseo_social option.
790 $wpseo_social_option = get_option( 'wpseo_social' );
791
792 if ( isset( $wpseo_social_option['fbadminapp'] ) ) {
793 unset( $wpseo_social_option['fbadminapp'] );
794 update_option( 'wpseo_social', $wpseo_social_option );
795 }
796 }
797
798 /**
799 * Performs the 15.7 upgrade.
800 *
801 * @return void
802 */
803 private function upgrade_157() {
804 add_action( 'init', [ $this, 'remove_plugin_updated_notification_for_157' ] );
805 }
806
807 /**
808 * Performs the 15.9.1 upgrade routine.
809 */
810 private function upgrade_1591() {
811 $enabled_auto_updates = \get_option( 'auto_update_plugins' );
812 $addon_update_watcher = YoastSEO()->classes->get( \Yoast\WP\SEO\Integrations\Watchers\Addon_Update_Watcher::class );
813 $addon_update_watcher->toggle_auto_updates_for_add_ons( 'auto_update_plugins', [], $enabled_auto_updates );
814 }
815
816 /**
817 * Performs the 16.2 upgrade routine.
818 */
819 private function upgrade_162() {
820 $enabled_auto_updates = \get_site_option( 'auto_update_plugins' );
821 $addon_update_watcher = YoastSEO()->classes->get( \Yoast\WP\SEO\Integrations\Watchers\Addon_Update_Watcher::class );
822 $addon_update_watcher->toggle_auto_updates_for_add_ons( 'auto_update_plugins', $enabled_auto_updates, [] );
823 }
824
825 /**
826 * Performs the 16.5 upgrade.
827 *
828 * @return void
829 */
830 private function upgrade_165() {
831 add_action( 'init', [ $this, 'copy_og_settings_from_social_to_titles' ], 99 );
832
833 // Run after the WPSEO_Options::enrich_defaults method which has priority 99.
834 add_action( 'init', [ $this, 'reset_og_settings_to_default_values' ], 100 );
835 }
836
837 /**
838 * Performs the 17.2 upgrade. Cleans out any unnecessary indexables. See $cleanup_integration->get_cleanup_tasks() to see what will be cleaned out.
839 *
840 * @return void
841 */
842 private function upgrade_172() {
843 \wp_unschedule_hook( 'wpseo_cleanup_orphaned_indexables' );
844 \wp_unschedule_hook( 'wpseo_cleanup_indexables' );
845
846 if ( ! \wp_next_scheduled( \Yoast\WP\SEO\Integrations\Cleanup_Integration::START_HOOK ) ) {
847 \wp_schedule_single_event( ( time() + ( MINUTE_IN_SECONDS * 5 ) ), \Yoast\WP\SEO\Integrations\Cleanup_Integration::START_HOOK );
848 }
849 }
850
851 /**
852 * Performs the 17.7.1 upgrade routine.
853 */
854 private function upgrade_1771() {
855 $enabled_auto_updates = \get_site_option( 'auto_update_plugins' );
856 $addon_update_watcher = YoastSEO()->classes->get( \Yoast\WP\SEO\Integrations\Watchers\Addon_Update_Watcher::class );
857 $addon_update_watcher->toggle_auto_updates_for_add_ons( 'auto_update_plugins', $enabled_auto_updates, [] );
858 }
859
860 /**
861 * Performs the 17.9 upgrade routine.
862 */
863 private function upgrade_179() {
864 WPSEO_Options::set( 'wincher_integration_active', true );
865 }
866
867 /**
868 * Performs the 18.3 upgrade routine.
869 */
870 private function upgrade_183() {
871 $this->delete_post_meta( 'yoast-structured-data-blocks-images-cache' );
872 }
873
874 /**
875 * Performs the 18.6 upgrade routine.
876 */
877 private function upgrade_186() {
878 if ( is_multisite() ) {
879 WPSEO_Options::set( 'allow_wincher_integration_active', false );
880 }
881 }
882
883 /**
884 * Sets the home_url option for the 15.1 upgrade routine.
885 *
886 * @return void
887 */
888 protected function set_home_url_for_151() {
889 $home_url = WPSEO_Options::get( 'home_url' );
890
891 if ( empty( $home_url ) ) {
892 WPSEO_Options::set( 'home_url', get_home_url() );
893 }
894 }
895
896 /**
897 * Moves the `indexables_indexation_reason` option to the
898 * renamed `indexing_reason` option.
899 *
900 * @return void
901 */
902 protected function move_indexables_indexation_reason_for_151() {
903 $reason = WPSEO_Options::get( 'indexables_indexation_reason', '' );
904 WPSEO_Options::set( 'indexing_reason', $reason );
905 }
906
907 /**
908 * Checks if the indexable indexation is completed.
909 * If so, sets the `indexables_indexation_completed` option to `true`,
910 * else to `false`.
911 */
912 public function set_indexation_completed_option_for_145() {
913 WPSEO_Options::set( 'indexables_indexation_completed', YoastSEO()->helpers->indexing->get_limited_filtered_unindexed_count( 1 ) === 0 );
914 }
915
916 /**
917 * Cleans up the private taxonomies from the indexables table for the upgrade routine to 14.1.
918 */
919 public function clean_up_private_taxonomies_for_141() {
920 global $wpdb;
921
922 // If migrations haven't been completed successfully the following may give false errors. So suppress them.
923 $show_errors = $wpdb->show_errors;
924 $wpdb->show_errors = false;
925
926 // Clean up indexables of private taxonomies.
927 $private_taxonomies = \get_taxonomies( [ 'public' => false ], 'names' );
928
929 if ( empty( $private_taxonomies ) ) {
930 return;
931 }
932
933 $indexable_table = Model::get_table_name( 'Indexable' );
934
935 // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Reason: Is it prepared already.
936 $query = $wpdb->prepare(
937 // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Reason: Too hard to fix.
938 "DELETE FROM $indexable_table
939 WHERE object_type = 'term'
940 AND object_sub_type IN ("
941 . \implode( ', ', \array_fill( 0, \count( $private_taxonomies ), '%s' ) )
942 . ')',
943 $private_taxonomies
944 );
945 $wpdb->query( $query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Reason: Is it prepared already.
946
947 $wpdb->show_errors = $show_errors;
948 }
949
950 /**
951 * Resets the permalinks of attachments to `null` in the indexable table for the upgrade routine to 14.1.
952 */
953 private function reset_permalinks_of_attachments_for_141() {
954 global $wpdb;
955
956 // If migrations haven't been completed succesfully the following may give false errors. So suppress them.
957 $show_errors = $wpdb->show_errors;
958 $wpdb->show_errors = false;
959
960 // Reset the permalinks of the attachments in the indexable table.
961 $indexable_table = Model::get_table_name( 'Indexable' );
962 $query = "UPDATE $indexable_table SET permalink = NULL WHERE object_type = 'post' AND object_sub_type = 'attachment'";
963 $wpdb->query( $query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Reason: There is no user input.
964
965 $wpdb->show_errors = $show_errors;
966 }
967
968 /**
969 * Removes notifications from the Notification center for the 14.1 upgrade.
970 *
971 * @return void
972 */
973 public function remove_notifications_for_141() {
974 Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-recalculate' );
975 Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-blog-public-notice' );
976 Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-links-table-not-accessible' );
977 Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-post-type-archive-notification' );
978 }
979
980 /**
981 * Removes the wpseo-suggested-plugin-yoast-acf-analysis notification from the Notification center for the 14.2 upgrade.
982 *
983 * @return void
984 */
985 public function remove_acf_notification_for_142() {
986 Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-suggested-plugin-yoast-acf-analysis' );
987 }
988
989 /**
990 * Removes the wpseo-plugin-updated notification from the Notification center for the 15.7 upgrade.
991 *
992 * @return void
993 */
994 public function remove_plugin_updated_notification_for_157() {
995 Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-plugin-updated' );
996 }
997
998 /**
999 * Removes all notifications saved in the database under 'wp_yoast_notifications'.
1000 *
1001 * @return void
1002 */
1003 private function clean_all_notifications() {
1004 global $wpdb;
1005 delete_metadata( 'user', 0, $wpdb->get_blog_prefix() . Yoast_Notification_Center::STORAGE_KEY, '', true );
1006 }
1007
1008 /**
1009 * Removes the post meta fields for a given meta key.
1010 *
1011 * @param string $meta_key The meta key.
1012 *
1013 * @return void
1014 */
1015 private function delete_post_meta( $meta_key ) {
1016 global $wpdb;
1017 $deleted = $wpdb->delete( $wpdb->postmeta, [ 'meta_key' => $meta_key ], [ '%s' ] );
1018
1019 if ( $deleted ) {
1020 wp_cache_set( 'last_changed', microtime(), 'posts' );
1021 }
1022 }
1023
1024 /**
1025 * Removes all sitemap validators.
1026 *
1027 * This should be executed on every upgrade routine until we have removed the sitemap caching in the database.
1028 *
1029 * @return void
1030 */
1031 private function remove_sitemap_validators() {
1032 global $wpdb;
1033
1034 // Remove all sitemap validators.
1035 $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE 'wpseo_sitemap%validator%'" );
1036 }
1037
1038 /**
1039 * Retrieves the option value directly from the database.
1040 *
1041 * @param string $option_name Option to retrieve.
1042 *
1043 * @return array|mixed The content of the option if exists, otherwise an empty array.
1044 */
1045 protected function get_option_from_database( $option_name ) {
1046 global $wpdb;
1047
1048 // Load option directly from the database, to avoid filtering and sanitization.
1049 $sql = $wpdb->prepare( 'SELECT option_value FROM ' . $wpdb->options . ' WHERE option_name = %s', $option_name );
1050 $results = $wpdb->get_results( $sql, ARRAY_A ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Reason: Is is already prepared.
1051 if ( ! empty( $results ) ) {
1052 return maybe_unserialize( $results[0]['option_value'] );
1053 }
1054
1055 return [];
1056 }
1057
1058 /**
1059 * Cleans the option to make sure only relevant settings are there.
1060 *
1061 * @param string $option_name Option name save.
1062 *
1063 * @return void
1064 */
1065 protected function cleanup_option_data( $option_name ) {
1066 $data = get_option( $option_name, [] );
1067 if ( ! is_array( $data ) || $data === [] ) {
1068 return;
1069 }
1070
1071 /*
1072 * Clean up the option by re-saving it.
1073 *
1074 * The option framework will remove any settings that are not configured
1075 * for this option, removing any migrated settings.
1076 */
1077 update_option( $option_name, $data );
1078 }
1079
1080 /**
1081 * Saves an option setting to where it should be stored.
1082 *
1083 * @param array $source_data The option containing the value to be migrated.
1084 * @param string $source_setting Name of the key in the "from" option.
1085 * @param string|null $target_setting Name of the key in the "to" option.
1086 *
1087 * @return void
1088 */
1089 protected function save_option_setting( $source_data, $source_setting, $target_setting = null ) {
1090 if ( $target_setting === null ) {
1091 $target_setting = $source_setting;
1092 }
1093
1094 if ( isset( $source_data[ $source_setting ] ) ) {
1095 WPSEO_Options::set( $target_setting, $source_data[ $source_setting ] );
1096 }
1097 }
1098
1099 /**
1100 * Migrates WooCommerce archive settings to the WooCommerce Shop page meta-data settings.
1101 *
1102 * If no Shop page is defined, nothing will be migrated.
1103 *
1104 * @return void
1105 */
1106 private function migrate_woocommerce_archive_setting_to_shop_page() {
1107 $shop_page_id = wc_get_page_id( 'shop' );
1108
1109 if ( $shop_page_id === -1 ) {
1110 return;
1111 }
1112
1113 $title = WPSEO_Meta::get_value( 'title', $shop_page_id );
1114
1115 if ( empty( $title ) ) {
1116 $option_title = WPSEO_Options::get( 'title-ptarchive-product' );
1117
1118 WPSEO_Meta::set_value(
1119 'title',
1120 $option_title,
1121 $shop_page_id
1122 );
1123
1124 WPSEO_Options::set( 'title-ptarchive-product', '' );
1125 }
1126
1127 $meta_description = WPSEO_Meta::get_value( 'metadesc', $shop_page_id );
1128
1129 if ( empty( $meta_description ) ) {
1130 $option_metadesc = WPSEO_Options::get( 'metadesc-ptarchive-product' );
1131
1132 WPSEO_Meta::set_value(
1133 'metadesc',
1134 $option_metadesc,
1135 $shop_page_id
1136 );
1137
1138 WPSEO_Options::set( 'metadesc-ptarchive-product', '' );
1139 }
1140
1141 $bc_title = WPSEO_Meta::get_value( 'bctitle', $shop_page_id );
1142
1143 if ( empty( $bc_title ) ) {
1144 $option_bctitle = WPSEO_Options::get( 'bctitle-ptarchive-product' );
1145
1146 WPSEO_Meta::set_value(
1147 'bctitle',
1148 $option_bctitle,
1149 $shop_page_id
1150 );
1151
1152 WPSEO_Options::set( 'bctitle-ptarchive-product', '' );
1153 }
1154
1155 $noindex = WPSEO_Meta::get_value( 'meta-robots-noindex', $shop_page_id );
1156
1157 if ( $noindex === '0' ) {
1158 $option_noindex = WPSEO_Options::get( 'noindex-ptarchive-product' );
1159
1160 WPSEO_Meta::set_value(
1161 'meta-robots-noindex',
1162 $option_noindex,
1163 $shop_page_id
1164 );
1165
1166 WPSEO_Options::set( 'noindex-ptarchive-product', false );
1167 }
1168 }
1169
1170 /**
1171 * Stores the initial `permalink_structure` option.
1172 *
1173 * @return void
1174 */
1175 public function set_permalink_structure_option_for_151() {
1176 WPSEO_Options::set( 'permalink_structure', get_option( 'permalink_structure' ) );
1177 }
1178
1179 /**
1180 * Stores the initial slugs of custom taxonomies.
1181 *
1182 * @return void
1183 */
1184 public function store_custom_taxonomy_slugs_for_151() {
1185 $taxonomies = $this->taxonomy_helper->get_custom_taxonomies();
1186
1187 $custom_taxonomies = [];
1188
1189 foreach ( $taxonomies as $taxonomy ) {
1190 $slug = $this->taxonomy_helper->get_taxonomy_slug( $taxonomy );
1191
1192 $custom_taxonomies[ $taxonomy ] = $slug;
1193 }
1194
1195 WPSEO_Options::set( 'custom_taxonomy_slugs', $custom_taxonomies );
1196 }
1197
1198 /**
1199 * Copies the frontpage social settings to the titles options.
1200 *
1201 * @return void
1202 */
1203 public function copy_og_settings_from_social_to_titles() {
1204 $wpseo_social = get_option( 'wpseo_social' );
1205 $wpseo_titles = get_option( 'wpseo_titles' );
1206
1207 $copied_options = [];
1208 // Reset to the correct default value.
1209 $copied_options['open_graph_frontpage_title'] = '%%sitename%%';
1210
1211 $options = [
1212 'og_frontpage_title' => 'open_graph_frontpage_title',
1213 'og_frontpage_desc' => 'open_graph_frontpage_desc',
1214 'og_frontpage_image' => 'open_graph_frontpage_image',
1215 'og_frontpage_image_id' => 'open_graph_frontpage_image_id',
1216 ];
1217
1218 foreach ( $options as $social_option => $titles_option ) {
1219 if ( ! empty( $wpseo_social[ $social_option ] ) ) {
1220 $copied_options[ $titles_option ] = $wpseo_social[ $social_option ];
1221 }
1222 }
1223
1224 $wpseo_titles = array_merge( $wpseo_titles, $copied_options );
1225
1226 update_option( 'wpseo_titles', $wpseo_titles );
1227 }
1228
1229 /**
1230 * Reset the social options with the correct default values.
1231 *
1232 * @return void
1233 */
1234 public function reset_og_settings_to_default_values() {
1235 $wpseo_titles = get_option( 'wpseo_titles' );
1236 $updated_options = [];
1237
1238 $updated_options['social-title-author-wpseo'] = '%%name%%';
1239 $updated_options['social-title-archive-wpseo'] = '%%date%%';
1240
1241 /* translators: %s expands to the name of a post type (plural). */
1242 $post_type_archive_default = sprintf( __( '%s Archive', 'wordpress-seo' ), '%%pt_plural%%' );
1243
1244 /* translators: %s expands to the variable used for term title. */
1245 $term_archive_default = sprintf( __( '%s Archives', 'wordpress-seo' ), '%%term_title%%' );
1246
1247 $post_type_objects = get_post_types( [ 'public' => true ], 'objects' );
1248
1249 if ( $post_type_objects ) {
1250 foreach ( $post_type_objects as $pt ) {
1251 // Post types.
1252 if ( isset( $wpseo_titles[ 'social-title-' . $pt->name ] ) ) {
1253 $updated_options[ 'social-title-' . $pt->name ] = '%%title%%';
1254 }
1255 // Post type archives.
1256 if ( isset( $wpseo_titles[ 'social-title-ptarchive-' . $pt->name ] ) ) {
1257 $updated_options[ 'social-title-ptarchive-' . $pt->name ] = $post_type_archive_default;
1258 }
1259 }
1260 }
1261
1262 $taxonomy_objects = get_taxonomies( [ 'public' => true ], 'object' );
1263
1264 if ( $taxonomy_objects ) {
1265 foreach ( $taxonomy_objects as $tax ) {
1266 if ( isset( $wpseo_titles[ 'social-title-tax-' . $tax->name ] ) ) {
1267 $updated_options[ 'social-title-tax-' . $tax->name ] = $term_archive_default;
1268 }
1269 }
1270 }
1271
1272 $wpseo_titles = array_merge( $wpseo_titles, $updated_options );
1273
1274 update_option( 'wpseo_titles', $wpseo_titles );
1275 }
1276 }
1277