WordPress.org

Make WordPress Core

Ticket #30261: 30261.7.diff

File 30261.7.diff, 7.7 KB (added by boonebgorges, 4 years ago)
  • src/wp-admin/includes/admin-filters.php

    diff --git src/wp-admin/includes/admin-filters.php src/wp-admin/includes/admin-filters.php
    index d0709f4..3df9673 100644
    add_action( 'profile_update', 'default_password_nag_edit_user', 10, 2 ); 
    100100// Update hooks.
    101101add_action( 'admin_init', 'wp_plugin_update_rows' );
    102102add_action( 'admin_init', 'wp_theme_update_rows'  );
     103add_action( 'admin_footer', 'maybe_split_shared_terms' );
    103104
    104105add_action( 'admin_notices', 'update_nag',      3  );
    105106add_action( 'admin_notices', 'maintenance_nag', 10 );
  • src/wp-admin/includes/schema.php

    diff --git src/wp-admin/includes/schema.php src/wp-admin/includes/schema.php
    index 95ee375..e8f3037 100644
    function populate_options() { 
    496496
    497497        // 3.5
    498498        'link_manager_enabled' => 0,
     499
     500        // 4.3
     501        'shared_terms_split' => 0,
    499502        );
    500503
    501504        // 3.3
  • src/wp-admin/includes/taxonomy.php

    diff --git src/wp-admin/includes/taxonomy.php src/wp-admin/includes/taxonomy.php
    index 4f11bdb..0837ec9 100644
    function wp_create_term($tag_name, $taxonomy = 'post_tag') { 
    288288
    289289        return wp_insert_term($tag_name, $taxonomy);
    290290}
     291
     292/**
     293 * Initialize the shared term splitting routine, if necessary.
     294 *
     295 * @since 4.3.0
     296 */
     297function maybe_split_shared_terms() {
     298        // Shared terms only need to be split once.
     299        if ( get_option( 'shared_terms_split' ) ) {
     300                return;
     301        }
     302
     303        // Run only for authors, on normal page loads, to prevent flooding.
     304        if ( ! current_user_can( 'edit_posts' ) || ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) {
     305                return;
     306        }
     307
     308        wp_batch_split_terms();
     309}
     310
     311/**
     312 * Splits a batch of shared taxonomy terms.
     313 *
     314 * @since 4.3.0
     315 *
     316 * @global wpdb $wpdb WordPress database abstraction object.
     317 */
     318function wp_batch_split_terms() {
     319        global $wpdb;
     320
     321        // Get a list of shared terms (those with more than one associated row in term_taxonomy).
     322        $shared_terms = $wpdb->get_results(
     323                "SELECT tt.term_id, t.*, count(*) as term_tt_count FROM {$wpdb->term_taxonomy} tt
     324                 LEFT JOIN {$wpdb->terms} t ON t.term_id = tt.term_id
     325                 GROUP BY t.term_id
     326                 HAVING term_tt_count > 1
     327                 LIMIT 20"
     328        );
     329
     330        // No shared terms found? No need to run this script again.
     331        if ( empty( $shared_terms ) ) {
     332                update_option( 'shared_terms_split', 1 );
     333                return;
     334        }
     335
     336        // Rekey shared term array for faster lookups.
     337        $_shared_terms = array();
     338        foreach ( $shared_terms as $shared_term ) {
     339                $term_id = intval( $shared_term->term_id );
     340                $_shared_terms[ $term_id ] = $shared_term;
     341        }
     342        $shared_terms = $_shared_terms;
     343
     344        // Get term taxonomy data for all shared terms.
     345        $shared_term_ids = implode( ',', array_keys( $shared_terms ) );
     346        $shared_tts = $wpdb->get_results( "SELECT * FROM {$wpdb->term_taxonomy} WHERE `term_id` IN ({$shared_term_ids})" );
     347
     348        // Split term data recording is slow, so we do it just once, outside the loop.
     349        $suspend = wp_suspend_cache_invalidation( true );
     350        $split_term_data = get_option( '_split_terms', array() );
     351        $skipped_first_term = $taxonomies = array();
     352        foreach ( $shared_tts as $shared_tt ) {
     353                $term_id = intval( $shared_tt->term_id );
     354
     355                // Don't split the first tt belonging to a given term_id.
     356                if ( ! isset( $skipped_first_term[ $term_id ] ) ) {
     357                        $skipped_first_term[ $term_id ] = 1;
     358                        continue;
     359                }
     360
     361                if ( ! isset( $split_term_data[ $term_id ] ) ) {
     362                        $split_term_data[ $term_id ] = array();
     363                }
     364
     365                // Keep track of taxonomies whose hierarchies need flushing.
     366                if ( ! isset( $taxonomies[ $shared_tt->taxonomy ] ) ) {
     367                        $taxonomies[ $shared_tt->taxonomy ] = 1;
     368                }
     369
     370                // Split the term.
     371                $split_term_data[ $term_id ][ $shared_tt->taxonomy ] = _split_shared_term( $shared_terms[ $term_id ], $shared_tt, false );
     372        }
     373
     374        // Rebuild the cached hierarchy for each affected taxonomy.
     375        foreach ( array_keys( $taxonomies ) as $tax ) {
     376                delete_option( "{$tax}_children" );
     377                _get_term_hierarchy( $tax );
     378        }
     379
     380        wp_suspend_cache_invalidation( $suspend );
     381        update_option( '_split_terms', $split_term_data );
     382}
  • src/wp-admin/includes/upgrade.php

    diff --git src/wp-admin/includes/upgrade.php src/wp-admin/includes/upgrade.php
    index f2f9aa7..97e3296 100644
    function upgrade_430() { 
    15051505                upgrade_430_fix_comments();
    15061506        }
    15071507
    1508         if ( $wp_current_db_version < 32814 ) {
    1509                 split_all_shared_terms();
    1510         }
    1511 
    15121508        if ( $wp_current_db_version < 33055 && 'utf8mb4' === $wpdb->charset ) {
    15131509                if ( is_multisite() ) {
    15141510                        $tables = $wpdb->tables( 'blog' );
    function maybe_convert_table_to_utf8mb4( $table ) { 
    18811877}
    18821878
    18831879/**
    1884  * Splits all shared taxonomy terms.
    1885  *
    1886  * @since 4.3.0
    1887  *
    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} tt
    1896                  LEFT JOIN {$wpdb->terms} t ON t.term_id = tt.term_id
    1897                  GROUP BY t.term_id
    1898                  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 /**
    19541880 * Retrieve all options as it was for 1.2.
    19551881 *
    19561882 * @since 1.2.0
  • src/wp-includes/taxonomy.php

    diff --git src/wp-includes/taxonomy.php src/wp-includes/taxonomy.php
    index 8e3e03d..55c8ecb 100644
    function _split_shared_term( $term_id, $term_taxonomy_id, $record = true ) { 
    42494249                $term_taxonomy_id = intval( $term_taxonomy->term_taxonomy_id );
    42504250        }
    42514251
    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 
    42584252        // If there are no shared term_taxonomy rows, there's nothing to do here.
    42594253        $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 ) );
    42604254