term_taxonomy_id = term_id Исправляем структуру Базы данных таксономий

В этой заметке будет код которые поправляет (исправляет, упрощает, обновляет) значения в таблицах wp_term_taxonomy и term_relationships в соответствии с новой логикой WordPress.

С версии 4.2 значение этой колонки term_taxonomy_id может равняться значению колонки term_id. Это нужно для потенциального отказа от таблицы term_taxonomy. Подробнее я писал про это здесь.

Код ниже изменяет/испрвляет значения колонки term_taxonomy_id у таблиц term_taxonomy и term_relationships, при этом не ломая ничего в структуре сайта.

/**
 * Makes equal DB fields `wp_terms` and `wp_term_taxonomy` - `term_taxonomy_id = term_id`
 *
 * Since WP 4.2 it is more correct and better.
 *
 * @version 1.1
 */
function term_id_to_term_taxonomy_id(){
	global $wpdb;

	$res = [];

	// let's find AUTO_INCREMENT
	$new_AI = 10 + max(
		$wpdb->get_var( "SELECT MAX(term_id) FROM $wpdb->terms" ),
		$wpdb->get_var( "SELECT MAX(term_taxonomy_id) FROM $wpdb->term_taxonomy" )
	);

	// set new AUTO_INCREMENT
	$res['t_AI'] = $wpdb->query( "ALTER TABLE $wpdb->terms AUTO_INCREMENT = $new_AI" );
	$res['tt_AI'] = $wpdb->query( "ALTER TABLE $wpdb->term_taxonomy AUTO_INCREMENT = $new_AI" );

	// increase the values so that we can safely change them later -
	// to make sure that no one term_id is equal to tt_id (term_id != tt_id).
	$res['tt val up'] = $wpdb->query( "UPDATE $wpdb->term_taxonomy SET term_taxonomy_id = term_taxonomy_id + $new_AI" );
	$res['tr val up'] = $wpdb->query( "UPDATE $wpdb->term_relationships SET term_taxonomy_id = term_taxonomy_id + $new_AI" );

	// change all ID
	$data = $wpdb->get_results( "SELECT * FROM $wpdb->term_taxonomy WHERE term_id != term_taxonomy_id" );

	foreach( $data as $dat ){

		$from = $dat->term_taxonomy_id;
		$to = $dat->term_id;

		$SET = "SET term_taxonomy_id = $to WHERE term_taxonomy_id = $from";

		$done = 0;
		if( $wpdb->query( "UPDATE $wpdb->term_taxonomy $SET" ) ){
			$done = $wpdb->query( "UPDATE $wpdb->term_relationships $SET" );
		}

		if( $done ){
			$res['UP']['DONE'][] = "$from > $to";
		}
		else{
			$res['UP']['NO'][] = "$from > $to";
		}
	}

	return $res;

}

// run the function
print_r( term_id_to_term_taxonomy_id() );