Ticket #30261: 30261.9.diff
File 30261.9.diff, 7.2 KB (added by , 9 years ago) |
---|
-
src/wp-admin/includes/schema.php
diff --git a/src/wp-admin/includes/schema.php b/src/wp-admin/includes/schema.php index 95ee375..e8f3037 100644
a b function populate_options() { 496 496 497 497 // 3.5 498 498 'link_manager_enabled' => 0, 499 500 // 4.3 501 'shared_terms_split' => 0, 499 502 ); 500 503 501 504 // 3.3 -
src/wp-admin/includes/upgrade.php
diff --git a/src/wp-admin/includes/upgrade.php b/src/wp-admin/includes/upgrade.php index f2f9aa7..d1c7c50 100644
a b function upgrade_430() { 1506 1506 } 1507 1507 1508 1508 if ( $wp_current_db_version < 32814 ) { 1509 split_all_shared_terms();1509 _wp_batch_split_terms(); 1510 1510 } 1511 1511 1512 1512 1513 if ( $wp_current_db_version < 33055 && 'utf8mb4' === $wpdb->charset ) { 1513 1514 if ( is_multisite() ) { 1514 1515 $tables = $wpdb->tables( 'blog' ); … … function maybe_convert_table_to_utf8mb4( $table ) { 1881 1882 } 1882 1883 1883 1884 /** 1884 * Splits all shared taxonomy terms.1885 *1886 * @since 4.3.01887 *1888 * @global wpdb $wpdb WordPress database abstraction object.1889 */1890 function split_all_shared_terms() {1891 global $wpdb;1892 1893 // Get a list of shared terms (those with more than one associated row in term_taxonomy).1894 $shared_terms = $wpdb->get_results(1895 "SELECT tt.term_id, t.*, count(*) as term_tt_count FROM {$wpdb->term_taxonomy} tt1896 LEFT JOIN {$wpdb->terms} t ON t.term_id = tt.term_id1897 GROUP BY t.term_id1898 HAVING term_tt_count > 1"1899 );1900 1901 if ( empty( $shared_terms ) ) {1902 return;1903 }1904 1905 // Rekey shared term array for faster lookups.1906 $_shared_terms = array();1907 foreach ( $shared_terms as $shared_term ) {1908 $term_id = intval( $shared_term->term_id );1909 $_shared_terms[ $term_id ] = $shared_term;1910 }1911 $shared_terms = $_shared_terms;1912 1913 // Get term taxonomy data for all shared terms.1914 $shared_term_ids = implode( ',', array_keys( $shared_terms ) );1915 $shared_tts = $wpdb->get_results( "SELECT * FROM {$wpdb->term_taxonomy} WHERE `term_id` IN ({$shared_term_ids})" );1916 1917 // Split term data recording is slow, so we do it just once, outside the loop.1918 $suspend = wp_suspend_cache_invalidation( true );1919 $split_term_data = get_option( '_split_terms', array() );1920 $skipped_first_term = $taxonomies = array();1921 foreach ( $shared_tts as $shared_tt ) {1922 $term_id = intval( $shared_tt->term_id );1923 1924 // Don't split the first tt belonging to a given term_id.1925 if ( ! isset( $skipped_first_term[ $term_id ] ) ) {1926 $skipped_first_term[ $term_id ] = 1;1927 continue;1928 }1929 1930 if ( ! isset( $split_term_data[ $term_id ] ) ) {1931 $split_term_data[ $term_id ] = array();1932 }1933 1934 // Keep track of taxonomies whose hierarchies need flushing.1935 if ( ! isset( $taxonomies[ $shared_tt->taxonomy ] ) ) {1936 $taxonomies[ $shared_tt->taxonomy ] = 1;1937 }1938 1939 // Split the term.1940 $split_term_data[ $term_id ][ $shared_tt->taxonomy ] = _split_shared_term( $shared_terms[ $term_id ], $shared_tt, false );1941 }1942 1943 // Rebuild the cached hierarchy for each affected taxonomy.1944 foreach ( array_keys( $taxonomies ) as $tax ) {1945 delete_option( "{$tax}_children" );1946 _get_term_hierarchy( $tax );1947 }1948 1949 wp_suspend_cache_invalidation( $suspend );1950 update_option( '_split_terms', $split_term_data );1951 }1952 1953 /**1954 1885 * Retrieve all options as it was for 1.2. 1955 1886 * 1956 1887 * @since 1.2.0 -
src/wp-includes/default-filters.php
diff --git a/src/wp-includes/default-filters.php b/src/wp-includes/default-filters.php index 46fafc1..4aed7c3 100644
a b add_filter( 'determine_current_user', 'wp_validate_logged_in_cookie', 20 ); 331 331 add_action( 'split_shared_term', '_wp_check_split_default_terms', 10, 4 ); 332 332 add_action( 'split_shared_term', '_wp_check_split_terms_in_menus', 10, 4 ); 333 333 add_action( 'split_shared_term', '_wp_check_split_nav_menu_terms', 10, 4 ); 334 add_action( 'split_shared_term_batch', '_wp_batch_split_terms' ); 334 335 335 336 /** 336 337 * Filters formerly mixed into wp-includes -
src/wp-includes/taxonomy.php
diff --git a/src/wp-includes/taxonomy.php b/src/wp-includes/taxonomy.php index 8e3e03d..a5abe61 100644
a b function _split_shared_term( $term_id, $term_taxonomy_id, $record = true ) { 4249 4249 $term_taxonomy_id = intval( $term_taxonomy->term_taxonomy_id ); 4250 4250 } 4251 4251 4252 // Don't try to split terms if database schema does not support shared slugs.4253 $current_db_version = get_option( 'db_version' );4254 if ( $current_db_version < 30133 ) {4255 return $term_id;4256 }4257 4258 4252 // If there are no shared term_taxonomy rows, there's nothing to do here. 4259 4253 $shared_tt_count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_taxonomy tt WHERE tt.term_id = %d AND tt.term_taxonomy_id != %d", $term_id, $term_taxonomy_id ) ); 4260 4254 … … function _split_shared_term( $term_id, $term_taxonomy_id, $record = true ) { 4339 4333 } 4340 4334 4341 4335 /** 4336 * Splits a batch of shared taxonomy terms. 4337 * 4338 * @since 4.3.0 4339 * 4340 * @global wpdb $wpdb WordPress database abstraction object. 4341 */ 4342 function _wp_batch_split_terms() { 4343 global $wpdb; 4344 4345 // Get a list of shared terms (those with more than one associated row in term_taxonomy). 4346 $shared_terms = $wpdb->get_results( 4347 "SELECT tt.term_id, t.*, count(*) as term_tt_count FROM {$wpdb->term_taxonomy} tt 4348 LEFT JOIN {$wpdb->terms} t ON t.term_id = tt.term_id 4349 GROUP BY t.term_id 4350 HAVING term_tt_count > 1 4351 LIMIT 20" 4352 ); 4353 4354 // Shared terms found? Need to run this script again. 4355 if ( ! empty( $shared_terms ) ) { 4356 wp_schedule_single_event( time() + ( 5 * MINUTE_IN_SECONDS ), 'split_shared_term_batch' ); 4357 } 4358 4359 // Rekey shared term array for faster lookups. 4360 $_shared_terms = array(); 4361 foreach ( $shared_terms as $shared_term ) { 4362 $term_id = intval( $shared_term->term_id ); 4363 $_shared_terms[ $term_id ] = $shared_term; 4364 } 4365 $shared_terms = $_shared_terms; 4366 4367 // Get term taxonomy data for all shared terms. 4368 $shared_term_ids = implode( ',', array_keys( $shared_terms ) ); 4369 $shared_tts = $wpdb->get_results( "SELECT * FROM {$wpdb->term_taxonomy} WHERE `term_id` IN ({$shared_term_ids})" ); 4370 4371 // Split term data recording is slow, so we do it just once, outside the loop. 4372 $suspend = wp_suspend_cache_invalidation( true ); 4373 $split_term_data = get_option( '_split_terms', array() ); 4374 $skipped_first_term = $taxonomies = array(); 4375 foreach ( $shared_tts as $shared_tt ) { 4376 $term_id = intval( $shared_tt->term_id ); 4377 4378 // Don't split the first tt belonging to a given term_id. 4379 if ( ! isset( $skipped_first_term[ $term_id ] ) ) { 4380 $skipped_first_term[ $term_id ] = 1; 4381 continue; 4382 } 4383 4384 if ( ! isset( $split_term_data[ $term_id ] ) ) { 4385 $split_term_data[ $term_id ] = array(); 4386 } 4387 4388 // Keep track of taxonomies whose hierarchies need flushing. 4389 if ( ! isset( $taxonomies[ $shared_tt->taxonomy ] ) ) { 4390 $taxonomies[ $shared_tt->taxonomy ] = 1; 4391 } 4392 4393 // Split the term. 4394 $split_term_data[ $term_id ][ $shared_tt->taxonomy ] = _split_shared_term( $shared_terms[ $term_id ], $shared_tt, false ); 4395 } 4396 4397 // Rebuild the cached hierarchy for each affected taxonomy. 4398 foreach ( array_keys( $taxonomies ) as $tax ) { 4399 delete_option( "{$tax}_children" ); 4400 _get_term_hierarchy( $tax ); 4401 } 4402 4403 wp_suspend_cache_invalidation( $suspend ); 4404 update_option( '_split_terms', $split_term_data ); 4405 } 4406 4407 /** 4342 4408 * Check default categories when a term gets split to see if any of them need to be updated. 4343 4409 * 4344 4410 * @ignore