Ticket #3460 (closed defect (bug): wontfix)
Duplicated default category after deleting a category
| Reported by: |
|
Owned by: |
|
|---|---|---|---|
| Priority: | normal | Milestone: | |
| Component: | Administration | Version: | 2.0.5 |
| Severity: | normal | Keywords: | category |
| Cc: | zhouqb@… |
Description
If a category is deleted, all the posts under it will be assigned the default category.
A better approach is checking if it has been assigned another category. If yes, don't apply the default category - that's meaningless.
A real bug is, if the post was assigned both the deleted category and the default, the default will be assigned once more, resulting in two identical rows (except rel_id column) in the wp_post2cat table. Also the fix is adding a check, but following the approach above will avoid such situation.
Attachments
Change History
comment:1
markjaquith — 5 years ago
- Owner changed from anonymous to markjaquith
- Status changed from new to assigned
- Milestone changed from 2.1 to 2.0.7
comment:3
markjaquith — 5 years ago
The functions used to do it in 2.1 (wp_get_post_categories() and wp_set_post_categories() don't exist in 2.0.x
I've attached a patch that should do the equivalent in 2.0.x, but I'd like to save it for another milestone. It's not quite ideal, because it causes one query per post that existed in the category you're deleting.
markjaquith — 5 years ago
-
attachment
add_to_default_cat_posts_that_only_exist_in_deleted_cat.diff
added
Patch for 2.0.x

This has been fixed for 2.1
Possible 2.0.7 milestone.
Here is the 2.1 code, for reference:
// Only set posts and links to the default category if they're not in another category already. $default_cat = get_option('default_category'); $posts = $wpdb->get_col("SELECT post_id FROM $wpdb->post2cat WHERE category_id='$cat_ID'"); if ( is_array($posts) ) foreach ($posts as $post_id) { $cats = wp_get_post_categories($post_id); if ( 1 == count($cats) ) $cats = array($default_cat); else $cats = array_diff($cats, array($cat_ID)); wp_set_post_categories($post_id, $cats); }