Обновляем ID терминов после разделения и делаем чтобы term_taxonomy_id = term_id.
Исправляем структуру Базы данных таксономий. В этой заметке будет код, которые поправляет (исправляет, упрощает, обновляет) значения в таблицах wp_term_taxonomy
и term_relationships
в соответствии с новой логикой WordPress.
С версии 4.2 значение этой колонки term_taxonomy_id
может равняться значению колонки term_id
. Это нужно для потенциального отказа от таблицы term_taxonomy
. Подробнее я писал про это здесь.
Ниже вы найдете код который обновляет ID терминов (элементов таксономии) в базе данных (БД), так чтобы после разделения терминов у каждого термина был свой уникальный ID.
Код ниже изменяет/испрвляет значения колонки 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() );