2004-01-27 04:58:01 -05:00
< ? php
2004-06-03 22:36:46 -04:00
function get_the_category ( $id = false ) {
2005-10-12 13:01:50 -04:00
global $post , $category_cache ;
2004-06-03 22:36:46 -04:00
2005-03-01 04:10:12 -05:00
if ( ! $id )
$id = $post -> ID ;
2004-06-03 22:36:46 -04:00
2005-10-12 13:01:50 -04:00
if ( ! isset ( $category_cache [ $id ]) )
2005-03-27 15:45:01 -05:00
update_post_category_cache ( $id );
$categories = $category_cache [ $id ];
2004-11-12 18:08:51 -05:00
2005-10-12 13:01:50 -04:00
if ( ! empty ( $categories ) )
2005-03-01 04:10:12 -05:00
sort ( $categories );
else
$categories = array ();
2004-11-15 01:00:21 -05:00
2005-03-01 04:10:12 -05:00
return $categories ;
2004-01-27 04:58:01 -05:00
}
2005-02-13 22:27:50 -05:00
function get_category_link ( $category_id ) {
2005-03-27 15:45:01 -05:00
global $wp_rewrite ;
2005-02-13 22:27:50 -05:00
$catlink = $wp_rewrite -> get_category_permastruct ();
if ( empty ( $catlink ) ) {
2005-10-29 19:23:17 -04:00
$file = get_settings ( 'home' ) . '/' ;
2005-02-15 01:52:38 -05:00
$catlink = $file . '?cat=' . $category_id ;
2005-02-13 22:27:50 -05:00
} else {
2005-03-27 15:45:01 -05:00
$category = & get_category ( $category_id );
$category_nicename = $category -> category_nicename ;
2004-01-27 04:58:01 -05:00
2005-10-12 13:01:50 -04:00
if ( $parent = $category -> category_parent )
2005-02-13 22:27:50 -05:00
$category_nicename = get_category_parents ( $parent , false , '/' , true ) . $category_nicename . '/' ;
$catlink = str_replace ( '%category%' , $category_nicename , $catlink );
$catlink = get_settings ( 'home' ) . trailingslashit ( $catlink );
}
2005-02-15 01:52:38 -05:00
return apply_filters ( 'category_link' , $catlink , $category_id );
2004-01-27 04:58:01 -05:00
}
2005-02-25 10:50:55 -05:00
function get_the_category_list ( $separator = '' , $parents = '' ) {
2005-10-12 13:01:50 -04:00
$categories = get_the_category ();
if ( empty ( $categories ))
return apply_filters ( 'the_category' , __ ( 'Uncategorized' ), $separator , $parents );
$thelist = '' ;
if ( '' == $separator ) {
$thelist .= '<ul class="post-categories">' ;
foreach ( $categories as $category ) {
$thelist .= " \n \t <li> " ;
switch ( strtolower ( $parents ) ) {
case 'multiple' :
if ( $category -> category_parent )
$thelist .= get_category_parents ( $category -> category_parent , TRUE );
$thelist .= '<a href="' . get_category_link ( $category -> cat_ID ) . '" title="' . sprintf ( __ ( " View all posts in %s " ), $category -> cat_name ) . '" rel="category tag">' . $category -> cat_name . '</a></li>' ;
break ;
case 'single' :
$thelist .= '<a href="' . get_category_link ( $category -> cat_ID ) . '" title="' . sprintf ( __ ( " View all posts in %s " ), $category -> cat_name ) . ' rel="category tag">' ;
if ( $category -> category_parent )
$thelist .= get_category_parents ( $category -> category_parent , FALSE );
$thelist .= $category -> cat_name . '</a></li>' ;
break ;
case '' :
default :
$thelist .= '<a href="' . get_category_link ( $category -> cat_ID ) . '" title="' . sprintf ( __ ( " View all posts in %s " ), $category -> cat_name ) . '" rel="category tag">' . $category -> cat_name . '</a></li>' ;
}
}
$thelist .= '</ul>' ;
} else {
$i = 0 ;
foreach ( $categories as $category ) {
if ( 0 < $i )
$thelist .= $separator . ' ' ;
switch ( strtolower ( $parents ) ) {
case 'multiple' :
if ( $category -> category_parent )
$thelist .= get_category_parents ( $category -> category_parent , TRUE );
$thelist .= '<a href="' . get_category_link ( $category -> cat_ID ) . '" title="' . sprintf ( __ ( " View all posts in %s " ), $category -> cat_name ) . '" rel="category tag">' . $category -> cat_name . '</a>' ;
break ;
case 'single' :
$thelist .= '<a href="' . get_category_link ( $category -> cat_ID ) . '" title="' . sprintf ( __ ( " View all posts in %s " ), $category -> cat_name ) . '" rel="category tag">' ;
if ( $category -> category_parent )
$thelist .= get_category_parents ( $category -> category_parent , FALSE );
$thelist .= " $category->cat_name </a> " ;
break ;
case '' :
default :
$thelist .= '<a href="' . get_category_link ( $category -> cat_ID ) . '" title="' . sprintf ( __ ( " View all posts in %s " ), $category -> cat_name ) . '" rel="category tag">' . $category -> cat_name . '</a>' ;
}
++ $i ;
}
}
return apply_filters ( 'the_category' , $thelist , $separator , $parents );
2005-02-25 10:50:55 -05:00
}
function the_category ( $separator = '' , $parents = '' ) {
echo get_the_category_list ( $separator , $parents );
2004-01-27 04:58:01 -05:00
}
function get_the_category_by_ID ( $cat_ID ) {
2005-05-27 02:10:41 -04:00
$cat_ID = ( int ) $cat_ID ;
2005-03-27 15:45:01 -05:00
$category = & get_category ( $cat_ID );
return $category -> cat_name ;
2004-01-27 04:58:01 -05:00
}
2004-02-16 23:56:29 -05:00
function get_category_parents ( $id , $link = FALSE , $separator = '/' , $nicename = FALSE ){
2005-10-12 13:01:50 -04:00
$chain = '' ;
$parent = & get_category ( $id );
if ( $nicename )
$name = $parent -> category_nicename ;
else
$name = $parent -> cat_name ;
if ( $parent -> category_parent )
$chain .= get_category_parents ( $parent -> category_parent , $link , $separator , $nicename );
if ( $link )
$chain .= '<a href="' . get_category_link ( $parent -> cat_ID ) . '" title="' . sprintf ( __ ( " View all posts in %s " ), $parent -> cat_name ) . '">' . $name . '</a>' . $separator ;
else
$chain .= $name . $separator ;
return $chain ;
2004-01-27 04:58:01 -05:00
}
2004-02-16 23:56:29 -05:00
function get_category_children ( $id , $before = '/' , $after = '' ) {
2005-12-21 23:31:48 -05:00
if ( 0 == $id )
return '' ;
2005-11-07 16:56:03 -05:00
$cat_ids = get_all_category_ids ();
foreach ( $cat_ids as $cat_id ) {
if ( $cat_id == $id )
continue ;
2005-05-13 22:57:47 -04:00
2005-11-07 16:56:03 -05:00
$category = get_category ( $cat_id );
2005-10-12 13:01:50 -04:00
if ( $category -> category_parent == $id ) {
2005-05-13 22:57:47 -04:00
$chain .= $before . $category -> cat_ID . $after ;
$chain .= get_category_children ( $category -> cat_ID , $before , $after );
}
}
return $chain ;
2004-01-27 04:58:01 -05:00
}
function category_description ( $category = 0 ) {
2005-10-12 13:01:50 -04:00
global $cat ;
if ( ! $category )
$category = $cat ;
$category = & get_category ( $category );
return apply_filters ( 'category_description' , $category -> category_description , $category -> cat_ID );
2004-01-27 04:58:01 -05:00
}
2006-03-01 23:51:24 -05:00
function wp_dropdown_categories ( $args = '' ) {
2006-03-02 00:47:59 -05:00
if ( is_array ( $args ) )
$r = & $args ;
else
parse_str ( $args , $r );
2006-03-02 01:37:00 -05:00
$defaults = array ( 'show_option_all' => '' , 'show_option_none' => '' , 'orderby' => 'ID' ,
2006-03-03 16:38:36 -05:00
'order' => 'ASC' , 'show_last_update' => 0 , 'show_count' => 0 ,
2006-03-02 01:37:00 -05:00
'hide_empty' => 1 , 'child_of' => 0 , 'exclude' => '' , 'echo' => 1 ,
'selected' => 0 , 'hierarchical' => 0 , 'name' => 'cat' ,
'class' => 'postform' );
$r = array_merge ( $defaults , $r );
2006-03-01 23:51:24 -05:00
$r [ 'include_last_update_time' ] = $r [ 'show_last_update' ];
extract ( $r );
2006-03-02 00:47:59 -05:00
$categories = get_categories ( $r );
2006-03-01 23:51:24 -05:00
$output = '' ;
if ( ! empty ( $categories ) ) {
$output = " <select name=' $name ' class=' $class '> \n " ;
if ( $show_option_all ) {
$show_option_all = apply_filters ( 'list_cats' , $show_option_all );
$output .= " \t <option value='0'> $show_option_all </option> \n " ;
}
if ( $show_option_none ) {
$show_option_none = apply_filters ( 'list_cats' , $show_option_none );
$output .= " \t <option value='-1'> $show_option_none </option> \n " ;
2005-10-12 13:01:50 -04:00
}
2006-03-01 23:51:24 -05:00
if ( $hierarchical )
$depth = 0 ; // Walk the full depth.
else
$depth = - 1 ; // Flat.
$output .= walk_category_tree ( $categories , $depth , '_category_dropdown_element' , '' , '' , '' , $selected , $r );
$output .= " </select> \n " ;
2005-10-12 13:01:50 -04:00
}
2006-03-01 23:51:24 -05:00
$output = apply_filters ( 'wp_dropdown_cats' , $output );
if ( $echo )
echo $output ;
return $output ;
}
function _category_dropdown_element ( $output , $category , $depth , $selected , $args ) {
$pad = str_repeat ( ' ' , $depth * 3 );
$cat_name = apply_filters ( 'list_cats' , $category -> cat_name , $category );
$output .= " \t <option value= \" " . $category -> cat_ID . " \" " ;
if ( $category -> cat_ID == $selected )
$output .= ' selected="selected"' ;
$output .= '>' ;
$output .= $cat_name ;
2006-03-03 16:38:36 -05:00
if ( $args [ 'show_count' ] )
2006-03-01 23:51:24 -05:00
$output .= ' (' . $category -> category_count . ')' ;
if ( $args [ 'show_last_update' ] ) {
$format = 'Y-m-d' ;
$output .= ' ' . gmdate ( $format , $category -> last_update_timestamp );
}
$output .= " </option> \n " ;
return $output ;
2004-01-27 04:58:01 -05:00
}
2006-03-01 23:51:24 -05:00
function wp_list_categories ( $args = '' ) {
2006-03-02 00:47:59 -05:00
if ( is_array ( $args ) )
$r = & $args ;
else
parse_str ( $args , $r );
2006-03-03 16:38:36 -05:00
$defaults = array ( 'show_option_all' => '' , 'orderby' => 'ID' ,
'order' => 'asc' , 'style' => 'list' , 'show_last_update' => 0 ,
'show_count' => 0 , 'hide_empty' => 1 , 'use_desc_for_title' => 1 ,
2006-03-02 01:37:00 -05:00
'child_of' => 0 , 'feed' => '' , 'feed_image' => '' , 'exclude' => '' ,
'hierarchical' => false , 'title_li' => '' );
$r = array_merge ( $defaults , $r );
2006-03-03 16:38:36 -05:00
$r [ 'include_last_update_time' ] = $r [ 'show_date' ];
2006-03-01 08:30:19 -05:00
extract ( $r );
2006-03-02 00:47:59 -05:00
$categories = get_categories ( $r );
2006-03-01 23:51:24 -05:00
2006-03-01 08:30:19 -05:00
$output = '' ;
if ( $title_li && $list )
$output = '<li class="categories">' . $r [ 'title_li' ] . '<ul>' ;
if ( empty ( $categories ) ) {
if ( $list )
$output .= '<li>' . __ ( " No categories " ) . '</li>' ;
else
$output .= __ ( " No categories " );
} else {
global $wp_query ;
$current_category = $wp_query -> get_queried_object_id ();
if ( $hierarchical )
$depth = 0 ; // Walk the full depth.
else
$depth = - 1 ; // Flat.
$output .= walk_category_tree ( $categories , $depth , '_category_list_element_start' , '_category_list_element_end' , '_category_list_level_start' , '_category_list_level_end' , $current_category , $r );
2004-04-30 14:28:50 -04:00
}
2006-03-01 08:30:19 -05:00
if ( $title_li && $list )
$output .= '</ul></li>' ;
echo apply_filters ( 'list_cats' , $output );
}
2005-08-30 19:25:34 -04:00
2006-03-01 08:30:19 -05:00
function _category_list_level_start ( $output , $depth , $cat , $args ) {
2006-03-03 16:38:36 -05:00
if ( 'list' != $args [ 'style' ] )
2006-03-01 08:30:19 -05:00
return $output ;
2004-01-27 04:58:01 -05:00
2006-03-01 08:30:19 -05:00
$indent = str_repeat ( " \t " , $depth );
$output .= " $indent <ul class='children'> \n " ;
return $output ;
}
2004-01-27 04:58:01 -05:00
2006-03-01 08:30:19 -05:00
function _category_list_level_end ( $output , $depth , $cat , $args ) {
2006-03-03 16:38:36 -05:00
if ( 'list' != $args [ 'style' ] )
2006-03-01 08:30:19 -05:00
return $output ;
2005-10-12 13:01:50 -04:00
2006-03-01 08:30:19 -05:00
$indent = str_repeat ( " \t " , $depth );
$output .= " $indent </ul> \n " ;
return $output ;
}
2005-10-12 13:01:50 -04:00
2006-03-01 08:30:19 -05:00
function _category_list_element_start ( $output , $category , $depth , $current_category , $args ) {
extract ( $args );
2005-10-12 13:01:50 -04:00
2006-03-01 08:30:19 -05:00
$link = '<a href="' . get_category_link ( $category -> cat_ID ) . '" ' ;
if ( $use_desc_for_title == 0 || 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>' ;
2004-05-20 10:07:55 -04:00
2006-03-01 08:30:19 -05:00
if ( ( ! empty ( $feed_image )) || ( ! empty ( $feed )) ) {
$link .= ' ' ;
2005-10-12 13:01:50 -04:00
2006-03-01 08:30:19 -05:00
if ( empty ( $feed_image ) )
$link .= '(' ;
2004-05-20 10:07:55 -04:00
2006-03-01 08:30:19 -05:00
$link .= '<a href="' . get_category_rss_link ( 0 , $category -> cat_ID , $category -> category_nicename ) . '"' ;
2004-05-20 10:07:55 -04:00
2006-03-01 08:30:19 -05:00
if ( ! empty ( $feed ) ) {
$title = ' title="' . $feed . '"' ;
$alt = ' alt="' . $feed . '"' ;
$name = $feed ;
$link .= $title ;
}
2004-05-20 10:07:55 -04:00
2006-03-01 08:30:19 -05:00
$link .= '>' ;
2004-05-20 10:07:55 -04:00
2006-03-01 08:30:19 -05:00
if ( ! empty ( $feed_image ) )
$link .= " <img src=' $feed_image ' $alt $title " . ' />' ;
else
$link .= $name ;
$link .= '</a>' ;
if ( empty ( $feed_image ))
$link .= ')' ;
}
2004-05-20 10:07:55 -04:00
2006-03-03 16:38:36 -05:00
if ( $show_count )
2006-03-01 08:30:19 -05:00
$link .= ' (' . intval ( $category -> category_count ) . ')' ;
2005-10-12 13:01:50 -04:00
2006-03-03 16:38:36 -05:00
if ( $show_date ) {
$link .= ' ' . gmdate ( 'Y-m-d' , $category -> last_update_timestamp );
2006-03-01 08:30:19 -05:00
}
2004-05-20 10:07:55 -04:00
2006-03-03 16:38:36 -05:00
if ( 'list' == $args [ 'style' ] ) {
2006-03-01 08:30:19 -05:00
$output .= " \t <li " ;
if ( ( $category -> cat_ID == $current_category ) && is_category () )
$output .= ' class="current-cat"' ;
$output .= " > $link\n " ;
} else {
$output .= " \t $link <br /> \n " ;
}
2004-03-22 23:45:27 -05:00
2006-03-01 08:30:19 -05:00
return $output ;
}
2005-10-12 13:01:50 -04:00
2006-03-01 08:30:19 -05:00
function _category_list_element_end ( $output , $category , $depth , $cat , $args ) {
2006-03-03 16:38:36 -05:00
if ( 'list' != $args [ 'style' ] )
2006-03-01 08:30:19 -05:00
return $output ;
2005-10-12 13:01:50 -04:00
2006-03-01 08:30:19 -05:00
$output .= " </li> \n " ;
return $output ;
}
2005-10-12 13:01:50 -04:00
2004-05-18 04:18:38 -04:00
function in_category ( $category ) { // Check if the current post is in the given category
2005-11-01 13:22:30 -05:00
global $category_cache , $post ;
2004-05-18 04:18:38 -04:00
2005-10-29 18:24:27 -04:00
if ( isset ( $category_cache [ $post -> ID ][ $category ] ) )
2004-05-18 04:18:38 -04:00
return true ;
else
return false ;
}
2005-10-29 18:24:27 -04:00
2006-03-01 08:30:19 -05:00
function & _get_cat_children ( $category_id , $categories ) {
if ( empty ( $categories ) )
return array ();
$category_list = array ();
foreach ( $categories as $category ) {
if ( $category -> category_parent == $category_id ) {
$category_list [] = $category ;
if ( $children = _get_cat_children ( $category -> cat_ID , $categories ) )
$category_list = array_merge ( $category_list , $children );
}
}
return $category_list ;
}
2006-02-26 23:57:30 -05:00
function & get_categories ( $args = '' ) {
global $wpdb , $category_links ;
2006-03-02 00:47:59 -05:00
if ( is_array ( $args ) )
$r = & $args ;
else
parse_str ( $args , $r );
2006-02-26 23:57:30 -05:00
2006-03-02 01:37:00 -05:00
$defaults = array ( 'type' => 'post' , 'child_of' => 0 , 'orderby' => 'name' , 'order' => 'ASC' ,
2006-03-20 23:26:50 -05:00
'hide_empty' => true , 'include_last_update_time' => false , 'hierarchical' => 1 , $exclude => '' , $include => '' );
2006-03-02 01:37:00 -05:00
$r = array_merge ( $defaults , $r );
2006-03-20 23:26:50 -05:00
$r [ 'orderby' ] = " cat_ " . $r [ 'orderby' ]; // restricts order by to cat_ID and cat_name fields
2006-03-01 08:30:19 -05:00
extract ( $r );
$where = 'cat_ID > 0' ;
2006-03-20 23:26:50 -05:00
$inclusions = '' ;
if ( ! empty ( $include ) ) {
$child_of = 0 ; //ignore child_of and exclude params if using include
$exclude = '' ;
$incategories = preg_split ( '/[\s,]+/' , $include );
if ( count ( $incategories ) ) {
foreach ( $incategories as $incat ) {
if ( empty ( $inclusions ))
$inclusions = ' AND ( cat_ID = ' . intval ( $incat ) . ' ' ;
else
$inclusions .= ' OR cat_ID = ' . intval ( $incat ) . ' ' ;
}
}
}
if ( ! empty ( $inclusions ))
$inclusions .= ')' ;
$where .= $inclusions ;
2006-03-01 08:30:19 -05:00
$exclusions = '' ;
if ( ! empty ( $exclude ) ) {
$excategories = preg_split ( '/[\s,]+/' , $exclude );
2006-02-26 23:57:30 -05:00
if ( count ( $excategories ) ) {
foreach ( $excategories as $excat ) {
2006-03-20 23:26:50 -05:00
if ( empty ( $exclusions ))
$exclusions = ' AND ( cat_ID <> ' . intval ( $excat ) . ' ' ;
else
$exclusions .= ' AND cat_ID <> ' . intval ( $excat ) . ' ' ;
// TODO: Exclude children of excluded cats? Note: children are getting excluded
2006-02-26 23:57:30 -05:00
}
}
}
2006-03-20 23:26:50 -05:00
if ( ! empty ( $exclusions ))
$exclusions .= ')' ;
2006-03-01 08:30:19 -05:00
$exclusions = apply_filters ( 'list_cats_exclusions' , $exclusions );
$where .= $exclusions ;
2006-02-26 23:57:30 -05:00
2006-03-20 23:26:50 -05:00
$having = '' ;
2006-03-01 08:30:19 -05:00
if ( $hide_empty ) {
if ( 'link' == $type )
$having = 'HAVING link_count > 0' ;
else
$having = 'HAVING category_count > 0' ;
}
$categories = $wpdb -> get_results ( " SELECT * FROM $wpdb->categories WHERE $where $having ORDER BY $orderby $order " );
2006-02-26 23:57:30 -05:00
if ( empty ( $categories ) )
return array ();
2006-03-01 23:51:24 -05:00
// TODO: Integrate this into the main query.
2006-03-01 08:30:19 -05:00
if ( $include_last_update_time ) {
$stamps = $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 AND $where GROUP BY category_id " );
global $cat_stamps ;
foreach ( $stamps as $stamp )
$cat_stamps [ $stamp -> category_id ] = $stamp -> ts ;
function stamp_cat ( $cat ) {
global $cat_stamps ;
$cat -> last_update_timestamp = $cat_stamps [ $cat -> cat_ID ];
return $cat ;
2006-02-26 23:57:30 -05:00
}
2006-03-01 08:30:19 -05:00
$categories = array_map ( 'stamp_cat' , $categories );
unset ( $cat_stamps );
2006-02-26 23:57:30 -05:00
}
2006-03-01 08:30:19 -05:00
if ( $child_of || $hierarchical )
$categories = & _get_cat_children ( $child_of , $categories );
2006-02-26 23:57:30 -05:00
2006-04-03 22:02:12 -04:00
return apply_filters ( 'get_categories' , $categories );
2006-02-26 23:57:30 -05:00
}
2005-11-01 13:22:30 -05:00
?>