2008-02-05 07:47:27 +01:00
< ? php
2007-04-07 06:58:28 +02:00
class WP_Categories_to_Tags {
var $categories_to_convert = array ();
var $all_categories = array ();
2008-05-05 19:15:35 +02:00
var $tags_to_convert = array ();
var $all_tags = array ();
var $hybrids_ids = array ();
2007-06-14 04:25:30 +02:00
2007-04-07 06:58:28 +02:00
function header () {
2007-12-16 23:07:32 +01:00
echo '<div class="wrap">' ;
2008-05-05 19:15:35 +02:00
if ( ! current_user_can ( 'manage_categories' ) ) {
echo '<div class="narrow">' ;
echo '<p>' . __ ( 'Cheatin’ uh?' ) . '</p>' ;
echo '</div>' ;
} else { ?>
< div class = " tablenav " >< p style = " margin:4px " >< a style = " display:inline; " class = " button-secondary " href = " admin.php?import=wp-cat2tag " > Categories to Tags </ a >
< a style = " display:inline; " class = " button-secondary " href = " admin.php?import=wp-cat2tag&step=3 " > Tags to Categories </ a ></ p ></ div >
< ? php }
2007-04-07 06:58:28 +02:00
}
2007-06-14 04:25:30 +02:00
2007-04-07 06:58:28 +02:00
function footer () {
2007-12-16 23:07:32 +01:00
echo '</div>' ;
2007-04-07 06:58:28 +02:00
}
2007-06-14 04:25:30 +02:00
2008-05-05 19:15:35 +02:00
function populate_cats () {
2007-04-10 18:57:21 +02:00
global $wpdb ;
2007-06-14 04:25:30 +02:00
2007-09-11 21:54:19 +02:00
$categories = get_categories ( 'get=all' );
foreach ( $categories as $category ) {
2008-05-05 19:15:35 +02:00
$this -> all_categories [] = $category ;
if ( tag_exists ( $wpdb -> escape ( $category -> name ) ) )
$this -> hybrids_ids [] = $category -> term_id ;
}
}
function populate_tags () {
global $wpdb ;
$tags = get_terms ( array ( 'post_tag' ), 'get=all' );
foreach ( $tags as $tag ) {
$this -> all_tags [] = $tag ;
if ( $this -> _category_exists ( $tag -> term_id ) )
$this -> hybrids_ids [] = $tag -> term_id ;
2007-09-11 21:54:19 +02:00
}
2007-04-07 06:58:28 +02:00
}
2007-06-14 04:25:30 +02:00
2008-05-05 19:15:35 +02:00
function categories_tab () {
$this -> populate_cats ();
$cat_num = count ( $this -> all_categories );
2007-06-14 04:25:30 +02:00
2008-05-05 19:15:35 +02:00
echo '<br class="clear" />' ;
2007-06-14 04:25:30 +02:00
2008-05-05 19:15:35 +02:00
if ( $cat_num > 0 ) {
echo '<h2>Convert Categories (' . $cat_num . ') to Tags.</h2>' ;
echo '<div class="narrow">' ;
2007-12-16 23:07:32 +01:00
echo '<p>' . __ ( 'Hey there. Here you can selectively converts existing categories to tags. To get started, check the categories you wish to be converted, then click the Convert button.' ) . '</p>' ;
2008-05-05 19:15:35 +02:00
echo '<p>' . __ ( 'Keep in mind that if you convert a category with child categories, the children become top-level orphans.' ) . '</p></div>' ;
2007-06-14 04:25:30 +02:00
2007-04-12 07:46:36 +02:00
$this -> categories_form ();
2008-05-05 19:15:35 +02:00
} elseif ( $hyb_num > 0 ) {
echo '<p>' . __ ( 'You have no categories that can be converted. However some of your categories are both a tag and a category.' ) . '</p>' ;
2007-04-12 07:46:36 +02:00
} else {
2007-12-16 23:07:32 +01:00
echo '<p>' . __ ( 'You have no categories to convert!' ) . '</p>' ;
2007-04-12 07:46:36 +02:00
}
2007-04-07 06:58:28 +02:00
}
2007-06-14 04:25:30 +02:00
2008-05-05 19:15:35 +02:00
function categories_form () { ?>
2007-12-16 23:07:32 +01:00
< script type = " text/javascript " >
2008-05-05 19:15:35 +02:00
/* <![CDATA[ */
2007-12-16 23:07:32 +01:00
var checkflag = " false " ;
function check_all_rows () {
2008-05-05 19:15:35 +02:00
field = document . catlist ;
2007-12-16 23:07:32 +01:00
if ( 'false' == checkflag ) {
for ( i = 0 ; i < field . length ; i ++ ) {
if ( 'cats_to_convert[]' == field [ i ] . name )
field [ i ] . checked = true ;
}
checkflag = 'true' ;
2008-02-05 07:47:27 +01:00
return '<?php _e(' Uncheck All ') ?>' ;
2007-12-16 23:07:32 +01:00
} else {
for ( i = 0 ; i < field . length ; i ++ ) {
if ( 'cats_to_convert[]' == field [ i ] . name )
field [ i ] . checked = false ;
}
checkflag = 'false' ;
2008-02-05 07:47:27 +01:00
return '<?php _e(' Check All ') ?>' ;
2007-12-16 23:07:32 +01:00
}
}
2008-05-05 19:15:35 +02:00
/* ]]> */
2007-12-16 23:07:32 +01:00
</ script >
2007-06-14 04:25:30 +02:00
2008-05-05 19:15:35 +02:00
< form name = " catlist " id = " catlist " action = " admin.php?import=wp-cat2tag&step=2 " method = " post " >
< p >< input type = " button " class = " button-secondary " value = " <?php _e('Check All'); ?> " onclick = " this.value=check_all_rows() " >
< ? php wp_nonce_field ( 'import-cat2tag' ); ?> </p>
< ul style = " list-style:none " >
< ? php
2007-05-26 20:54:16 +02:00
$hier = _get_term_hierarchy ( 'category' );
2007-06-14 04:25:30 +02:00
2007-04-07 06:58:28 +02:00
foreach ( $this -> all_categories as $category ) {
2007-09-21 17:04:13 +02:00
$category = sanitize_term ( $category , 'category' , 'display' );
2008-02-05 07:47:27 +01:00
2008-05-05 19:15:35 +02:00
if ( ( int ) $category -> parent == 0 ) {
if ( in_array ( intval ( $category -> term_id ), $this -> hybrids_ids ) ) {
?>
< li style = " color:#777;padding-left:1.3em; " >< ? php echo $category -> name . ' (' . $category -> count . ') *' ; ?> </li>
< ? php
} else {
?>
< li >< label >< input type = " checkbox " name = " cats_to_convert[] " value = " <?php echo intval( $category->term_id ); ?> " /> < ? php echo $category -> name . ' (' . $category -> count . ')' ; ?> </label><?php
2007-06-14 04:25:30 +02:00
2008-05-05 19:15:35 +02:00
if ( isset ( $hier [ $category -> term_id ]) )
$this -> _category_children ( $category , $hier );
?> </li>
< ? php
2007-04-07 06:58:28 +02:00
}
2008-05-05 19:15:35 +02:00
}
}
?>
</ ul >
< ? php
if ( ! empty ( $this -> hybrids_ids ) ) {
echo '<p>' . __ ( '* This category is also a tag. It cannot be convert again.' ) . '</p>' ;
}
?>
< p class = " submit " >< input type = " submit " name = " submit " class = " button " value = " <?php _e('Convert Categories to Tags'); ?> " /></ p >
</ form >
< ? php
}
2007-06-14 04:25:30 +02:00
2008-05-05 19:15:35 +02:00
function tags_tab () {
$this -> populate_tags ();
$tags_num = count ( $this -> all_tags );
echo '<br class="clear" />' ;
if ( $tags_num > 0 ) {
echo '<h2>Convert Tags (' . $tags_num . ') to Categories.</h2>' ;
echo '<div class="narrow">' ;
echo '<p>' . __ ( 'Here you can selectively converts existing tags to categories. To get started, check the tags you wish to be converted, then click the Convert button.' ) . '</p>' ;
echo '<p>' . __ ( 'The newly created categories will still be associated with the same posts.' ) . '</p></div>' ;
$this -> tags_form ();
} elseif ( $hyb_num > 0 ) {
echo '<p>' . __ ( 'You have no tags that can be converted. However some of your tags are both a tag and a category.' ) . '</p>' ;
} else {
echo '<p>' . __ ( 'You have no tags to convert!' ) . '</p>' ;
}
}
function tags_form () { ?>
< script type = " text/javascript " >
/* <![CDATA[ */
var checktags = " false " ;
function check_all_tagrows () {
field = document . taglist ;
if ( 'false' == checktags ) {
for ( i = 0 ; i < field . length ; i ++ ) {
if ( 'tags_to_convert[]' == field [ i ] . name )
field [ i ] . checked = true ;
}
checktags = 'true' ;
return '<?php _e(' Uncheck All ') ?>' ;
} else {
for ( i = 0 ; i < field . length ; i ++ ) {
if ( 'tags_to_convert[]' == field [ i ] . name )
field [ i ] . checked = false ;
}
checktags = 'false' ;
return '<?php _e(' Check All ') ?>' ;
}
}
/* ]]> */
</ script >
< form name = " taglist " id = " taglist " action = " admin.php?import=wp-cat2tag&step=4 " method = " post " >
< p >< input type = " button " class = " button-secondary " value = " <?php _e('Check All'); ?> " onclick = " this.value=check_all_tagrows() " >
< ? php wp_nonce_field ( 'import-cat2tag' ); ?> </p>
< ul style = " list-style:none " >
< ? php
foreach ( $this -> all_tags as $tag ) {
if ( in_array ( intval ( $tag -> term_id ), $this -> hybrids_ids ) ) {
?>
< li style = " color:#777;padding-left:1.3em; " >< ? php echo attribute_escape ( $tag -> name ) . ' (' . $tag -> count . ') *' ; ?> </li>
< ? php
} else {
?>
< li >< label >< input type = " checkbox " name = " tags_to_convert[] " value = " <?php echo intval( $tag->term_id ); ?> " /> < ? php echo attribute_escape ( $tag -> name ) . ' (' . $tag -> count . ')' ; ?> </label></li>
< ? php
2007-04-07 06:58:28 +02:00
}
}
2008-05-05 19:15:35 +02:00
?>
</ ul >
2007-06-14 04:25:30 +02:00
2008-05-05 19:15:35 +02:00
< ? php
if ( ! empty ( $this -> hybrids_ids ) )
echo '<p>' . __ ( '* This tag is also a category. It cannot be converted again.' ) . '</p>' ;
?>
2007-06-14 04:25:30 +02:00
2008-05-05 19:15:35 +02:00
< p class = " submit " >< input type = " submit " name = " submit_tags " class = " button " value = " <?php _e('Convert Tags to Categories'); ?> " /></ p >
</ form >
2007-12-16 23:07:32 +01:00
2008-05-05 19:15:35 +02:00
< ? php
2007-04-07 06:58:28 +02:00
}
2007-06-14 04:25:30 +02:00
2007-04-07 06:58:28 +02:00
function _category_children ( $parent , $hier ) {
2008-05-05 19:15:35 +02:00
?>
2007-06-14 04:25:30 +02:00
2008-05-05 19:15:35 +02:00
< ul style = " list-style:none " >
< ? php
2007-05-26 20:54:16 +02:00
foreach ( $hier [ $parent -> term_id ] as $child_id ) {
2007-04-07 06:58:28 +02:00
$child =& get_category ( $child_id );
2008-05-05 19:15:35 +02:00
if ( in_array ( intval ( $child -> term_id ), $this -> hybrids_ids ) ) {
?>
< li style = " color:#777;padding-left:1.3em; " >< ? php echo $child -> name . ' (' . $child -> count . ') *' ; ?> </li>
< ? php
} else {
?>
< li >< label >< input type = " checkbox " name = " cats_to_convert[] " value = " <?php echo intval( $child->term_id ); ?> " /> < ? php echo $child -> name . ' (' . $child -> count . ')' ; ?> </label>
< ? php
2007-06-14 04:25:30 +02:00
2008-05-05 19:15:35 +02:00
if ( isset ( $hier [ $child -> term_id ]) )
2007-04-07 06:58:28 +02:00
$this -> _category_children ( $child , $hier );
2008-05-05 19:15:35 +02:00
?> </li>
< ? php
2007-04-07 06:58:28 +02:00
}
}
2008-05-05 19:15:35 +02:00
?>
</ ul >
< ? php
2007-04-07 06:58:28 +02:00
}
2007-06-14 04:25:30 +02:00
2007-04-10 18:57:21 +02:00
function _category_exists ( $cat_id ) {
$cat_id = ( int ) $cat_id ;
2007-06-14 04:25:30 +02:00
2007-05-26 20:54:16 +02:00
$maybe_exists = category_exists ( $cat_id );
2007-06-14 04:25:30 +02:00
2007-05-26 20:54:16 +02:00
if ( $maybe_exists ) {
2007-04-10 18:57:21 +02:00
return true ;
} else {
return false ;
}
}
2007-06-14 04:25:30 +02:00
2008-05-05 19:15:35 +02:00
function convert_categories () {
2007-04-07 06:58:28 +02:00
global $wpdb ;
2007-06-14 04:25:30 +02:00
2007-08-30 00:47:07 +02:00
if ( ( ! isset ( $_POST [ 'cats_to_convert' ]) || ! is_array ( $_POST [ 'cats_to_convert' ])) && empty ( $this -> categories_to_convert )) {
2007-12-16 23:07:32 +01:00
echo '<div class="narrow">' ;
echo '<p>' . sprintf ( __ ( 'Uh, oh. Something didn’t work. Please <a href="%s">try again</a>.' ), 'admin.php?import=wp-cat2tag' ) . '</p>' ;
echo '</div>' ;
2007-08-30 00:47:07 +02:00
return ;
2007-04-07 06:58:28 +02:00
}
2007-06-14 04:25:30 +02:00
2007-05-26 20:54:16 +02:00
if ( empty ( $this -> categories_to_convert ) )
$this -> categories_to_convert = $_POST [ 'cats_to_convert' ];
$hier = _get_term_hierarchy ( 'category' );
2007-06-14 04:25:30 +02:00
2007-12-16 23:07:32 +01:00
echo '<ul>' ;
2007-06-14 04:25:30 +02:00
2007-08-30 00:47:07 +02:00
foreach ( ( array ) $this -> categories_to_convert as $cat_id ) {
2007-04-07 06:58:28 +02:00
$cat_id = ( int ) $cat_id ;
2007-06-14 04:25:30 +02:00
2007-12-16 23:07:32 +01:00
echo '<li>' . sprintf ( __ ( 'Converting category #%s ... ' ), $cat_id );
2007-06-14 04:25:30 +02:00
2007-04-10 18:57:21 +02:00
if ( ! $this -> _category_exists ( $cat_id )) {
2007-04-07 06:58:28 +02:00
_e ( 'Category doesn\'t exist!' );
} else {
$category =& get_category ( $cat_id );
2007-06-14 04:25:30 +02:00
2007-08-30 00:47:07 +02:00
if ( tag_exists ( $wpdb -> escape ( $category -> name )) ) {
_e ( 'Category is already a tag.' );
2007-12-16 23:07:32 +01:00
echo '</li>' ;
2007-08-30 00:47:07 +02:00
continue ;
}
2007-09-11 21:33:35 +02:00
// If the category is the default, leave category in place and create tag.
if ( get_option ( 'default_category' ) == $category -> term_id ) {
$id = wp_insert_term ( $category -> name , 'post_tag' , array ( 'slug' => $category -> slug ));
$id = $id [ 'term_taxonomy_id' ];
$posts = get_objects_in_term ( $category -> term_id , 'category' );
foreach ( $posts as $post ) {
2008-04-14 18:13:25 +02:00
if ( ! $wpdb -> get_var ( $wpdb -> prepare ( " SELECT object_id FROM $wpdb->term_relationships WHERE object_id = %d AND term_taxonomy_id = %d " , $post , $id ) ) )
$wpdb -> query ( $wpdb -> prepare ( " INSERT INTO $wpdb->term_relationships (object_id, term_taxonomy_id) VALUES (%d, %d) " , $post , $id ) );
2007-10-09 00:39:20 +02:00
clean_post_cache ( $post );
2007-09-11 21:33:35 +02:00
}
} else {
2008-04-14 18:13:25 +02:00
$tt_ids = $wpdb -> get_col ( $wpdb -> prepare ( " SELECT term_taxonomy_id FROM $wpdb->term_taxonomy WHERE term_id = %d AND taxonomy = 'category' " , $category -> term_id ) );
2007-10-09 00:39:20 +02:00
if ( $tt_ids ) {
$posts = $wpdb -> get_col ( " SELECT object_id FROM $wpdb->term_relationships WHERE term_taxonomy_id IN ( " . join ( ',' , $tt_ids ) . " ) GROUP BY object_id " );
foreach ( ( array ) $posts as $post )
clean_post_cache ( $post );
}
2007-09-11 21:33:35 +02:00
// Change the category to a tag.
2008-04-14 18:13:25 +02:00
$wpdb -> query ( $wpdb -> prepare ( " UPDATE $wpdb->term_taxonomy SET taxonomy = 'post_tag' WHERE term_id = %d AND taxonomy = 'category' " , $category -> term_id ) );
2007-09-11 21:33:35 +02:00
2008-04-14 18:13:25 +02:00
$terms = $wpdb -> get_col ( $wpdb -> prepare ( " SELECT term_id FROM $wpdb->term_taxonomy WHERE parent = %d AND taxonomy = 'category' " , $category -> term_id ) );
2007-10-09 00:39:20 +02:00
foreach ( ( array ) $terms as $term )
clean_category_cache ( $term );
2007-09-11 21:33:35 +02:00
// Set all parents to 0 (root-level) if their parent was the converted tag
2008-04-14 18:13:25 +02:00
$wpdb -> query ( $wpdb -> prepare ( " UPDATE $wpdb->term_taxonomy SET parent = 0 WHERE parent = %d AND taxonomy = 'category' " , $category -> term_id ) );
2007-09-11 21:33:35 +02:00
}
2007-04-10 18:57:21 +02:00
// Clean the cache
2007-05-26 20:54:16 +02:00
clean_category_cache ( $category -> term_id );
2007-06-14 04:25:30 +02:00
2007-04-07 06:58:28 +02:00
_e ( 'Converted successfully.' );
}
2007-06-14 04:25:30 +02:00
2007-12-16 23:07:32 +01:00
echo '</li>' ;
2007-04-07 06:58:28 +02:00
}
2007-06-14 04:25:30 +02:00
2007-12-16 23:07:32 +01:00
echo '</ul>' ;
echo '<p>' . sprintf ( __ ( 'We’re all done here, but you can always <a href="%s">convert more</a>.' ), 'admin.php?import=wp-cat2tag' ) . '</p>' ;
2007-04-07 06:58:28 +02:00
}
2007-06-14 04:25:30 +02:00
2008-05-05 19:15:35 +02:00
function convert_tags () {
global $wpdb ;
if ( ( ! isset ( $_POST [ 'tags_to_convert' ]) || ! is_array ( $_POST [ 'tags_to_convert' ])) && empty ( $this -> tags_to_convert )) {
echo '<div class="narrow">' ;
echo '<p>' . sprintf ( __ ( 'Uh, oh. Something didn’t work. Please <a href="%s">try again</a>.' ), 'admin.php?import=wp-cat2tag&step=3' ) . '</p>' ;
echo '</div>' ;
return ;
}
if ( empty ( $this -> categories_to_convert ) )
$this -> tags_to_convert = $_POST [ 'tags_to_convert' ];
$clean_cache = array ();
echo '<ul>' ;
foreach ( ( array ) $this -> tags_to_convert as $tag_id ) {
$tag_id = ( int ) $tag_id ;
echo '<li>' . sprintf ( __ ( 'Converting tag #%s ... ' ), $tag_id );
if ( ! is_term ( $tag_id , 'post_tag' ) ) {
_e ( 'Tag doesn\'t exist!' );
} else {
if ( is_term ( $tag_id , 'category' ) ) {
_e ( 'This Tag is already a Category.' );
echo '</li>' ;
continue ;
}
$tt_ids = $wpdb -> get_col ( $wpdb -> prepare ( " SELECT term_taxonomy_id FROM $wpdb->term_taxonomy WHERE term_id = %d AND taxonomy = 'post_tag' " , $tag_id ) );
if ( $tt_ids ) {
$posts = $wpdb -> get_col ( " SELECT object_id FROM $wpdb->term_relationships WHERE term_taxonomy_id IN ( " . join ( ',' , $tt_ids ) . " ) GROUP BY object_id " );
foreach ( ( array ) $posts as $post )
clean_post_cache ( $post );
}
// Change the tag to a category.
$parent = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT parent FROM $wpdb->term_taxonomy WHERE term_id = %d AND taxonomy = 'post_tag' " , $tag_id ) );
if ( 0 == $parent || ( 0 < ( int ) $parent && $this -> _category_exists ( $parent )) )
$reset_parent = '' ;
else $reset_parent = " , parent = '0' " ;
$wpdb -> query ( $wpdb -> prepare ( " UPDATE $wpdb->term_taxonomy SET taxonomy = 'category' $reset_parent WHERE term_id = %d AND taxonomy = 'post_tag' " , $tag_id ) );
// Clean the cache
$clean_cache [] = $tag_id ;
_e ( 'Converted successfully.' );
}
echo '</li>' ;
}
clean_term_cache ( $clean_cache , 'post_tag' );
delete_option ( 'category_children' );
echo '</ul>' ;
echo '<p>' . sprintf ( __ ( 'We’re all done here, but you can always <a href="%s">convert more</a>.' ), 'admin.php?import=wp-cat2tag&step=3' ) . '</p>' ;
}
2007-04-07 06:58:28 +02:00
function init () {
2007-06-14 04:25:30 +02:00
2007-10-11 19:50:56 +02:00
$step = ( isset ( $_GET [ 'step' ])) ? ( int ) $_GET [ 'step' ] : 1 ;
2007-06-14 04:25:30 +02:00
2007-04-07 06:58:28 +02:00
$this -> header ();
2007-06-14 04:25:30 +02:00
2008-05-05 19:15:35 +02:00
if ( current_user_can ( 'manage_categories' ) ) {
2007-08-25 19:07:10 +02:00
2007-04-07 17:43:20 +02:00
switch ( $step ) {
case 1 :
2008-05-05 19:15:35 +02:00
$this -> categories_tab ();
2007-04-07 06:58:28 +02:00
break ;
2007-06-14 04:25:30 +02:00
2007-04-07 17:43:20 +02:00
case 2 :
2008-05-05 19:15:35 +02:00
check_admin_referer ( 'import-cat2tag' );
$this -> convert_categories ();
break ;
case 3 :
$this -> tags_tab ();
break ;
case 4 :
check_admin_referer ( 'import-cat2tag' );
$this -> convert_tags ();
2007-04-07 06:58:28 +02:00
break ;
2007-04-07 17:43:20 +02:00
}
2007-04-07 06:58:28 +02:00
}
2007-06-14 04:25:30 +02:00
2007-04-07 06:58:28 +02:00
$this -> footer ();
}
2007-06-14 04:25:30 +02:00
2007-04-07 21:04:57 +02:00
function WP_Categories_to_Tags () {
// Do nothing.
}
2007-04-07 06:58:28 +02:00
}
2007-04-07 21:04:57 +02:00
$wp_cat2tag_importer = new WP_Categories_to_Tags ();
2007-04-07 06:58:28 +02:00
2008-05-05 19:15:35 +02:00
register_importer ( 'wp-cat2tag' , __ ( 'Categories and Tags Converter' ), __ ( 'Convert existing categories to tags or tags to categories, selectively.' ), array ( & $wp_cat2tag_importer , 'init' ));
2007-04-07 06:58:28 +02:00
2007-12-16 23:07:32 +01:00
?>