WordPress.org

Make WordPress Core

Changeset 6157


Ignore:
Timestamp:
09/22/07 18:01:08 (7 years ago)
Author:
ryan
Message:

Term with slug that conflicts with existing term with different parent gets a new term entry with a unique slug. see #5034

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-admin/includes/taxonomy.php

    r6026 r6157  
    7474    $parent = $category_parent; 
    7575 
    76     $name = apply_filters('pre_category_name', $name); 
    77  
    78     if ( empty ($slug) ) 
    79         $slug = sanitize_title($name); 
    80     else 
    81         $slug = sanitize_title($slug); 
    82     $slug = apply_filters('pre_category_nicename', $slug); 
    83  
    84     if ( empty ($description) ) 
    85         $description = ''; 
    86     $description = apply_filters('pre_category_description', $description); 
    87  
    8876    $parent = (int) $parent; 
    8977    if ( empty($parent) || !category_exists( $parent ) || ($cat_ID && cat_is_ancestor_of($cat_ID, $parent) ) ) 
     
    9785        $cat_ID = wp_insert_term($cat_name, 'category', $args); 
    9886 
     87    if ( is_wp_error($cat_ID) ) 
     88        return 0; 
     89 
    9990    return $cat_ID['term_id']; 
    10091} 
     
    10596    $cat_ID = (int) $catarr['cat_ID']; 
    10697 
    107     if( $cat_ID == $catarr['category_parent'] ) 
     98    if ( $cat_ID == $catarr['category_parent'] ) 
    10899        return false; 
    109100 
  • trunk/wp-includes/taxonomy.php

    r6125 r6157  
    708708        $value = apply_filters("pre_term_$field", $value, $taxonomy); 
    709709        $value = apply_filters("pre_${taxonomy}_$field", $value); 
     710        // Back compat filters 
     711        if ( 'slug' == $field ) 
     712            $value = apply_filters('pre_category_nicename', $value); 
     713             
    710714    } else if ( 'rss' == $context ) { 
    711715        $value = apply_filters("term_${field}_rss", $value, $taxonomy); 
     
    915919    $args = wp_parse_args($args, $defaults); 
    916920    $args['name'] = $term; 
     921    $args['taxonomy'] = $taxonomy; 
    917922    $args = sanitize_term($args, $taxonomy, 'db'); 
    918923    extract($args, EXTR_SKIP); 
     
    937942        $wpdb->query("INSERT INTO $wpdb->terms (name, slug, term_group) VALUES ('$name', '$slug', '$term_group')"); 
    938943        $term_id = (int) $wpdb->insert_id; 
     944    } else if ( is_taxonomy_hierarchical($taxonomy) && !empty($parent) ) { 
     945        // If the taxonomy supports hierarchy and the term has a parent, make the slug unique 
     946        // by incorporating parent slugs. 
     947        $slug = wp_unique_term_slug($slug, (object) $args); 
     948        $wpdb->query("INSERT INTO $wpdb->terms (name, slug, term_group) VALUES ('$name', '$slug', '$term_group')"); 
     949        $term_id = (int) $wpdb->insert_id; 
    939950    } 
    940951 
     
    10201031} 
    10211032 
     1033function wp_unique_term_slug($slug, $term) { 
     1034    global $wpdb; 
     1035 
     1036    // If the taxonomy supports hierarchy and the term has a parent, make the slug unique 
     1037    // by incorporating parent slugs. 
     1038    if ( is_taxonomy_hierarchical($term->taxonomy) && !empty($term->parent) ) { 
     1039        $the_parent = $term->parent; 
     1040        while ( ! empty($the_parent) ) { 
     1041            $parent_term = get_term($the_parent, $term->taxonomy); 
     1042            if ( is_wp_error($parent_term) || empty($parent_term) ) 
     1043                break; 
     1044                $slug .= '-' . $parent_term->slug; 
     1045            if ( empty($parent_term->parent) ) 
     1046                break; 
     1047            $the_parent = $parent_term->parent; 
     1048        } 
     1049    } 
     1050 
     1051    // If we didn't get a unique slug, try appending a number to make it unique. 
     1052    if ( $wpdb->get_var("SELECT slug FROM $wpdb->terms WHERE slug = '$slug'") ) { 
     1053        $num = 2; 
     1054        do { 
     1055            $alt_slug = $slug . "-$num"; 
     1056            $num++; 
     1057            $slug_check = $wpdb->get_var("SELECT slug FROM $wpdb->terms WHERE slug = '$alt_slug'"); 
     1058        } while ( $slug_check ); 
     1059        $slug = $alt_slug; 
     1060    } 
     1061 
     1062    return $slug; 
     1063} 
     1064 
    10221065function wp_update_term( $term, $taxonomy, $args = array() ) { 
    10231066    global $wpdb; 
     
    10421085    extract($args, EXTR_SKIP); 
    10431086 
    1044     if ( empty($slug) ) 
     1087    $empty_slug = false; 
     1088    if ( empty($slug) ) { 
     1089        $empty_slug = true; 
    10451090        $slug = sanitize_title($name); 
     1091    } 
    10461092 
    10471093    if ( $alias_of ) { 
     
    10571103    } 
    10581104 
     1105    // Check for duplicate slug 
     1106    $id = $wpdb->get_var("SELECT term_id FROM $wpdb->terms WHERE slug = '$slug'"); 
     1107    if ( $id && ($id != $term_id) ) { 
     1108        // If an empty slug was passed, reset the slug to something unique. 
     1109        // Otherwise, bail. 
     1110        if ( $empty_slug ) 
     1111            $slug = wp_unique_term_slug($slug, (object) $args); 
     1112        else 
     1113            return new WP_Error('duplicate_term_slug', sprintf(__('The slug "%s" is already in use by another term'), $slug)); 
     1114    } 
     1115 
    10591116    $wpdb->query("UPDATE $wpdb->terms SET name = '$name', slug = '$slug', term_group = '$term_group' WHERE term_id = '$term_id'"); 
    10601117 
Note: See TracChangeset for help on using the changeset viewer.