Make WordPress Core

Changeset 6157


Ignore:
Timestamp:
09/22/2007 06:01:08 PM (17 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.