<?php
/*
Plugin Name: Alpha list_cats
Plugin URI: http://wordpress.org/support/topic/93405
Description: Version of list_cats that restricts by first letter of category name. Functions/Template Tags: szub_alpha_list_cats() and alpha_list_cats().
Version: R1
Author: Kaf Oseo
Author URI: http://szub.net/

    Copyright (c) 2006 Kaf Oseo (http://szub.net)
    Alpha list_cats is released under the GNU General Public License
    (GPL) http://www.gnu.org/licenses/gpl.txt

    This is a WordPress 2 plugin (http://wordpress.org).
*/

function szub_alpha_list_cats($args '') {
    
parse_str($args$r);
    if ( !isset(
$r['optionall']))
        
$r['optionall'] = 0;
    if ( !isset(
$r['all']))
        
$r['all'] = 'All';
    if ( !isset(
$r['sort_column']) )
        
$r['sort_column'] = 'ID';
    if ( !isset(
$r['sort_order']) )
        
$r['sort_order'] = 'asc';
    if ( !isset(
$r['file']) )
        
$r['file'] = '';
    if ( !isset(
$r['list']) )
        
$r['list'] = true;
    if ( !isset(
$r['optiondates']) )
        
$r['optiondates'] = 0;
    if ( !isset(
$r['optioncount']) )
        
$r['optioncount'] = 0;
    if ( !isset(
$r['hide_empty']) )
        
$r['hide_empty'] = 1;
    if ( !isset(
$r['use_desc_for_title']) )
        
$r['use_desc_for_title'] = 1;
    if ( !isset(
$r['children']) )
        
$r['children'] = true;
    if ( !isset(
$r['child_of']) )
        
$r['child_of'] = 0;
    if ( !isset(
$r['categories']) )
        
$r['categories'] = 0;
    if ( !isset(
$r['recurse']) )
        
$r['recurse'] = 0;
    if ( !isset(
$r['feed']) )
        
$r['feed'] = '';
    if ( !isset(
$r['feed_image']) )
        
$r['feed_image'] = '';
    if ( !isset(
$r['exclude']) )
        
$r['exclude'] = '';
    if ( !isset(
$r['hierarchical']) )
        
$r['hierarchical'] = true;
    if ( !isset(
$r['first_char']) )
        
$r['first_char'] = '';

    return 
alpha_list_cats($r['optionall'], $r['all'], $r['sort_column'], $r['sort_order'], $r['file'],    $r['list'], $r['optiondates'], $r['optioncount'], $r['hide_empty'], $r['use_desc_for_title'], $r['children'], $r['child_of'], $r['categories'], $r['recurse'], $r['feed'], $r['feed_image'], $r['exclude'], $r['hierarchical'], $r['first_char']);
}

function 
alpha_list_cats($optionall 1$all 'All'$sort_column 'ID'$sort_order 'asc'$file ''$list true$optiondates 0$optioncount 0$hide_empty 1$use_desc_for_title 1$children=FALSE$child_of=0$categories=0$recurse=0$feed ''$feed_image ''$exclude ''$hierarchical=FALSE$first_char '') {
    global 
$wpdb$wp_query;
    
// Optiondates now works
    
if ( '' == $file )
        
$file get_settings('home') . '/';

    
$exclusions '';
    if ( !empty(
$exclude) ) {
        
$excats preg_split('/[\s,]+/',$exclude);
        if ( 
count($excats) ) {
            foreach ( 
$excats as $excat ) {
                
$exclusions .= ' AND cat_ID <> ' intval($excat) . ' ';
            }
        }
    }

    
$exclusions apply_filters('list_cats_exclusions'$exclusions );

    if ( 
$first_char ) {
        
$like_first_char ' AND cat_name LIKE \'' $first_char '%\' ';
        
$sort_column 'name';
    }

    if ( 
intval($categories) == ) {
        
$sort_column 'cat_'.$sort_column;

        
$query "
            SELECT cat_ID, cat_name, category_nicename, category_description, category_parent, category_count
            FROM 
$wpdb->categories
            WHERE cat_ID > 0 
$like_first_char $exclusions
            ORDER BY 
$sort_column $sort_order";

        
$categories $wpdb->get_results($query);
    }

    if ( 
$optiondates ) {
        
$cat_dates $wpdb->get_results("    SELECT category_id,
        UNIX_TIMESTAMP( MAX(post_date) ) AS ts
        FROM 
$wpdb->posts$wpdb->post2cat$wpdb->categories
        WHERE post_status = 'publish' AND post_id = ID 
$exclusions
        GROUP BY category_id"
);
        foreach ( 
$cat_dates as $cat_date ) {
            
$category_timestamp["$cat_date->category_id"] = $cat_date->ts;
        }
    }

    
$num_found=0;
    
$thelist "";

    foreach ( (array) 
$categories as $category ) {
        if ( ( 
intval($hide_empty) == || $category->category_count) && (!$hierarchical || $category->category_parent == $child_of) ) {
            
$num_found++;
            
$link '<a href="'.get_category_link($category->cat_ID).'" ';
            if ( 
$use_desc_for_title == || empty($category->category_description) )
                
$link .= 'title="'sprintf(__("View all posts filed under %s"), wp_specialchars($category->cat_name)) . '"';
            else
                
$link .= 'title="' wp_specialchars(apply_filters('category_description',$category->category_description,$category)) . '"';
            
$link .= '>';
            
$link .= apply_filters('list_cats'$category->cat_name$category).'</a>';

            if ( (! empty(
$feed_image)) || (! empty($feed)) ) {

                
$link .= ' ';

                if ( empty(
$feed_image) )
                    
$link .= '(';

                
$link .= '<a href="' get_category_rss_link(0$category->cat_ID$category->category_nicename) . '"';

                if ( !empty(
$feed) ) {
                    
$title ' title="' $feed '"';
                    
$alt ' alt="' $feed '"';
                    
$name $feed;
                    
$link .= $title;
                }

                
$link .= '>';

                if ( !empty(
$feed_image) )
                    
$link .= "<img src='$feed_image$alt$title' />';
                else
                    
$link .= $name;

                
$link .= '</a>';

                if (empty(
$feed_image))
                    
$link .= ')';
            }

            if ( 
intval($optioncount) == )
                
$link .= ' ('.intval($category->category_count).')';

            if ( 
$optiondates ) {
                if ( 
$optiondates == )
                    
$optiondates 'Y-m-d';
                
$link .= ' ' gmdate($optiondates$category_timestamp["$category->cat_ID"]);
            }

            if ( 
$list ) {
                
$thelist .= "\t<li";
                if ((
$category->cat_ID == $wp_query->get_queried_object_id()) && is_category()) {
                    
$thelist .=  ' class="current-cat"';
                }
                
$thelist .= ">$link\n";
            } else {
                
$thelist .= "\t$link<br />\n";
            }

            if (
$hierarchical && $children)
                
$thelist .= alpha_list_cats($optionall$all$sort_column$sort_order$file$list$optiondates$optioncount$hide_empty$use_desc_for_title$hierarchical$category->cat_ID$categories1$feed$feed_image$exclude$hierarchical$first_char);
            if (
$list)
                
$thelist .= "</li>\n";
        }
    }
    if ( !
$num_found && !$child_of ) {
        if ( 
$list ) {
            
$before '<li>';
            
$after '</li>';
        }
        echo 
$before __("No categories") . $after "\n";
        return;
    }
    if ( 
$list && $child_of && $num_found && $recurse ) {
        
$pre "\t\t<ul class='children'>";
        
$post "\t\t</ul>\n";
    } else {
        
$pre $post '';
    }
    
$thelist $pre $thelist $post;
    if ( 
$recurse )
        return 
$thelist;
    echo 
apply_filters('list_cats'$thelist);
}
?>