<?php

// Batch Categories Admin Screen 0.91 (24.07.04: just cleaned the category selection dropdown)

// 12.07.04 Stephanie Booth aka bunnywabbit_ on #wordpress -- http://climbtothestars.org/ for questions or fixes

// http://climbtothestars.org/archives/2004/07/13/batch-categories-09/

// for debugging
// print_r($_POST);

require_once('../wp-includes/wp-l10n.php');

$title __('Batch Categories');
$parent_file 'edit.php';
require_once(
'admin-header.php');
if (empty(
$_GET['mode'])) $mode 'view';
else 
$mode $_GET['mode'];

// if we've POSTed, deal with it

if(isset($_POST['submit'])&&($_POST['submit']=="Update"))
{
    
$update_categories=true;
}


if(isset(
$_POST['submit'])&&$_POST['add']!=0)
{
    if(
$_POST['submit']=="Add to Category")
    {
        
$add_category=true;
    }
    elseif(
$_POST['submit']=="Remove from Category")
    {
        
$remove_category=true;
    }
    
    
$batch_operation=true;
}

if(
$batch_operation)
{
            
// this will bother us later if we leave it in
            
unset($_POST['submit']);
            
// keep those sneaky lower level users at bay
            
if ($user_level == 0)
              die (
__('Cheatin&#8217; uh?'));

// this is the category we want to add/remove

$the_cat=$_POST['add'];
unset(
$_POST['add']);

// list the posts we are dealing with, from the hidden field
    
foreach($_POST as $key => $value)
    {
        
$split=explode("_"$key);
        
$post_ID=$split["1"];
        
$new_categories[$post_ID][]=$value;
        
$post_list[]=$post_ID;        
    }

// now go through all the posts and add/remove that category when necessary

    
foreach($post_list as $post_ID)
    {
      
// First get the old categories
       
$old_categories $wpdb->get_col("SELECT category_id FROM $tablepost2cat WHERE post_id = $post_ID");

        if(
$add_category)
        {
            
// then, if the new category is not yet in the list of old categories, add it
               
if (!in_array($the_cat$old_categories))
               {
                   
// new categories:
                   
$wpdb->query("INSERT INTO $tablepost2cat (post_id, category_id) VALUES ($post_ID$the_cat)");
                
$message.="Added category $the_cat to <a href=\"/wp-admin/post.php?action=edit&amp;post=$post_ID\" title=\"Edit this post.\">post $post_ID</a>.<br />\n";
               }else{
                   
$message.="<a href=\"/wp-admin/post.php?action=edit&amp;post=$post_ID\" title=\"Edit this post.\">Post $post_ID</a> was already in category $the_cat, no need to add it!<br />\n";
               } 
// end if in_array
         
// end if add category
        
elseif($remove_category)
        {
                
// if the category to remove is in the list of old_categories, remove it
                
if (in_array($the_cat$old_categories)) 
                   {
                          
$wpdb->query("DELETE FROM $tablepost2cat WHERE category_id = $the_cat AND post_id = $post_ID LIMIT 1");
                        
$message.="Removed category $the_cat from <a href=\"/wp-admin/post.php?action=edit&amp;post=$post_ID\" title=\"Edit this post.\">post $post_ID</a>.<br />\n";

                   }else{
                   
$message.="<a href=\"/wp-admin/post.php?action=edit&amp;post=$post_ID\" title=\"Edit this post.\">Post $post_ID</a> was not filed under category $the_cat, so no need to remove it!<br />\n";
                   }  
// end if        
        
// end if remove category
        
    
// end foreach post_list
    
// end  if batch operation


if($update_categories)
{
            
// this will bother us later if we leave it in
            
unset($_POST['submit']);
            
// keep those sneaky lower level users at bay
            
if ($user_level == 0)
              die (
__('Cheatin&#8217; uh?'));

// break up the results of the drop-down lists; keep on one side the posts we're dealing with, and the categories that have been selected for them
    
foreach($_POST as $key => $value)
    {
        
$split=explode("_"$key);
        
$post_ID=$split["0"];
        
$new_categories[$post_ID][]=$value;
        if(
$post_ID!=$previous_ID)
        {
            
$post_list[]=$post_ID;
        }
        
$previous_ID=$post_ID;    
    }
    
    
// go through the post list and add/remove categories as necessary    
    
foreach($post_list as $post_ID)
    {
                
        
$post_categories=array_unique($new_categories[$post_ID]);
        
        
// remove the entries for the "None" option in the drop-down list
        
foreach($post_categories as $key => $a_cat)
        {
                if((
$a_cat)==0)
                {
                    unset(
$post_categories[$key]);
                }
       }
        
        
// Now it's category time! Code taken without too many modifications from post.php
       // First the old categories
       
$old_categories $wpdb->get_col("SELECT category_id FROM $tablepost2cat WHERE post_id = $post_ID");
              
       
// Delete any?
       
foreach ($old_categories as $old_cat) {
       if (!
in_array($old_cat$post_categories)) 
       {
          
$wpdb->query("DELETE FROM $tablepost2cat WHERE category_id = $old_cat AND post_id = $post_ID LIMIT 1");
            
$message.="Removed category $old_cat from <a href=\"/wp-admin/post.php?action=edit&amp;post=$post_ID\" title=\"Edit this post.\">post $post_ID</a>.<br />\n";

       } 
// end if
       
// end foreach
       
       // Add any?
       
foreach ($post_categories as $new_cat) {
       if (!
in_array($new_cat$old_categories))
       {
       
// new categories:
       
$wpdb->query("INSERT INTO $tablepost2cat (post_id, category_id) VALUES ($post_ID$new_cat)");
        
$message.="Added category $new_cat to <a href=\"/wp-admin/post.php?action=edit&amp;post=$post_ID\" title=\"Edit this post.\">post $post_ID</a>.<br />\n";
       } 
// end if
       
// end foreach
     
}  
}


// a  nicer dropdown_cats function based on wp_dropdown_cats (small modif)

function nice_dropdown_cats($currentcat 0$parent 0$level 0$categories 0) {
    global 
$wpdb$tablecategories;
    if (!
$categories) {
        
$categories $wpdb->get_results("SELECT * FROM $tablecategories ORDER BY cat_name");
    }
    if (
$categories) {
        foreach (
$categories as $category) { 
        if (
$parent == $category->category_parent) {
            
$pad str_repeat('&#8211; '$level);
            echo 
"\n\t<option value=\"$category->cat_ID\"";
            if (
$currentcat == $category->cat_ID)
                {
                echo 
" selected=\"selected\"";
                }
            echo 
">$pad$category->cat_name</option>";
            
nice_dropdown_cats($currentcat$category->cat_ID$level 1$categories);
        } }
    } else {
        return 
false;
    }
}

// a function we will need -- generates category dropdowns per post
// could make this way better by caching the drop-down list in a table, and looping through the table to "select" the appropriate category, instead of hitting the poor database with dozens of queries.
function cat_dropdowns($limit='4')
{
    
// initialize counter
    
$counter=0;
    
    
// grab categories for current post
    
$post_categories=get_the_category();
    
    
// output a dropdown for each category, respecting the max number of dropdowns
    
foreach($post_categories as $category)
    {
        
?>
        <select name='<?php the_id(); print("_$counter"); ?>' class='postform'>
            
            <?php 
            
// a dropdown list of categories, indented, 
            
?><option value="0" selected="selected">None</option> <?php
            
// DEBUG print("Dropdown for $category->category_id\n");
            
nice_dropdown_cats($category->category_id); 
            
?>
        </select>
        
        <?php
        
// increment the counter -- the counter is there so we can "fill up" the number of drop-downs for each post until we reach the setting $limit, if the post has less categories than the allowed limit. If the post has more categories than the limit, we show the drop-downs anyway, because otherwise the extra categories would get chopped off!
        
$counter++;
    } 
// end foreach $post_categories
        
        // if we stop counting categories before we reach the limit, we'll keep on padding with de-selected dropdown boxes to allow easy addition of categories
        
while($counter<$limit)
        {
        
?>
         <select name='<?php the_id(); print("_$counter"); ?>' class='postform'>
            <option value="0" selected="selected">None</option>
           <?php // a dropdown list of categories, no option for 'All', sorted by name, an option for "None", select none. ?>
            <?php  nice_dropdown_cats();  ?>
        </select>
        <?php
        $counter
++;
        } 
// end while $counter (second)

// end function cat_dropdowns()

?>
<ul id="adminmenu2"> 
  <li><a href="edit.php"><?php _e('Posts'?></a></li> 
  <li><a href="edit-comments.php"><?php _e('Comments'?></a></li> 
  <li><a href="moderation.php"><?php _e('Awaiting Moderation'?></a></li> 
  <li class="last"><a href="batch-categories.php" class="current"><?php _e('Batch Categories'?></a></li> 
</ul> 
<?php
get_currentuserinfo
();
?> 
<div class="wrap"> 
<?php
if( isset( $_GET['cat'] ) )
{
    echo 
'<h2>' $category[$_GET['cat']]."</h2>";
}


// this form allows to view all posts from a given category
?>
<form name="viewcat" action="" method="get" style="float: left; width: 32em;">
    <fieldset>
    <legend><?php _e('Show Posts From Category...'?></legend>
    <select name='cat' class='postform'>
    <?php
    
if( !isset( $_GET['cat'] ) )
        {
            
$_GET['cat']="0";
        }
       
?>
        <option value="0"<?php if($_GET['cat']=="0"){print('selected="selected"');} ?>>Any category</option>
        <?php
          nice_dropdown_cats
($_GET['cat']);
         
?>
        </select>
        <input type="submit" name="submit" value="<?php _e('Show Category'?>"  /> 
    </fieldset>
</form>

<?php
// this form allows display of posts meeting search criteria
?>

<form name="searchform" action="" method="get" style="float: left; width: 20em; margin-left: 3em;"> 
  <fieldset> 
  <legend><?php _e('Show Posts That Contain...'?></legend> 
  <input type="text" name="s" value="<?php if (isset($s)) echo $s?>" size="17" /> 
  <input type="submit" name="submit" value="<?php _e('Search'?>"  /> 
  </fieldset>
</form>

<br style="clear:both;" />

<?php

if($message!="")
{
print(
"<p>$message</p>");
}

// by default, show only 10 posts
if(empty($cat)&&empty($s))
{
    if(empty(
$num))
    {
    
$showposts=10;

    
// show explanation and warning
    
?>
    <p>This screen is powerful but greedy in resources. (It shows you only the last 10 posts by default. Select posts by category or using a search string. Passing a "lim=n" parameter to the url will control the number of category drop-downs you get for each post. A "num=n" parameter will limit the number of posts (useful if you're being a bit cautious in trying it out). You can also remove the excerpts if they bother you by specifying "excerpt=0". The Update buttons are all identical: they update all the displayed posts.</p>

    <p>You can easily move a bunch of posts to one category with the "Add to Category" button, and similarly remove a category with "Remove from Category".</p>

    <p>Maybe you will want to backup your wp_post2cat table before you play with this. It works for me, but has not been thoroughly tested, and comes with no guarantee. <a href="/archives/2004/07/13/batch-categories-09/" title="Batch Categories 0.9 notes.">More information on my weblog</a>. Have fun!</p>

    <p>Comments and feedback to bunnywabbit_ on IRC freenode #wordpress.</p>
    <?php
    
}
    else
    {
    
// num allows control on the number of posts displayed (the "num" last posts) -- useful for debugging without messing up the 10 last posts
    
$showposts=$num;
    }
}

include(
ABSPATH.'wp-blog-header.php');

if (
$posts) {


// this form allows the user to add all the posts displayed on the page to the category he wishes
?>

<form name="addcat" action="<?php print("$PHP_SELF?$QUERY_STRING"); ?>" method="post" style="width: 32em;">
    <fieldset>
    <legend><?php _e('Batch Add/Remove Displayed Posts...'?></legend>
    <select name='add' class='postform'>
        <option value="0" selected="selected">None</option>
        <?php
          nice_dropdown_cats
();
         
?>
        </select>

<?php
// list affected posts
foreach ($posts as $post) { start_wp();
?>
<input type="hidden" name="<?php echo("post_$id"); ?>" value="listed" />
<?php
}
?>

        <input type="submit" name="submit" value="<?php _e('Add to Category'?>"  /><br />
<input type="submit" name="submit" value="<?php _e('Remove from Category'?>"  /> 
    </fieldset>
</form>

<?php
// this is the main form
?>

<form name="batchcats" action="<?php print("$PHP_SELF?$QUERY_STRING"); ?>" method="post">


<table width="100%" cellpadding="3" cellspacing="3"> 
  <tr> 
    <th scope="col"><?php _e('Info'?></th> 
    <th scope="col"><?php _e('Title'?></th> 
    <th scope="col"><?php _e('Categories'?></th> 
    <th scope="col"><?php _e('Edit'?></th> 
  </tr> 
<?php
$bgcolor 
'';
foreach (
$posts as $post) { start_wp();
$bgcolor = ('#eee' == $bgcolor) ? 'none' '#eee';
?> 
  <tr style='background-color: <?php echo $bgcolor?>'> 
    <td><?php the_time('Y-m-d \<\b\r \/\> g:i:s a'); ?><br /><?php echo ("ID: $id"); ?></td> 
    <td><a href="<?php the_permalink(); ?>" rel="permalink"> 
      <?php the_title() ?> 
      </a><br /><?php if($_GET['excerpt']!="0"){the_excerpt();} ?>
    <?php if ('private' == $post->post_status_e(' - <strong>Private</strong>'); ?></td> 
    <td>
            <?php 
            
if(isset($_GET['lim']))
            {
            
cat_dropdowns($_GET['lim']);
            }
            else
            {
            
cat_dropdowns(); 
            }
            
?>
    </td> 
    <td>            <input type="submit" name="submit" value="<?php _e('Update'?>"  /><br />
<?php if (($user_level $authordata->user_level) or ($user_login == $authordata->user_login)) { echo "<a href='post.php?action=edit&amp;post=$id' class='edit'>" __('Edit') . "</a>"; } ?></td> 
  </tr> 
<?php
}
} else {
?>
  <tr style='background-color: <?php echo $bgcolor?>'> 
    <td colspan="8"><?php _e('No posts found.'?></td> 
  </tr> 
<?php
// end if ($posts)
?> 
</table> 

</form>
</div> 
<?php 
 
include('admin-footer.php');
?>