2004-01-27 10:58:01 +01:00
< ? php
2008-09-25 16:16:27 +02:00
/**
* Category Template Tags and API .
*
* @ package WordPress
* @ subpackage Template
*/
2004-01-27 10:58:01 +01:00
2008-09-25 16:16:27 +02:00
/**
* Retrieve category children list separated before and after the term IDs .
*
* @ since 1.2 . 0
*
* @ param int $id Category ID to retrieve children .
* @ param string $before Optional . Prepend before category term ID .
* @ param string $after Optional , default is empty string . Append after category term ID .
* @ param array $visited Optional . Category Term IDs that have already been added .
* @ return string
*/
2008-08-06 23:01:46 +02:00
function get_category_children ( $id , $before = '/' , $after = '' , $visited = array () ) {
2006-06-04 23:36:52 +02:00
if ( 0 == $id )
return '' ;
2006-10-03 17:41:44 +02:00
$chain = '' ;
2008-09-25 16:16:27 +02:00
/** TODO: consult hierarchy */
2006-06-04 23:36:52 +02:00
$cat_ids = get_all_category_ids ();
2008-08-06 22:31:54 +02:00
foreach ( ( array ) $cat_ids as $cat_id ) {
2007-05-23 20:59:12 +02:00
if ( $cat_id == $id )
2006-06-04 23:36:52 +02:00
continue ;
2008-08-06 23:01:46 +02:00
$category = get_category ( $cat_id );
2007-09-18 18:32:22 +02:00
if ( is_wp_error ( $category ) )
return $category ;
2008-08-06 23:01:46 +02:00
if ( $category -> parent == $id && ! in_array ( $category -> term_id , $visited ) ) {
2008-07-09 06:57:18 +02:00
$visited [] = $category -> term_id ;
2007-05-23 20:07:53 +02:00
$chain .= $before . $category -> term_id . $after ;
2008-08-06 23:01:46 +02:00
$chain .= get_category_children ( $category -> term_id , $before , $after );
2006-06-04 23:36:52 +02:00
}
}
return $chain ;
2006-04-13 06:40:48 +02:00
}
2008-09-25 16:16:27 +02:00
/**
* Retrieve category link URL .
*
* @ since 1.0 . 0
* @ uses apply_filters () Calls 'category_link' filter on category link and category ID .
*
* @ param int $category_id Category ID .
* @ return string
*/
2008-08-06 23:01:46 +02:00
function get_category_link ( $category_id ) {
2006-06-04 23:36:52 +02:00
global $wp_rewrite ;
$catlink = $wp_rewrite -> get_category_permastruct ();
2008-08-06 23:01:46 +02:00
if ( empty ( $catlink ) ) {
$file = get_option ( 'home' ) . '/' ;
2006-06-04 23:36:52 +02:00
$catlink = $file . '?cat=' . $category_id ;
} else {
2008-08-06 23:01:46 +02:00
$category = & get_category ( $category_id );
2007-09-18 18:32:22 +02:00
if ( is_wp_error ( $category ) )
return $category ;
2007-05-23 20:07:53 +02:00
$category_nicename = $category -> slug ;
2006-06-04 23:36:52 +02:00
2008-11-02 21:53:15 +01:00
if ( $category -> parent == $category_id ) // recursive recursion
2008-10-26 19:26:45 +01:00
$category -> parent = 0 ;
2008-11-10 22:57:26 +01:00
elseif ( $category -> parent != 0 )
$category_nicename = get_category_parents ( $category -> parent , false , '/' , true ) . $category_nicename ;
2006-06-04 23:36:52 +02:00
2008-08-06 23:01:46 +02:00
$catlink = str_replace ( '%category%' , $category_nicename , $catlink );
$catlink = get_option ( 'home' ) . user_trailingslashit ( $catlink , 'category' );
2006-06-04 23:36:52 +02:00
}
2008-08-06 23:01:46 +02:00
return apply_filters ( 'category_link' , $catlink , $category_id );
2006-06-04 23:36:52 +02:00
}
2008-09-25 16:16:27 +02:00
/**
* Retrieve category parents with separator .
*
* @ since 1.2 . 0
*
* @ param int $id Category ID .
* @ param bool $link Optional , default is false . Whether to format with link .
* @ param string $separator Optional , default is '/' . How to separate categories .
* @ param bool $nicename Optional , default is false . Whether to use nice name for display .
* @ param array $visited Optional . Already linked to categories to prevent duplicates .
* @ return string
*/
function get_category_parents ( $id , $link = false , $separator = '/' , $nicename = false , $visited = array () ) {
2006-06-04 23:36:52 +02:00
$chain = '' ;
2008-08-06 23:01:46 +02:00
$parent = & get_category ( $id );
2007-09-18 18:32:22 +02:00
if ( is_wp_error ( $parent ) )
return $parent ;
2006-06-04 23:36:52 +02:00
if ( $nicename )
2007-05-23 20:07:53 +02:00
$name = $parent -> slug ;
2006-06-04 23:36:52 +02:00
else
$name = $parent -> cat_name ;
2008-08-06 23:01:46 +02:00
if ( $parent -> parent && ( $parent -> parent != $parent -> term_id ) && ! in_array ( $parent -> parent , $visited ) ) {
2008-07-09 06:57:18 +02:00
$visited [] = $parent -> parent ;
2008-08-06 23:01:46 +02:00
$chain .= get_category_parents ( $parent -> parent , $link , $separator , $nicename , $visited );
2008-07-09 06:57:18 +02:00
}
2006-06-04 23:36:52 +02:00
if ( $link )
2008-08-06 23:01:46 +02:00
$chain .= '<a href="' . get_category_link ( $parent -> term_id ) . '" title="' . sprintf ( __ ( " View all posts in %s " ), $parent -> cat_name ) . '">' . $name . '</a>' . $separator ;
2006-06-04 23:36:52 +02:00
else
$chain .= $name . $separator ;
return $chain ;
2006-04-13 06:40:48 +02:00
}
2008-09-25 16:16:27 +02:00
/**
* Retrieve post categories .
*
* @ since 0.71
* @ uses $post
*
* @ param int $id Optional , default to current post ID . The post ID .
* @ return array
*/
2008-08-06 23:01:46 +02:00
function get_the_category ( $id = false ) {
2008-01-04 20:36:34 +01:00
global $post ;
2004-06-04 04:36:46 +02:00
2007-03-22 21:52:29 +01:00
$id = ( int ) $id ;
2005-03-01 10:10:12 +01:00
if ( ! $id )
2007-03-23 03:16:16 +01:00
$id = ( int ) $post -> ID ;
2004-06-04 04:36:46 +02:00
2008-08-06 23:01:46 +02:00
$categories = get_object_term_cache ( $id , 'category' );
2008-11-25 23:12:36 +01:00
if ( false === $categories ) {
2008-08-06 23:01:46 +02:00
$categories = wp_get_object_terms ( $id , 'category' );
2008-11-25 23:12:36 +01:00
wp_cache_add ( $post -> ID , $categories , 'category_relationships' );
}
2004-11-13 00:08:51 +01:00
2008-08-06 23:01:46 +02:00
if ( ! empty ( $categories ) )
usort ( $categories , '_usort_terms_by_name' );
2005-03-01 10:10:12 +01:00
else
$categories = array ();
2004-11-15 07:00:21 +01:00
2008-08-06 23:01:46 +02:00
foreach ( ( array ) array_keys ( $categories ) as $key ) {
_make_cat_compat ( $categories [ $key ] );
2007-08-18 19:21:51 +02:00
}
2005-03-01 10:10:12 +01:00
return $categories ;
2004-01-27 10:58:01 +01:00
}
2008-09-25 16:16:27 +02:00
/**
* Sort categories by name .
*
* Used by usort () as a callback , should not be used directly . Can actually be
* used to sort any term object .
*
* @ since 2.3 . 0
* @ access private
*
* @ param object $a
* @ param object $b
* @ return int
*/
2008-08-06 23:01:46 +02:00
function _usort_terms_by_name ( $a , $b ) {
return strcmp ( $a -> name , $b -> name );
2007-05-29 06:54:45 +02:00
}
2008-09-25 16:16:27 +02:00
/**
* Sort categories by ID .
*
* Used by usort () as a callback , should not be used directly . Can actually be
* used to sort any term object .
*
* @ since 2.3 . 0
* @ access private
*
* @ param object $a
* @ param object $b
* @ return int
*/
2008-08-06 23:01:46 +02:00
function _usort_terms_by_ID ( $a , $b ) {
2007-09-04 01:32:58 +02:00
if ( $a -> term_id > $b -> term_id )
return 1 ;
elseif ( $a -> term_id < $b -> term_id )
return - 1 ;
else
return 0 ;
2007-02-21 03:13:47 +01:00
}
2008-09-25 16:16:27 +02:00
/**
* Retrieve category name based on category ID .
*
* @ since 0.71
*
* @ param int $cat_ID Category ID .
* @ return string Category name .
*/
2008-08-06 23:01:46 +02:00
function get_the_category_by_ID ( $cat_ID ) {
2006-06-04 23:36:52 +02:00
$cat_ID = ( int ) $cat_ID ;
2008-08-06 23:01:46 +02:00
$category = & get_category ( $cat_ID );
2007-09-18 18:32:22 +02:00
if ( is_wp_error ( $category ) )
return $category ;
2007-05-23 20:07:53 +02:00
return $category -> name ;
2004-01-27 10:58:01 +01:00
}
2008-09-25 16:16:27 +02:00
/**
* Retrieve category list in either HTML list or custom format .
*
* @ since 1.5 . 1
*
* @ param string $separator Optional , default is empty string . Separator for between the categories .
* @ param string $parents Optional . How to display the parents .
* @ param int $post_id Optional . Post ID to retrieve categories .
* @ return string
*/
2008-08-06 23:01:46 +02:00
function get_the_category_list ( $separator = '' , $parents = '' , $post_id = false ) {
2007-01-23 09:21:28 +01:00
global $wp_rewrite ;
2008-08-06 23:01:46 +02:00
$categories = get_the_category ( $post_id );
if ( empty ( $categories ) )
return apply_filters ( 'the_category' , __ ( 'Uncategorized' ), $separator , $parents );
2005-10-12 19:01:50 +02:00
2008-08-06 23:01:46 +02:00
$rel = ( is_object ( $wp_rewrite ) && $wp_rewrite -> using_permalinks () ) ? 'rel="category tag"' : 'rel="category"' ;
2007-01-23 09:21:28 +01:00
2005-10-12 19:01:50 +02:00
$thelist = '' ;
if ( '' == $separator ) {
$thelist .= '<ul class="post-categories">' ;
foreach ( $categories as $category ) {
$thelist .= " \n \t <li> " ;
2008-08-06 23:01:46 +02:00
switch ( strtolower ( $parents ) ) {
2005-10-12 19:01:50 +02:00
case 'multiple' :
2008-08-06 23:01:46 +02:00
if ( $category -> parent )
2008-10-15 23:02:07 +02:00
$thelist .= get_category_parents ( $category -> parent , true , $separator );
2008-08-06 23:01:46 +02:00
$thelist .= '<a href="' . get_category_link ( $category -> term_id ) . '" title="' . sprintf ( __ ( " View all posts in %s " ), $category -> name ) . '" ' . $rel . '>' . $category -> name . '</a></li>' ;
2005-10-12 19:01:50 +02:00
break ;
case 'single' :
2008-08-06 23:01:46 +02:00
$thelist .= '<a href="' . get_category_link ( $category -> term_id ) . '" title="' . sprintf ( __ ( " View all posts in %s " ), $category -> name ) . '" ' . $rel . '>' ;
if ( $category -> parent )
2008-10-15 23:02:07 +02:00
$thelist .= get_category_parents ( $category -> parent , false , $separator );
2007-05-23 20:07:53 +02:00
$thelist .= $category -> name . '</a></li>' ;
2005-10-12 19:01:50 +02:00
break ;
case '' :
default :
2008-08-06 23:01:46 +02:00
$thelist .= '<a href="' . get_category_link ( $category -> term_id ) . '" title="' . sprintf ( __ ( " View all posts in %s " ), $category -> name ) . '" ' . $rel . '>' . $category -> cat_name . '</a></li>' ;
2005-10-12 19:01:50 +02:00
}
}
$thelist .= '</ul>' ;
} else {
$i = 0 ;
foreach ( $categories as $category ) {
if ( 0 < $i )
$thelist .= $separator . ' ' ;
2008-08-06 23:01:46 +02:00
switch ( strtolower ( $parents ) ) {
2005-10-12 19:01:50 +02:00
case 'multiple' :
2007-05-23 20:07:53 +02:00
if ( $category -> parent )
2008-10-15 23:02:07 +02:00
$thelist .= get_category_parents ( $category -> parent , true , $separator );
2008-08-06 23:01:46 +02:00
$thelist .= '<a href="' . get_category_link ( $category -> term_id ) . '" title="' . sprintf ( __ ( " View all posts in %s " ), $category -> name ) . '" ' . $rel . '>' . $category -> cat_name . '</a>' ;
2005-10-12 19:01:50 +02:00
break ;
case 'single' :
2008-08-06 23:01:46 +02:00
$thelist .= '<a href="' . get_category_link ( $category -> term_id ) . '" title="' . sprintf ( __ ( " View all posts in %s " ), $category -> name ) . '" ' . $rel . '>' ;
2007-05-23 20:07:53 +02:00
if ( $category -> parent )
2008-10-15 23:02:07 +02:00
$thelist .= get_category_parents ( $category -> parent , false , $separator );
2005-10-12 19:01:50 +02:00
$thelist .= " $category->cat_name </a> " ;
break ;
case '' :
default :
2008-08-06 23:01:46 +02:00
$thelist .= '<a href="' . get_category_link ( $category -> term_id ) . '" title="' . sprintf ( __ ( " View all posts in %s " ), $category -> name ) . '" ' . $rel . '>' . $category -> name . '</a>' ;
2005-10-12 19:01:50 +02:00
}
++ $i ;
}
}
2008-08-06 23:01:46 +02:00
return apply_filters ( 'the_category' , $thelist , $separator , $parents );
2005-02-25 16:50:55 +01:00
}
2008-09-25 16:16:27 +02:00
/**
* Checks whether the current post is within a particular category .
2008-03-02 21:17:30 +01:00
*
2008-09-25 16:16:27 +02:00
* This function checks to see if the post is within the supplied category . The
* category can be specified by number or name and will be checked as a name
* first to allow for categories with numeric names . Note : Prior to v2 . 5 of
* WordPress category names were not supported .
2008-03-02 21:17:30 +01:00
*
* @ since 1.2 . 0
*
2008-09-25 16:16:27 +02:00
* @ param int | string $category Category ID or category name .
* @ return bool True , if the post is in the supplied category .
2008-03-02 21:17:30 +01:00
*/
2008-09-25 16:16:27 +02:00
function in_category ( $category ) {
2007-12-06 20:49:33 +01:00
global $post ;
2005-10-12 19:01:50 +02:00
2008-08-06 23:01:46 +02:00
if ( empty ( $category ) )
2008-03-24 21:39:05 +01:00
return false ;
2008-05-07 21:12:44 +02:00
// If category is not an int, check to see if it's a name
2008-08-06 23:01:46 +02:00
if ( ! is_int ( $category ) ) {
$cat_ID = get_cat_ID ( $category );
2008-05-07 21:12:44 +02:00
if ( $cat_ID )
$category = $cat_ID ;
}
2008-03-02 21:17:30 +01:00
2008-08-06 23:01:46 +02:00
$categories = get_object_term_cache ( $post -> ID , 'category' );
2008-10-22 23:31:55 +02:00
if ( false !== $categories ) {
if ( array_key_exists ( $category , $categories ) )
return true ;
else
return false ;
}
$categories = wp_get_object_terms ( $post -> ID , 'category' , 'fields=ids' );
if ( is_array ( $categories ) && in_array ( $category , $categories ) )
2006-06-04 23:36:52 +02:00
return true ;
2005-10-12 19:01:50 +02:00
else
2006-06-04 23:36:52 +02:00
return false ;
2008-10-22 23:31:55 +02:00
2004-01-27 10:58:01 +01:00
}
2008-09-25 16:16:27 +02:00
/**
* Display the category list for the post .
*
* @ since 0.71
*
* @ param string $separator Optional , default is empty string . Separator for between the categories .
* @ param string $parents Optional . How to display the parents .
* @ param int $post_id Optional . Post ID to retrieve categories .
*/
2008-08-06 23:01:46 +02:00
function the_category ( $separator = '' , $parents = '' , $post_id = false ) {
echo get_the_category_list ( $separator , $parents , $post_id );
2004-01-27 10:58:01 +01:00
}
2008-09-25 16:16:27 +02:00
/**
* Retrieve category description .
*
* @ since 1.0 . 0
*
* @ param int $category Optional . Category ID . Will use global category ID by default .
* @ return string Category description , available .
*/
2008-08-06 23:01:46 +02:00
function category_description ( $category = 0 ) {
2005-10-12 19:01:50 +02:00
global $cat ;
if ( ! $category )
$category = $cat ;
2007-06-06 18:13:12 +02:00
2008-08-06 23:01:46 +02:00
return get_term_field ( 'description' , $category , 'category' );
2004-01-27 10:58:01 +01:00
}
2008-09-25 16:16:27 +02:00
/**
* Display or retrieve the HTML dropdown list of categories .
*
* The list of arguments is below :
* 'show_option_all' ( string ) - Text to display for showing all categories .
* 'show_option_none' ( string ) - Text to display for showing no categories .
* 'orderby' ( string ) default is 'ID' - What column to use for ordering the
* categories .
* 'order' ( string ) default is 'ASC' - What direction to order categories .
* 'show_last_update' ( bool | int ) default is 0 - See { @ link get_categories ()}
* 'show_count' ( bool | int ) default is 0 - Whether to show how many posts are
* in the category .
* 'hide_empty' ( bool | int ) default is 1 - Whether to hide categories that
* don ' t have any posts attached to them .
* 'child_of' ( int ) default is 0 - See { @ link get_categories ()} .
* 'exclude' ( string ) - See { @ link get_categories ()} .
* 'echo' ( bool | int ) default is 1 - Whether to display or retrieve content .
* 'depth' ( int ) - The max depth .
* 'tab_index' ( int ) - Tab index for select element .
* 'name' ( string ) - The name attribute value for selected element .
* 'class' ( string ) - The class attribute value for selected element .
* 'selected' ( int ) - Which category ID is selected .
*
* The 'hierarchical' argument , which is disabled by default , will override the
* depth argument , unless it is true . When the argument is false , it will
* display all of the categories . When it is enabled it will use the value in
* the 'depth' argument .
*
* @ since 2.1 . 0
*
* @ param string | array $args Optional . Override default arguments .
* @ return string HTML content only if 'echo' argument is 0.
*/
2008-08-06 23:01:46 +02:00
function wp_dropdown_categories ( $args = '' ) {
2007-05-11 05:10:05 +02:00
$defaults = array (
2007-09-04 01:32:58 +02:00
'show_option_all' => '' , 'show_option_none' => '' ,
'orderby' => 'ID' , 'order' => 'ASC' ,
'show_last_update' => 0 , 'show_count' => 0 ,
'hide_empty' => 1 , 'child_of' => 0 ,
'exclude' => '' , 'echo' => 1 ,
'selected' => 0 , 'hierarchical' => 0 ,
2008-01-30 21:07:52 +01:00
'name' => 'cat' , 'class' => 'postform' ,
2008-03-22 10:14:49 +01:00
'depth' => 0 , 'tab_index' => 0
2007-05-11 05:10:05 +02:00
);
2007-06-14 04:25:30 +02:00
2008-08-06 23:01:46 +02:00
$defaults [ 'selected' ] = ( is_category () ) ? get_query_var ( 'cat' ) : 0 ;
2007-06-14 04:25:30 +02:00
2007-05-11 05:10:05 +02:00
$r = wp_parse_args ( $args , $defaults );
2006-03-02 05:51:24 +01:00
$r [ 'include_last_update_time' ] = $r [ 'show_last_update' ];
2007-05-11 05:10:05 +02:00
extract ( $r );
2006-03-02 05:51:24 +01:00
2008-03-22 10:14:49 +01:00
$tab_index_attribute = '' ;
if ( ( int ) $tab_index > 0 )
$tab_index_attribute = " tabindex= \" $tab_index\ " " ;
2008-08-06 23:01:46 +02:00
$categories = get_categories ( $r );
2006-03-02 05:51:24 +01:00
$output = '' ;
2008-08-06 23:01:46 +02:00
if ( ! empty ( $categories ) ) {
2008-03-22 10:14:49 +01:00
$output = " <select name=' $name ' id=' $name ' class=' $class ' $tab_index_attribute > \n " ;
2006-03-02 05:51:24 +01:00
if ( $show_option_all ) {
2008-08-06 23:01:46 +02:00
$show_option_all = apply_filters ( 'list_cats' , $show_option_all );
2006-03-02 05:51:24 +01:00
$output .= " \t <option value='0'> $show_option_all </option> \n " ;
}
2008-08-06 23:01:46 +02:00
if ( $show_option_none ) {
$show_option_none = apply_filters ( 'list_cats' , $show_option_none );
2006-03-02 05:51:24 +01:00
$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 )
2008-01-31 01:58:54 +01:00
$depth = $r [ 'depth' ]; // Walk the full depth.
2006-03-02 05:51:24 +01:00
else
$depth = - 1 ; // Flat.
2008-08-06 23:01:46 +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
2008-08-06 23:01:46 +02:00
$output = apply_filters ( 'wp_dropdown_cats' , $output );
2006-03-02 05:51:24 +01:00
if ( $echo )
echo $output ;
return $output ;
}
2008-09-25 16:16:27 +02:00
/**
* Display or retrieve the HTML list of categories .
*
* The list of arguments is below :
* 'show_option_all' ( string ) - Text to display for showing all categories .
* 'orderby' ( string ) default is 'ID' - What column to use for ordering the
* categories .
* 'order' ( string ) default is 'ASC' - What direction to order categories .
* 'show_last_update' ( bool | int ) default is 0 - See { @ link
* walk_category_dropdown_tree ()}
* 'show_count' ( bool | int ) default is 0 - Whether to show how many posts are
* in the category .
* 'hide_empty' ( bool | int ) default is 1 - Whether to hide categories that
* don ' t have any posts attached to them .
* 'use_desc_for_title' ( bool | int ) default is 1 - Whether to use the
* description instead of the category title .
* 'feed' - See { @ link get_categories ()} .
* 'feed_type' - See { @ link get_categories ()} .
* 'feed_image' - See { @ link get_categories ()} .
* 'child_of' ( int ) default is 0 - See { @ link get_categories ()} .
* 'exclude' ( string ) - See { @ link get_categories ()} .
* 'echo' ( bool | int ) default is 1 - Whether to display or retrieve content .
* 'current_category' ( int ) - See { @ link get_categories ()} .
* 'hierarchical' ( bool ) - See { @ link get_categories ()} .
* 'title_li' ( string ) - See { @ link get_categories ()} .
* 'depth' ( int ) - The max depth .
*
* @ since 2.1 . 0
*
* @ param string | array $args Optional . Override default arguments .
* @ return string HTML content only if 'echo' argument is 0.
*/
2008-08-06 23:01:46 +02:00
function wp_list_categories ( $args = '' ) {
2007-05-11 05:10:05 +02:00
$defaults = array (
2007-09-04 01:32:58 +02:00
'show_option_all' => '' , 'orderby' => 'name' ,
'order' => 'ASC' , 'show_last_update' => 0 ,
'style' => 'list' , 'show_count' => 0 ,
'hide_empty' => 1 , 'use_desc_for_title' => 1 ,
2007-12-06 20:58:15 +01:00
'child_of' => 0 , 'feed' => '' , 'feed_type' => '' ,
2008-05-07 21:10:36 +02:00
'feed_image' => '' , 'exclude' => '' , 'current_category' => 0 ,
2008-08-06 23:01:46 +02:00
'hierarchical' => true , 'title_li' => __ ( 'Categories' ),
2008-01-10 22:51:00 +01:00
'echo' => 1 , 'depth' => 0
2007-05-11 05:10:05 +02:00
);
2007-06-14 04:25:30 +02:00
2007-05-11 05:10:05 +02:00
$r = wp_parse_args ( $args , $defaults );
2007-06-14 04:25:30 +02:00
2007-05-11 05:10:05 +02:00
if ( ! isset ( $r [ 'pad_counts' ] ) && $r [ 'show_count' ] && $r [ 'hierarchical' ] ) {
2007-01-09 09:45:05 +01:00
$r [ 'pad_counts' ] = true ;
2007-05-11 05:10:05 +02:00
}
2007-06-14 04:25:30 +02:00
2007-05-11 05:10:05 +02:00
if ( isset ( $r [ 'show_date' ] ) ) {
2006-09-20 01:56:28 +02:00
$r [ 'include_last_update_time' ] = $r [ 'show_date' ];
2007-05-11 05:10:05 +02:00
}
2007-06-14 04:25:30 +02:00
2007-05-11 05:10:05 +02:00
extract ( $r );
2007-06-14 04:25:30 +02:00
2008-08-06 23:01:46 +02:00
$categories = get_categories ( $r );
2006-11-19 08:56:05 +01:00
2006-03-01 14:30:19 +01:00
$output = '' ;
2006-06-17 02:05:00 +02:00
if ( $title_li && 'list' == $style )
2006-03-01 14:30:19 +01:00
$output = '<li class="categories">' . $r [ 'title_li' ] . '<ul>' ;
2008-08-06 23:01:46 +02:00
if ( empty ( $categories ) ) {
2007-01-19 21:58:56 +01:00
if ( 'list' == $style )
2008-08-06 23:01:46 +02:00
$output .= '<li>' . __ ( " No categories " ) . '</li>' ;
2006-03-01 14:30:19 +01:00
else
2008-08-06 23:01:46 +02:00
$output .= __ ( " No categories " );
2006-03-01 14:30:19 +01:00
} else {
global $wp_query ;
2007-06-14 04:25:30 +02:00
2008-08-06 23:01:46 +02:00
if ( ! empty ( $show_option_all ) )
if ( 'list' == $style )
$output .= '<li><a href="' . get_bloginfo ( 'url' ) . '">' . $show_option_all . '</a></li>' ;
2007-04-14 01:20:14 +02:00
else
2008-08-06 23:01:46 +02:00
$output .= '<a href="' . get_bloginfo ( 'url' ) . '">' . $show_option_all . '</a>' ;
2007-06-14 04:25:30 +02:00
2008-05-07 21:10:36 +02:00
if ( empty ( $r [ 'current_category' ] ) && is_category () )
2006-12-01 19:55:27 +01:00
$r [ 'current_category' ] = $wp_query -> get_queried_object_id ();
2006-03-01 14:30:19 +01:00
if ( $hierarchical )
2008-01-10 22:51:00 +01:00
$depth = $r [ 'depth' ];
2006-03-01 14:30:19 +01:00
else
$depth = - 1 ; // Flat.
2008-08-06 23:01:46 +02:00
$output .= walk_category_tree ( $categories , $depth , $r );
2004-04-30 20:28:50 +02:00
}
2006-06-17 02:05:00 +02:00
if ( $title_li && 'list' == $style )
2006-03-01 14:30:19 +01:00
$output .= '</ul></li>' ;
2006-11-19 08:56:05 +01:00
2008-08-06 23:01:46 +02:00
$output = apply_filters ( 'wp_list_categories' , $output );
2007-09-12 04:53:27 +02:00
if ( $echo )
echo $output ;
else
return $output ;
2006-03-01 14:30:19 +01:00
}
2005-08-31 01:25:34 +02:00
2008-09-25 16:16:27 +02:00
/**
* Display tag cloud .
*
* The text size is set by the 'smallest' and 'largest' arguments , which will
* use the 'unit' argument value for the CSS text size unit . The 'format'
* argument can be 'flat' ( default ), 'list' , or 'array' . The flat value for the
* 'format' argument will separate tags with spaces . The list value for the
* 'format' argument will format the tags in a UL HTML list . The array value for
* the 'format' argument will return in PHP array type format .
*
* The 'orderby' argument will accept 'name' or 'count' and defaults to 'name' .
* The 'order' is the direction to sort , defaults to 'ASC' and can be 'DESC' .
*
* The 'number' argument is how many tags to return . By default , the limit will
* be to return the top 45 tags in the tag cloud list .
*
2008-11-21 19:12:57 +01:00
* The 'topic_count_text_callback' argument is a function , which , given the count
* of the posts with that tag , returns a text for the tooltip of the tag link .
* @ see default_topic_count_text
2008-09-25 16:16:27 +02:00
*
* The 'exclude' and 'include' arguments are used for the { @ link get_tags ()}
* function . Only one should be used , because only one will be used and the
* other ignored , if they are both set .
*
* @ since 2.3 . 0
*
* @ param array | string $args Optional . Override default arguments .
* @ return array Generated tag cloud , only if no failures and 'array' is set for the 'format' argument .
*/
2007-04-10 21:52:15 +02:00
function wp_tag_cloud ( $args = '' ) {
$defaults = array (
2007-09-04 01:32:58 +02:00
'smallest' => 8 , 'largest' => 22 , 'unit' => 'pt' , 'number' => 45 ,
2007-04-10 21:52:15 +02:00
'format' => 'flat' , 'orderby' => 'name' , 'order' => 'ASC' ,
2008-10-25 20:19:42 +02:00
'exclude' => '' , 'include' => '' , 'link' => 'view'
2007-04-10 21:52:15 +02:00
);
$args = wp_parse_args ( $args , $defaults );
2008-08-06 23:01:46 +02:00
$tags = get_tags ( array_merge ( $args , array ( 'orderby' => 'count' , 'order' => 'DESC' ) ) ); // Always query top tags
2007-04-10 21:52:15 +02:00
2008-08-06 23:01:46 +02:00
if ( empty ( $tags ) )
2007-04-10 21:52:15 +02:00
return ;
2008-08-19 18:36:18 +02:00
foreach ( $tags as $key => $tag ) {
2008-10-25 20:19:42 +02:00
if ( 'edit' == $args [ 'link' ] )
$link = get_edit_tag_link ( $tag -> term_id );
else
$link = get_tag_link ( $tag -> term_id );
2008-08-19 18:36:18 +02:00
if ( is_wp_error ( $link ) )
return false ;
2008-01-14 23:35:43 +01:00
2008-08-19 18:36:18 +02:00
$tags [ $key ] -> link = $link ;
$tags [ $key ] -> id = $tag -> term_id ;
}
$return = wp_generate_tag_cloud ( $tags , $args ); // Here's where those top tags get sorted according to $args
2008-08-19 01:40:41 +02:00
2008-01-14 23:35:43 +01:00
$return = apply_filters ( 'wp_tag_cloud' , $return , $args );
if ( 'array' == $args [ 'format' ] )
return $return ;
echo $return ;
2007-04-10 21:52:15 +02:00
}
2008-11-21 19:12:57 +01:00
/**
* Default text for tooltip for tag links
*
* @ param integer $count number of posts with that tag
* @ return string text for the tooltip of a tag link .
*/
function default_topic_count_text ( $count ) {
return sprintf ( __ngettext ( '%s topic' , '%s topics' , $count ), number_format_i18n ( $count ) );
}
2008-08-04 23:01:09 +02:00
/**
2008-09-25 16:16:27 +02:00
* Generates a tag cloud ( heatmap ) from provided data .
2008-08-04 23:01:09 +02:00
*
2008-09-25 16:16:27 +02:00
* The text size is set by the 'smallest' and 'largest' arguments , which will
* use the 'unit' argument value for the CSS text size unit . The 'format'
* argument can be 'flat' ( default ), 'list' , or 'array' . The flat value for the
* 'format' argument will separate tags with spaces . The list value for the
* 'format' argument will format the tags in a UL HTML list . The array value for
* the 'format' argument will return in PHP array type format .
2008-08-06 23:01:46 +02:00
*
2008-09-25 16:16:27 +02:00
* The 'orderby' argument will accept 'name' or 'count' and defaults to 'name' .
* The 'order' is the direction to sort , defaults to 'ASC' and can be 'DESC' or
* 'RAND' .
2008-08-04 23:01:09 +02:00
*
2008-09-25 16:16:27 +02:00
* The 'number' argument is how many tags to return . By default , the limit will
* be to return the entire tag cloud list .
*
2008-11-21 19:12:57 +01:00
* The 'topic_count_text_callback' argument is a function , which given the count
* of the posts with that tag returns a text for the tooltip of the tag link .
* @ see default_topic_count_text
*
2008-09-25 16:16:27 +02:00
*
* @ todo Complete functionality .
* @ since 2.3 . 0
*
* @ param array $tags List of tags .
* @ param string | array $args Optional , override default arguments .
* @ return string
*/
2007-04-10 21:52:15 +02:00
function wp_generate_tag_cloud ( $tags , $args = '' ) {
global $wp_rewrite ;
$defaults = array (
2008-08-19 18:36:18 +02:00
'smallest' => 8 , 'largest' => 22 , 'unit' => 'pt' , 'number' => 0 ,
'format' => 'flat' , 'orderby' => 'name' , 'order' => 'ASC' ,
2008-11-21 19:12:57 +01:00
'topic_count_text_callback' => 'default_topic_count_text' ,
2007-04-10 21:52:15 +02:00
);
2008-11-21 19:12:57 +01:00
if ( ! isset ( $args [ 'topic_count_text_callback' ] ) && isset ( $args [ 'single_text' ] ) && isset ( $args [ 'multiple_text' ] ) ) {
$body = ' return sprintf (
__ngettext ( '.var_export($args[' single_text '], true).' , '.var_export($args[' multiple_text '], true).' , $count ),
number_format_i18n ( $count )); ' ;
$args [ 'topic_count_text_callback' ] = create_function ( '$count' , $body );
}
2007-04-10 21:52:15 +02:00
$args = wp_parse_args ( $args , $defaults );
2008-11-21 19:12:57 +01:00
2008-08-06 23:01:46 +02:00
extract ( $args );
2007-04-10 21:52:15 +02:00
2008-08-06 23:01:46 +02:00
if ( empty ( $tags ) )
2007-04-10 21:52:15 +02:00
return ;
// SQL cannot save you; this is a second (potentially different) sort on a subset of data.
if ( 'name' == $orderby )
2008-08-19 18:36:18 +02:00
uasort ( $tags , create_function ( '$a, $b' , 'return strnatcasecmp($a->name, $b->name);' ) );
2007-04-10 21:52:15 +02:00
else
2008-08-19 18:36:18 +02:00
uasort ( $tags , create_function ( '$a, $b' , 'return ($a->count < $b->count);' ) );
2007-04-10 21:52:15 +02:00
if ( 'DESC' == $order )
2008-08-19 18:36:18 +02:00
$tags = array_reverse ( $tags , true );
2008-02-13 20:12:46 +01:00
elseif ( 'RAND' == $order ) {
2008-08-19 18:36:18 +02:00
$keys = array_rand ( $tags , count ( $tags ) );
2008-02-13 20:12:46 +01:00
foreach ( $keys as $key )
2008-08-19 18:36:18 +02:00
$temp [ $key ] = $tags [ $key ];
$tags = $temp ;
2008-08-06 23:01:46 +02:00
unset ( $temp );
2008-02-13 20:12:46 +01:00
}
2007-04-10 21:52:15 +02:00
2008-08-19 18:36:18 +02:00
if ( $number > 0 )
$tags = array_slice ( $tags , 0 , $number );
$counts = array ();
foreach ( ( array ) $tags as $key => $tag )
$counts [ $key ] = $tag -> count ;
$min_count = min ( $counts );
$spread = max ( $counts ) - $min_count ;
if ( $spread <= 0 )
$spread = 1 ;
$font_spread = $largest - $smallest ;
if ( $font_spread <= 0 )
$font_spread = 1 ;
$font_step = $font_spread / $spread ;
2007-04-10 21:52:15 +02:00
$a = array ();
2008-08-06 23:01:46 +02:00
$rel = ( is_object ( $wp_rewrite ) && $wp_rewrite -> using_permalinks () ) ? ' rel="tag"' : '' ;
2007-04-10 21:52:15 +02:00
2008-08-19 18:36:18 +02:00
foreach ( $tags as $key => $tag ) {
$count = $counts [ $key ];
2008-11-05 00:15:59 +01:00
$tag_link = '#' != $tag -> link ? clean_url ( $tag -> link ) : '#' ;
2008-08-19 18:36:18 +02:00
$tag_id = isset ( $tags [ $key ] -> id ) ? $tags [ $key ] -> id : $key ;
$tag_name = $tags [ $key ] -> name ;
2008-11-21 19:12:57 +01:00
$a [] = " <a href=' $tag_link ' class='tag-link- $tag_id ' title=' " . attribute_escape ( $topic_count_text_callback ( $count ) ) . " ' $rel style='font-size: " .
2007-04-10 21:52:15 +02:00
( $smallest + ( ( $count - $min_count ) * $font_step ) )
2008-08-19 18:36:18 +02:00
. " $unit ;'> $tag_name </a> " ;
2007-04-10 21:52:15 +02:00
}
switch ( $format ) :
case 'array' :
$return =& $a ;
break ;
case 'list' :
$return = " <ul class='wp-tag-cloud'> \n \t <li> " ;
2008-08-06 23:01:46 +02:00
$return .= join ( " </li> \n \t <li> " , $a );
2007-04-10 21:52:15 +02:00
$return .= " </li> \n </ul> \n " ;
break ;
default :
2008-08-06 23:01:46 +02:00
$return = join ( " \n " , $a );
2007-04-10 21:52:15 +02:00
break ;
endswitch ;
return apply_filters ( 'wp_generate_tag_cloud' , $return , $tags , $args );
}
2006-06-04 23:36:52 +02:00
//
// Helper functions
//
2006-03-01 14:30:19 +01:00
2008-09-25 16:16:27 +02:00
/**
* Retrieve HTML list content for category list .
*
* @ uses Walker_Category to create HTML list content .
* @ since 2.1 . 0
* @ see Walker_Category :: walk () for parameters and return description .
*/
2006-06-04 23:36:52 +02:00
function walk_category_tree () {
$walker = new Walker_Category ;
$args = func_get_args ();
2008-08-06 23:01:46 +02:00
return call_user_func_array ( array ( & $walker , 'walk' ), $args );
2006-03-01 14:30:19 +01:00
}
2008-09-25 16:16:27 +02:00
/**
* Retrieve HTML dropdown ( select ) content for category list .
*
* @ uses Walker_CategoryDropdown to create HTML dropdown content .
* @ since 2.1 . 0
* @ see Walker_CategoryDropdown :: walk () for parameters and return description .
*/
2006-06-04 23:36:52 +02:00
function walk_category_dropdown_tree () {
$walker = new Walker_CategoryDropdown ;
$args = func_get_args ();
2008-08-06 23:01:46 +02:00
return call_user_func_array ( array ( & $walker , 'walk' ), $args );
2006-02-27 05:57:30 +01:00
}
2007-04-10 23:23:11 +02:00
//
// Tags
//
2008-09-25 16:16:27 +02:00
/**
* Retrieve the link to the tag .
*
* @ since 2.3 . 0
* @ uses apply_filters () Calls 'tag_link' with tag link and tag ID as parameters .
*
* @ param int $tag_id Tag ( term ) ID .
* @ return string
*/
2007-04-10 23:23:11 +02:00
function get_tag_link ( $tag_id ) {
global $wp_rewrite ;
2007-05-23 05:57:20 +02:00
$taglink = $wp_rewrite -> get_tag_permastruct ();
2007-04-10 23:23:11 +02:00
2008-08-06 23:01:46 +02:00
$tag = & get_term ( $tag_id , 'post_tag' );
2007-09-18 18:32:22 +02:00
if ( is_wp_error ( $tag ) )
return $tag ;
2007-05-23 05:57:20 +02:00
$slug = $tag -> slug ;
2007-04-10 23:23:11 +02:00
2008-08-06 23:01:46 +02:00
if ( empty ( $taglink ) ) {
$file = get_option ( 'home' ) . '/' ;
2007-05-23 05:57:20 +02:00
$taglink = $file . '?tag=' . $slug ;
2007-04-10 23:23:11 +02:00
} else {
2008-08-06 23:01:46 +02:00
$taglink = str_replace ( '%tag%' , $slug , $taglink );
$taglink = get_option ( 'home' ) . user_trailingslashit ( $taglink , 'category' );
2007-04-10 23:23:11 +02:00
}
2008-08-06 23:01:46 +02:00
return apply_filters ( 'tag_link' , $taglink , $tag_id );
2007-04-10 23:23:11 +02:00
}
2008-09-25 16:16:27 +02:00
/**
* Retrieve the tags for a post .
*
* @ since 2.3 . 0
* @ uses apply_filters () Calls 'get_the_tags' filter on the list of post tags .
*
* @ param int $id Post ID .
* @ return array
*/
2007-04-10 23:23:11 +02:00
function get_the_tags ( $id = 0 ) {
2008-08-06 23:01:46 +02:00
return apply_filters ( 'get_the_tags' , get_the_terms ( $id , 'post_tag' ) );
2008-03-26 07:37:19 +01:00
}
2008-09-25 16:16:27 +02:00
/**
* Retrieve the tags for a post formatted as a string .
*
* @ since 2.3 . 0
* @ uses apply_filters () Calls 'the_tags' filter on string list of tags .
*
* @ param string $before Optional . Before tags .
* @ param string $sep Optional . Between tags .
* @ param string $after Optional . After tags .
* @ return string
*/
2008-03-26 07:37:19 +01:00
function get_the_tag_list ( $before = '' , $sep = '' , $after = '' ) {
2008-08-06 23:01:46 +02:00
return apply_filters ( 'the_tags' , get_the_term_list ( 0 , 'post_tag' , $before , $sep , $after ) );
2008-03-26 07:37:19 +01:00
}
2008-09-25 16:16:27 +02:00
/**
* Retrieve the tags for a post .
*
* @ since 2.3 . 0
*
* @ param string $before Optional . Before list .
* @ param string $sep Optional . Separate items using this .
* @ param string $after Optional . After list .
* @ return string
*/
2008-03-26 07:37:19 +01:00
function the_tags ( $before = 'Tags: ' , $sep = ', ' , $after = '' ) {
return the_terms ( 0 , 'post_tag' , $before , $sep , $after );
}
2008-09-25 16:16:27 +02:00
/**
* Retrieve the terms of the taxonomy that are attached to the post .
*
* This function can only be used within the loop .
*
* @ since 2.5 . 0
*
* @ param int $id Post ID . Is not optional .
* @ param string $taxonomy Taxonomy name .
* @ return array | bool False on failure . Array of term objects on success .
*/
2008-03-26 07:37:19 +01:00
function get_the_terms ( $id = 0 , $taxonomy ) {
2007-09-04 01:32:58 +02:00
global $post ;
2007-06-14 04:25:30 +02:00
2007-04-10 23:23:11 +02:00
$id = ( int ) $id ;
2007-09-04 01:32:58 +02:00
if ( ! $id && ! in_the_loop () )
return false ; // in-the-loop function
2007-06-14 04:25:30 +02:00
2007-09-04 01:32:58 +02:00
if ( ! $id )
2007-04-10 23:23:11 +02:00
$id = ( int ) $post -> ID ;
2008-08-06 23:01:46 +02:00
$terms = get_object_term_cache ( $id , $taxonomy );
2008-03-26 07:37:19 +01:00
if ( false === $terms )
2008-08-06 23:01:46 +02:00
$terms = wp_get_object_terms ( $id , $taxonomy );
2007-05-30 05:36:59 +02:00
2008-03-26 07:37:19 +01:00
if ( empty ( $terms ) )
2007-09-04 01:32:58 +02:00
return false ;
2008-03-26 07:37:19 +01:00
return $terms ;
2007-04-10 23:23:11 +02:00
}
2008-09-25 16:16:27 +02:00
/**
* Retrieve terms as a list with specified format .
*
* @ since 2.5 . 0
*
* @ param int $id Term ID .
* @ param string $taxonomy Taxonomy name .
* @ param string $before Optional . Before list .
* @ param string $sep Optional . Separate items using this .
* @ param string $after Optional . After list .
* @ return string
*/
2008-03-26 07:37:19 +01:00
function get_the_term_list ( $id = 0 , $taxonomy , $before = '' , $sep = '' , $after = '' ) {
2008-08-06 23:01:46 +02:00
$terms = get_the_terms ( $id , $taxonomy );
2007-04-10 23:23:11 +02:00
2008-08-06 23:01:46 +02:00
if ( is_wp_error ( $terms ) )
2008-03-26 07:37:19 +01:00
return $terms ;
if ( empty ( $terms ) )
2007-04-10 23:23:11 +02:00
return false ;
2007-06-14 04:25:30 +02:00
2008-03-26 07:37:19 +01:00
foreach ( $terms as $term ) {
2008-08-06 23:01:46 +02:00
$link = get_term_link ( $term , $taxonomy );
2007-09-18 18:32:22 +02:00
if ( is_wp_error ( $link ) )
return $link ;
2008-03-26 07:37:19 +01:00
$term_links [] = '<a href="' . $link . '" rel="tag">' . $term -> name . '</a>' ;
2007-09-18 18:32:22 +02:00
}
2007-04-10 23:23:11 +02:00
2008-03-26 07:37:19 +01:00
$term_links = apply_filters ( " term_links- $taxonomy " , $term_links );
2007-04-10 23:23:11 +02:00
2008-08-06 23:01:46 +02:00
return $before . join ( $sep , $term_links ) . $after ;
2007-08-14 05:44:49 +02:00
}
2008-09-25 16:16:27 +02:00
/**
* Display the terms in a list .
*
* @ since 2.5 . 0
*
* @ param int $id Term ID .
* @ param string $taxonomy Taxonomy name .
* @ param string $before Optional . Before list .
* @ param string $sep Optional . Separate items using this .
* @ param string $after Optional . After list .
* @ return null | bool False on WordPress error . Returns null when displaying .
*/
2008-03-26 07:37:19 +01:00
function the_terms ( $id , $taxonomy , $before = '' , $sep = '' , $after = '' ) {
2008-08-06 23:01:46 +02:00
$return = get_the_term_list ( $id , $taxonomy , $before , $sep , $after );
2007-09-18 18:32:22 +02:00
if ( is_wp_error ( $return ) )
return false ;
else
echo $return ;
2007-04-10 23:23:11 +02:00
}
2008-06-20 15:52:18 +02:00
/**
2008-09-25 16:16:27 +02:00
* Check if the current post has the given tag .
2008-06-20 15:52:18 +02:00
*
2008-09-25 16:16:27 +02:00
* This function is only for use within the WordPress Loop .
*
* @ since 2.6 . 0
2008-06-20 15:52:18 +02:00
*
* @ uses wp_get_object_terms () Gets the tags .
*
2008-09-25 16:16:27 +02:00
* @ param string | int | array $tag Optional . The tag name / id / slug or array of them to check for .
* @ return bool True if the current post has the given tag , or any tag , if no tag specified .
2008-06-20 15:52:18 +02:00
*/
2008-08-06 23:01:46 +02:00
function has_tag ( $tag = '' ) {
2008-06-20 15:52:18 +02:00
global $post ;
$taxonomy = 'post_tag' ;
if ( ! in_the_loop () ) return false ; // in-the-loop function
$post_id = ( int ) $post -> ID ;
2008-08-06 23:01:46 +02:00
$terms = get_object_term_cache ( $post_id , $taxonomy );
if ( empty ( $terms ) )
$terms = wp_get_object_terms ( $post_id , $taxonomy );
if ( empty ( $terms ) ) return false ;
2008-06-20 15:52:18 +02:00
2008-08-06 23:01:46 +02:00
if ( empty ( $tag ) ) return ( ! empty ( $terms ) );
2008-06-20 15:52:18 +02:00
$tag = ( array ) $tag ;
2008-08-06 23:01:46 +02:00
foreach ( $terms as $term ) {
2008-06-20 15:52:18 +02:00
if ( in_array ( $term -> term_id , $tag ) ) return true ;
if ( in_array ( $term -> name , $tag ) ) return true ;
if ( in_array ( $term -> slug , $tag ) ) return true ;
}
return false ;
}
2005-11-01 19:22:30 +01:00
?>