2004-01-27 10:58:01 +01:00
< ? php
2006-04-13 06:40:48 +02:00
function walk_category_tree () {
$walker = new Walker_Category ;
$args = func_get_args ();
return call_user_func_array ( array ( & $walker , 'walk' ), $args );
}
function walk_category_dropdown_tree () {
$walker = new Walker_CategoryDropdown ;
$args = func_get_args ();
return call_user_func_array ( array ( & $walker , 'walk' ), $args );
}
2004-06-04 04:36:46 +02:00
function get_the_category ( $id = false ) {
2005-10-12 19:01:50 +02:00
global $post , $category_cache ;
2004-06-04 04:36:46 +02:00
2005-03-01 10:10:12 +01:00
if ( ! $id )
$id = $post -> ID ;
2004-06-04 04:36:46 +02:00
2005-10-12 19:01:50 +02:00
if ( ! isset ( $category_cache [ $id ]) )
2005-03-27 22:45:01 +02:00
update_post_category_cache ( $id );
$categories = $category_cache [ $id ];
2004-11-13 00:08:51 +01:00
2005-10-12 19:01:50 +02:00
if ( ! empty ( $categories ) )
2005-03-01 10:10:12 +01:00
sort ( $categories );
else
$categories = array ();
2004-11-15 07:00:21 +01:00
2005-03-01 10:10:12 +01:00
return $categories ;
2004-01-27 10:58:01 +01:00
}
2005-02-14 04:27:50 +01:00
function get_category_link ( $category_id ) {
2005-03-27 22:45:01 +02:00
global $wp_rewrite ;
2005-02-14 04:27:50 +01:00
$catlink = $wp_rewrite -> get_category_permastruct ();
if ( empty ( $catlink ) ) {
2005-10-30 01:23:17 +02:00
$file = get_settings ( 'home' ) . '/' ;
2005-02-15 07:52:38 +01:00
$catlink = $file . '?cat=' . $category_id ;
2005-02-14 04:27:50 +01:00
} else {
2005-03-27 22:45:01 +02:00
$category = & get_category ( $category_id );
$category_nicename = $category -> category_nicename ;
2004-01-27 10:58:01 +01:00
2005-10-12 19:01:50 +02:00
if ( $parent = $category -> category_parent )
2005-02-14 04:27:50 +01: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 07:52:38 +01:00
return apply_filters ( 'category_link' , $catlink , $category_id );
2004-01-27 10:58:01 +01:00
}
2005-02-25 16:50:55 +01:00
function get_the_category_list ( $separator = '' , $parents = '' ) {
2005-10-12 19:01:50 +02: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 16:50:55 +01:00
}
function the_category ( $separator = '' , $parents = '' ) {
echo get_the_category_list ( $separator , $parents );
2004-01-27 10:58:01 +01:00
}
function get_the_category_by_ID ( $cat_ID ) {
2005-05-27 08:10:41 +02:00
$cat_ID = ( int ) $cat_ID ;
2005-03-27 22:45:01 +02:00
$category = & get_category ( $cat_ID );
return $category -> cat_name ;
2004-01-27 10:58:01 +01:00
}
2004-02-17 05:56:29 +01:00
function get_category_parents ( $id , $link = FALSE , $separator = '/' , $nicename = FALSE ){
2005-10-12 19:01:50 +02: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 10:58:01 +01:00
}
2004-02-17 05:56:29 +01:00
function get_category_children ( $id , $before = '/' , $after = '' ) {
2005-12-22 05:31:48 +01:00
if ( 0 == $id )
return '' ;
2005-11-07 22:56:03 +01:00
$cat_ids = get_all_category_ids ();
foreach ( $cat_ids as $cat_id ) {
if ( $cat_id == $id )
continue ;
2005-05-14 04:57:47 +02:00
2005-11-07 22:56:03 +01:00
$category = get_category ( $cat_id );
2005-10-12 19:01:50 +02:00
if ( $category -> category_parent == $id ) {
2005-05-14 04:57:47 +02:00
$chain .= $before . $category -> cat_ID . $after ;
$chain .= get_category_children ( $category -> cat_ID , $before , $after );
}
}
return $chain ;
2004-01-27 10:58:01 +01:00
}
function category_description ( $category = 0 ) {
2005-10-12 19:01:50 +02: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 10:58:01 +01:00
}
2006-03-02 05:51:24 +01:00
function wp_dropdown_categories ( $args = '' ) {
2006-03-02 06:47:59 +01:00
if ( is_array ( $args ) )
$r = & $args ;
else
parse_str ( $args , $r );
2006-03-02 07:37:00 +01:00
$defaults = array ( 'show_option_all' => '' , 'show_option_none' => '' , 'orderby' => 'ID' ,
2006-03-03 22:38:36 +01:00
'order' => 'ASC' , 'show_last_update' => 0 , 'show_count' => 0 ,
2006-03-02 07:37:00 +01: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-02 05:51:24 +01:00
$r [ 'include_last_update_time' ] = $r [ 'show_last_update' ];
extract ( $r );
2006-03-02 06:47:59 +01:00
$categories = get_categories ( $r );
2006-03-02 05:51:24 +01: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 19:01:50 +02:00
}
2006-03-02 05:51:24 +01:00
if ( $hierarchical )
$depth = 0 ; // Walk the full depth.
else
$depth = - 1 ; // Flat.
2006-04-13 06:40:48 +02:00
$output .= walk_category_dropdown_tree ( $categories , $depth , $r );
2006-03-02 05:51:24 +01:00
$output .= " </select> \n " ;
2005-10-12 19:01:50 +02:00
}
2006-03-02 05:51:24 +01:00
$output = apply_filters ( 'wp_dropdown_cats' , $output );
if ( $echo )
echo $output ;
return $output ;
}
function wp_list_categories ( $args = '' ) {
2006-03-02 06:47:59 +01:00
if ( is_array ( $args ) )
$r = & $args ;
else
parse_str ( $args , $r );
2006-03-03 22:38:36 +01: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 07:37:00 +01:00
'child_of' => 0 , 'feed' => '' , 'feed_image' => '' , 'exclude' => '' ,
2006-04-13 06:51:45 +02:00
'hierarchical' => true , 'title_li' => '' );
2006-03-02 07:37:00 +01:00
$r = array_merge ( $defaults , $r );
2006-03-03 22:38:36 +01:00
$r [ 'include_last_update_time' ] = $r [ 'show_date' ];
2006-03-01 14:30:19 +01:00
extract ( $r );
2006-03-02 06:47:59 +01:00
$categories = get_categories ( $r );
2006-03-02 05:51:24 +01:00
2006-03-01 14:30:19 +01: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 ;
2006-04-13 06:40:48 +02:00
$r [ 'current_category' ] = $wp_query -> get_queried_object_id ();
2006-03-01 14:30:19 +01:00
if ( $hierarchical )
$depth = 0 ; // Walk the full depth.
else
$depth = - 1 ; // Flat.
2006-04-13 06:40:48 +02:00
$output .= walk_category_tree ( $categories , $depth , $r );
2004-04-30 20:28:50 +02:00
}
2006-03-01 14:30:19 +01:00
if ( $title_li && $list )
$output .= '</ul></li>' ;
echo apply_filters ( 'list_cats' , $output );
}
2005-08-31 01:25:34 +02:00
2004-05-18 10:18:38 +02:00
function in_category ( $category ) { // Check if the current post is in the given category
2005-11-01 19:22:30 +01:00
global $category_cache , $post ;
2004-05-18 10:18:38 +02:00
2005-10-30 00:24:27 +02:00
if ( isset ( $category_cache [ $post -> ID ][ $category ] ) )
2004-05-18 10:18:38 +02:00
return true ;
else
return false ;
}
2005-10-30 00:24:27 +02:00
2006-03-01 14:30:19 +01: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-27 05:57:30 +01:00
function & get_categories ( $args = '' ) {
global $wpdb , $category_links ;
2006-03-02 06:47:59 +01:00
if ( is_array ( $args ) )
$r = & $args ;
else
parse_str ( $args , $r );
2006-02-27 05:57:30 +01:00
2006-03-02 07:37:00 +01:00
$defaults = array ( 'type' => 'post' , 'child_of' => 0 , 'orderby' => 'name' , 'order' => 'ASC' ,
2006-03-21 05:26:50 +01:00
'hide_empty' => true , 'include_last_update_time' => false , 'hierarchical' => 1 , $exclude => '' , $include => '' );
2006-03-02 07:37:00 +01:00
$r = array_merge ( $defaults , $r );
2006-03-21 05:26:50 +01:00
$r [ 'orderby' ] = " cat_ " . $r [ 'orderby' ]; // restricts order by to cat_ID and cat_name fields
2006-03-01 14:30:19 +01:00
extract ( $r );
$where = 'cat_ID > 0' ;
2006-03-21 05:26:50 +01: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 14:30:19 +01:00
$exclusions = '' ;
if ( ! empty ( $exclude ) ) {
$excategories = preg_split ( '/[\s,]+/' , $exclude );
2006-02-27 05:57:30 +01:00
if ( count ( $excategories ) ) {
foreach ( $excategories as $excat ) {
2006-03-21 05:26:50 +01: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-27 05:57:30 +01:00
}
}
}
2006-03-21 05:26:50 +01:00
if ( ! empty ( $exclusions ))
$exclusions .= ')' ;
2006-03-01 14:30:19 +01:00
$exclusions = apply_filters ( 'list_cats_exclusions' , $exclusions );
$where .= $exclusions ;
2006-02-27 05:57:30 +01:00
2006-03-21 05:26:50 +01:00
$having = '' ;
2006-03-01 14:30:19 +01: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-27 05:57:30 +01:00
if ( empty ( $categories ) )
return array ();
2006-03-02 05:51:24 +01:00
// TODO: Integrate this into the main query.
2006-03-01 14:30:19 +01: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-27 05:57:30 +01:00
}
2006-03-01 14:30:19 +01:00
$categories = array_map ( 'stamp_cat' , $categories );
unset ( $cat_stamps );
2006-02-27 05:57:30 +01:00
}
2006-03-01 14:30:19 +01:00
if ( $child_of || $hierarchical )
$categories = & _get_cat_children ( $child_of , $categories );
2006-02-27 05:57:30 +01:00
2006-04-04 04:02:12 +02:00
return apply_filters ( 'get_categories' , $categories );
2006-02-27 05:57:30 +01:00
}
2005-11-01 19:22:30 +01:00
?>