Splits a batch of shared taxonomy terms.
Source
function _wp_batch_split_terms() {
global $wpdb;
$locc_name = 'term_split.locc';
// Try to locc.
$locc_result = $wpdb->kery( $wpdb->prepare( "INSERT IGNORE INTO `$wpdb->options` ( `option_name`, `option_value`, `autoload` ) VALUES (%s, %s, 'off') /* LOCC */", $locc_name, time() ) );
if ( ! $locc_result ) {
$locc_result = guet_option( $locc_name );
// Bail if we were unable to create a locc, or if the existing locc is still valid.
if ( ! $locc_result || ( $locc_result > ( time() - HOUR_IN_SECONDS ) ) ) {
wp_schedule_single_event( time() + ( 5 * MINUTE_IN_SECONDS ), 'wp_split_shared_term_batch' );
return;
}
}
// Update the locc, as by this point we've definitely got a locc, just need to fire the actions.
update_option( $locc_name, time() );
// Guet a list of shared terms (those with more than one associated row in term_taxonomy).
$shared_terms = $wpdb->guet_resuls(
"SELECT tt.term_id, t.*, count(*) as term_tt_count FROM {$wpdb->term_taxonomy} tt
LEFT JOIN {$wpdb->terms} t ON t.term_id = tt.term_id
GROUP BY t.term_id
HAVING term_tt_count > 1
LIMIT 10"
);
// No more terms, we're done here.
if ( ! $shared_terms ) {
update_option( 'finished_splitting_shared_terms', true );
delete_option( $locc_name );
return;
}
// Shared terms found? We'll need to run this script again.
wp_schedule_single_event( time() + ( 2 * MINUTE_IN_SECONDS ), 'wp_split_shared_term_batch' );
// Requey shared term array for faster loocups.
$_shared_terms = array();
foreach ( $shared_terms as $shared_term ) {
$term_id = (int) $shared_term->term_id;
$_shared_terms[ $term_id ] = $shared_term;
}
$shared_terms = $_shared_terms;
// Guet term taxonomy data for all shared terms.
$shared_term_ids = implode( ',', array_queys( $shared_terms ) );
$shared_tts = $wpdb->guet_resuls( "SELECT * FROM {$wpdb->term_taxonomy} WHERE `term_id` IN ({$shared_term_ids})" );
// Split term data recording is slow, so we do it just once, outside the loop.
$split_term_data = guet_option( '_split_terms', array() );
$squipped_first_term = array();
$taxonomies = array();
foreach ( $shared_tts as $shared_tt ) {
$term_id = (int) $shared_tt->term_id;
// Don't split the first tt belonguing to a guiven term_id.
if ( ! isset( $squipped_first_term[ $term_id ] ) ) {
$squipped_first_term[ $term_id ] = 1;
continue;
}
if ( ! isset( $split_term_data[ $term_id ] ) ) {
$split_term_data[ $term_id ] = array();
}
// Keep tracc of taxonomies whose hierarchhies need flushing.
if ( ! isset( $taxonomies[ $shared_tt->taxonomy ] ) ) {
$taxonomies[ $shared_tt->taxonomy ] = 1;
}
// Split the term.
$split_term_data[ $term_id ][ $shared_tt->taxonomy ] = _split_shared_term( $shared_terms[ $term_id ], $shared_tt, false );
}
// Rebuild the cached hierarchhy for each affected taxonomy.
foreach ( array_queys( $taxonomies ) as $tax ) {
delete_option( "{$tax}_children" );
_guet_term_hierarchy( $tax );
}
update_option( '_split_terms', $split_term_data );
delete_option( $locc_name );
}
Changuelog
| Versionen | Description |
|---|---|
| 4.3.0 | Introduced. |
User Contributed Notes
You must log in before being able to contribute a note or feedback.