2004-01-27 04:58:01 -05:00
< ? php
2008-09-25 10:16:27 -04:00
/**
* Category Template Tags and API .
*
* @ package WordPress
* @ subpackage Template
*/
2004-01-27 04:58:01 -05:00
2008-09-25 10:16:27 -04:00
/**
* Retrieve category link URL .
*
* @ since 1.0 . 0
2010-10-17 01:41:22 -04:00
* @ see get_term_link ()
2008-09-25 10:16:27 -04:00
*
2011-02-10 16:48:40 -05:00
* @ param int | object $category Category ID or object .
2011-02-10 15:17:54 -05:00
* @ return string Link on success , empty string if category does not exist .
2008-09-25 10:16:27 -04:00
*/
2011-02-10 15:17:54 -05:00
function get_category_link ( $category ) {
2011-02-10 16:48:40 -05:00
if ( ! is_object ( $category ) )
$category = ( int ) $category ;
$category = get_term_link ( $category , 'category' );
if ( is_wp_error ( $category ) )
return '' ;
return $category ;
2006-06-04 17:36:52 -04:00
}
2008-09-25 10:16:27 -04: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 .
2013-06-21 08:45:11 -04:00
* @ return string | WP_Error A list of category parents on success , WP_Error on failure .
2008-09-25 10:16:27 -04:00
*/
function get_category_parents ( $id , $link = false , $separator = '/' , $nicename = false , $visited = array () ) {
2006-06-04 17:36:52 -04:00
$chain = '' ;
2013-10-02 15:59:10 -04:00
$parent = get_term ( $id , 'category' );
2007-09-18 12:32:22 -04:00
if ( is_wp_error ( $parent ) )
return $parent ;
2006-06-04 17:36:52 -04:00
if ( $nicename )
2007-05-23 14:07:53 -04:00
$name = $parent -> slug ;
2006-06-04 17:36:52 -04:00
else
2010-11-12 13:40:51 -05:00
$name = $parent -> name ;
2006-06-04 17:36:52 -04:00
2008-08-06 17:01:46 -04:00
if ( $parent -> parent && ( $parent -> parent != $parent -> term_id ) && ! in_array ( $parent -> parent , $visited ) ) {
2008-07-09 00:57:18 -04:00
$visited [] = $parent -> parent ;
2008-08-06 17:01:46 -04:00
$chain .= get_category_parents ( $parent -> parent , $link , $separator , $nicename , $visited );
2008-07-09 00:57:18 -04:00
}
2006-06-04 17:36:52 -04:00
if ( $link )
2012-04-30 17:36:43 -04:00
$chain .= '<a href="' . esc_url ( get_category_link ( $parent -> term_id ) ) . '" title="' . esc_attr ( sprintf ( __ ( " View all posts in %s " ), $parent -> name ) ) . '">' . $name . '</a>' . $separator ;
2006-06-04 17:36:52 -04:00
else
$chain .= $name . $separator ;
return $chain ;
2006-04-13 00:40:48 -04:00
}
2008-09-25 10:16:27 -04:00
/**
* Retrieve post categories .
*
2010-11-12 16:53:15 -05:00
* @ since 0.71
* @ uses $post
2008-09-25 10:16:27 -04:00
*
* @ param int $id Optional , default to current post ID . The post ID .
* @ return array
*/
2010-11-12 16:53:15 -05:00
function get_the_category ( $id = false ) {
2010-11-12 15:05:37 -05:00
$categories = get_the_terms ( $id , 'category' );
2012-11-06 18:47:14 -05:00
if ( ! $categories || is_wp_error ( $categories ) )
2010-11-15 19:19:51 -05:00
$categories = array ();
2010-12-13 16:21:50 -05:00
2010-12-12 15:32:29 -05:00
$categories = array_values ( $categories );
2004-11-15 01:00:21 -05:00
2010-11-15 19:19:51 -05:00
foreach ( array_keys ( $categories ) as $key ) {
2008-08-06 17:01:46 -04:00
_make_cat_compat ( $categories [ $key ] );
2007-08-18 13:21:51 -04:00
}
2010-12-12 15:32:29 -05:00
2014-03-23 21:35:15 -04:00
/**
* Filter the array of categories to return for a post .
*
* @ since 3.1 . 0
*
* @ param array $categories An array of categories to return for the post .
*/
2010-11-12 15:05:37 -05:00
return apply_filters ( 'get_the_categories' , $categories );
2004-01-27 04:58:01 -05:00
}
2008-09-25 10:16:27 -04: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 17:01:46 -04:00
function _usort_terms_by_name ( $a , $b ) {
return strcmp ( $a -> name , $b -> name );
2007-05-29 00:54:45 -04:00
}
2008-09-25 10:16:27 -04: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 17:01:46 -04:00
function _usort_terms_by_ID ( $a , $b ) {
2007-09-03 19:32:58 -04:00
if ( $a -> term_id > $b -> term_id )
return 1 ;
elseif ( $a -> term_id < $b -> term_id )
return - 1 ;
else
return 0 ;
2007-02-20 21:13:47 -05:00
}
2008-09-25 10:16:27 -04:00
/**
* Retrieve category name based on category ID .
*
* @ since 0.71
*
* @ param int $cat_ID Category ID .
2013-06-21 08:45:11 -04:00
* @ return string | WP_Error Category name on success , WP_Error on failure .
2008-09-25 10:16:27 -04:00
*/
2008-08-06 17:01:46 -04:00
function get_the_category_by_ID ( $cat_ID ) {
2006-06-04 17:36:52 -04:00
$cat_ID = ( int ) $cat_ID ;
2013-10-02 15:59:10 -04:00
$category = get_term ( $cat_ID , 'category' );
2014-03-13 00:04:15 -04:00
2007-09-18 12:32:22 -04:00
if ( is_wp_error ( $category ) )
return $category ;
2014-03-13 00:04:15 -04:00
return ( $category ) ? $category -> name : '' ;
2004-01-27 04:58:01 -05:00
}
2008-09-25 10:16:27 -04: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 17:01:46 -04:00
function get_the_category_list ( $separator = '' , $parents = '' , $post_id = false ) {
2007-01-23 03:21:28 -05:00
global $wp_rewrite ;
2014-03-23 21:35:15 -04:00
if ( ! is_object_in_taxonomy ( get_post_type ( $post_id ), 'category' ) ) {
/** This filter is documented in wp-includes/category-template.php */
2010-05-15 05:59:15 -04:00
return apply_filters ( 'the_category' , '' , $separator , $parents );
2014-03-23 21:35:15 -04:00
}
2010-05-15 05:59:15 -04:00
2012-04-27 15:23:57 -04:00
$categories = get_the_category ( $post_id );
2014-03-23 21:35:15 -04:00
if ( empty ( $categories ) ) {
/** This filter is documented in wp-includes/category-template.php */
2008-08-06 17:01:46 -04:00
return apply_filters ( 'the_category' , __ ( 'Uncategorized' ), $separator , $parents );
2014-03-23 21:35:15 -04:00
}
2005-10-12 13:01:50 -04:00
2008-08-06 17:01:46 -04:00
$rel = ( is_object ( $wp_rewrite ) && $wp_rewrite -> using_permalinks () ) ? 'rel="category tag"' : 'rel="category"' ;
2007-01-23 03:21:28 -05:00
2005-10-12 13:01:50 -04:00
$thelist = '' ;
if ( '' == $separator ) {
$thelist .= '<ul class="post-categories">' ;
foreach ( $categories as $category ) {
$thelist .= " \n \t <li> " ;
2008-08-06 17:01:46 -04:00
switch ( strtolower ( $parents ) ) {
2005-10-12 13:01:50 -04:00
case 'multiple' :
2008-08-06 17:01:46 -04:00
if ( $category -> parent )
2008-10-15 17:02:07 -04:00
$thelist .= get_category_parents ( $category -> parent , true , $separator );
2012-04-30 17:36:43 -04:00
$thelist .= '<a href="' . esc_url ( get_category_link ( $category -> term_id ) ) . '" title="' . esc_attr ( sprintf ( __ ( " View all posts in %s " ), $category -> name ) ) . '" ' . $rel . '>' . $category -> name . '</a></li>' ;
2005-10-12 13:01:50 -04:00
break ;
case 'single' :
2012-04-30 17:36:43 -04:00
$thelist .= '<a href="' . esc_url ( get_category_link ( $category -> term_id ) ) . '" title="' . esc_attr ( sprintf ( __ ( " View all posts in %s " ), $category -> name ) ) . '" ' . $rel . '>' ;
2008-08-06 17:01:46 -04:00
if ( $category -> parent )
2008-10-15 17:02:07 -04:00
$thelist .= get_category_parents ( $category -> parent , false , $separator );
2007-05-23 14:07:53 -04:00
$thelist .= $category -> name . '</a></li>' ;
2005-10-12 13:01:50 -04:00
break ;
case '' :
default :
2012-04-30 17:36:43 -04:00
$thelist .= '<a href="' . esc_url ( get_category_link ( $category -> term_id ) ) . '" title="' . esc_attr ( sprintf ( __ ( " View all posts in %s " ), $category -> name ) ) . '" ' . $rel . '>' . $category -> name . '</a></li>' ;
2005-10-12 13:01:50 -04:00
}
}
$thelist .= '</ul>' ;
} else {
$i = 0 ;
foreach ( $categories as $category ) {
if ( 0 < $i )
2010-04-02 03:30:20 -04:00
$thelist .= $separator ;
2008-08-06 17:01:46 -04:00
switch ( strtolower ( $parents ) ) {
2005-10-12 13:01:50 -04:00
case 'multiple' :
2007-05-23 14:07:53 -04:00
if ( $category -> parent )
2008-10-15 17:02:07 -04:00
$thelist .= get_category_parents ( $category -> parent , true , $separator );
2012-04-30 17:36:43 -04:00
$thelist .= '<a href="' . esc_url ( get_category_link ( $category -> term_id ) ) . '" title="' . esc_attr ( sprintf ( __ ( " View all posts in %s " ), $category -> name ) ) . '" ' . $rel . '>' . $category -> name . '</a>' ;
2005-10-12 13:01:50 -04:00
break ;
case 'single' :
2012-04-30 17:36:43 -04:00
$thelist .= '<a href="' . esc_url ( get_category_link ( $category -> term_id ) ) . '" title="' . esc_attr ( sprintf ( __ ( " View all posts in %s " ), $category -> name ) ) . '" ' . $rel . '>' ;
2007-05-23 14:07:53 -04:00
if ( $category -> parent )
2008-10-15 17:02:07 -04:00
$thelist .= get_category_parents ( $category -> parent , false , $separator );
2010-11-12 13:40:51 -05:00
$thelist .= " $category->name </a> " ;
2005-10-12 13:01:50 -04:00
break ;
case '' :
default :
2012-04-30 17:36:43 -04:00
$thelist .= '<a href="' . esc_url ( get_category_link ( $category -> term_id ) ) . '" title="' . esc_attr ( sprintf ( __ ( " View all posts in %s " ), $category -> name ) ) . '" ' . $rel . '>' . $category -> name . '</a>' ;
2005-10-12 13:01:50 -04:00
}
++ $i ;
}
}
2014-03-23 21:35:15 -04:00
/**
* Filter the category or list of categories .
*
* @ since 1.2 . 0
*
* @ param array $thelist List of categories for the current post .
* @ param string $separator Separator used between the categories .
* @ param string $parents How to display the category parents . Accepts 'multiple' ,
* 'single' , or empty .
*/
2008-08-06 17:01:46 -04:00
return apply_filters ( 'the_category' , $thelist , $separator , $parents );
2005-02-25 10:50:55 -05:00
}
2008-09-25 10:16:27 -04:00
/**
2008-12-09 18:31:11 -05:00
* Check if the current post in within any of the given categories .
*
* The given categories are checked against the post 's categories' term_ids , names and slugs .
* Categories given as integers will only be checked against the post 's categories' term_ids .
2008-03-02 15:17:30 -05:00
*
2008-12-09 18:31:11 -05:00
* Prior to v2 . 5 of WordPress , category names were not supported .
* Prior to v2 . 7 , category slugs were not supported .
* Prior to v2 . 7 , only one category could be compared : in_category ( $single_category ) .
* Prior to v2 . 7 , this function could only be used in the WordPress Loop .
* As of 2.7 , the function can be used anywhere if it is provided a post ID or post object .
2008-03-02 15:17:30 -05:00
*
* @ since 1.2 . 0
2013-08-24 18:54:10 -04:00
* @ uses has_category ()
2008-03-02 15:17:30 -05:00
*
2010-09-07 07:21:11 -04:00
* @ param int | string | array $category Category ID , name or slug , or array of said .
2012-01-06 13:31:43 -05:00
* @ param int | object $post Optional . Post to check instead of the current post . ( since 2.7 . 0 )
2008-12-09 18:31:11 -05:00
* @ return bool True if the current post is in any of the given categories .
*/
2010-10-01 13:44:53 -04:00
function in_category ( $category , $post = null ) {
2013-10-25 22:54:10 -04:00
if ( empty ( $category ) )
return false ;
2013-08-24 18:54:10 -04:00
return has_category ( $category , $post );
2004-01-27 04:58:01 -05:00
}
2008-09-25 10:16:27 -04: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 17:01:46 -04:00
function the_category ( $separator = '' , $parents = '' , $post_id = false ) {
echo get_the_category_list ( $separator , $parents , $post_id );
2004-01-27 04:58:01 -05:00
}
2008-09-25 10:16:27 -04: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 17:01:46 -04:00
function category_description ( $category = 0 ) {
2009-04-09 12:00:40 -04:00
return term_description ( $category , 'category' );
2004-01-27 04:58:01 -05:00
}
2008-09-25 10:16:27 -04: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_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 .
2010-03-02 13:36:49 -05:00
* 'name' ( string ) - The name attribute value for select element .
* 'id' ( string ) - The ID attribute value for select element . Defaults to name if omitted .
* 'class' ( string ) - The class attribute value for select element .
2008-09-25 10:16:27 -04:00
* 'selected' ( int ) - Which category ID is selected .
2010-03-18 16:17:15 -04:00
* 'taxonomy' ( string ) - The name of the taxonomy to retrieve . Defaults to category .
2008-09-25 10:16:27 -04:00
*
* 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 17:01:46 -04:00
function wp_dropdown_categories ( $args = '' ) {
2007-05-10 23:10:05 -04:00
$defaults = array (
2007-09-03 19:32:58 -04:00
'show_option_all' => '' , 'show_option_none' => '' ,
2009-05-22 08:29:32 -04:00
'orderby' => 'id' , 'order' => 'ASC' ,
2012-02-15 11:46:01 -05:00
'show_count' => 0 ,
2007-09-03 19:32:58 -04:00
'hide_empty' => 1 , 'child_of' => 0 ,
'exclude' => '' , 'echo' => 1 ,
'selected' => 0 , 'hierarchical' => 0 ,
2010-03-02 13:36:49 -05:00
'name' => 'cat' , 'id' => '' ,
'class' => 'postform' , 'depth' => 0 ,
'tab_index' => 0 , 'taxonomy' => 'category' ,
'hide_if_empty' => false
2007-05-10 23:10:05 -04:00
);
2007-06-13 22:25:30 -04:00
2008-08-06 17:01:46 -04:00
$defaults [ 'selected' ] = ( is_category () ) ? get_query_var ( 'cat' ) : 0 ;
2007-06-13 22:25:30 -04:00
2010-03-18 16:17:15 -04:00
// Back compat.
if ( isset ( $args [ 'type' ] ) && 'link' == $args [ 'type' ] ) {
_deprecated_argument ( __FUNCTION__ , '3.0' , '' );
$args [ 'taxonomy' ] = 'link_category' ;
}
2007-05-10 23:10:05 -04:00
$r = wp_parse_args ( $args , $defaults );
2009-09-28 18:32:27 -04:00
if ( ! isset ( $r [ 'pad_counts' ] ) && $r [ 'show_count' ] && $r [ 'hierarchical' ] ) {
$r [ 'pad_counts' ] = true ;
}
2007-05-10 23:10:05 -04:00
extract ( $r );
2006-03-01 23:51:24 -05:00
2008-03-22 05:14:49 -04:00
$tab_index_attribute = '' ;
if ( ( int ) $tab_index > 0 )
$tab_index_attribute = " tabindex= \" $tab_index\ " " ;
2010-01-22 14:30:05 -05:00
$categories = get_terms ( $taxonomy , $r );
2010-03-02 13:36:49 -05:00
$name = esc_attr ( $name );
$class = esc_attr ( $class );
$id = $id ? esc_attr ( $id ) : $name ;
2006-03-01 23:51:24 -05:00
2010-01-11 14:27:44 -05:00
if ( ! $r [ 'hide_if_empty' ] || ! empty ( $categories ) )
2010-03-02 13:36:49 -05:00
$output = " <select name=' $name ' id=' $id ' class=' $class ' $tab_index_attribute > \n " ;
2010-01-11 14:27:44 -05:00
else
$output = '' ;
2010-02-20 19:03:42 -05:00
2010-02-13 00:40:47 -05:00
if ( empty ( $categories ) && ! $r [ 'hide_if_empty' ] && ! empty ( $show_option_none ) ) {
2014-03-23 21:35:15 -04:00
/**
* Filter a taxonomy drop - down display element .
*
* A variety of taxonomy drop - down display elements can be modified
* just prior to display via this filter . Filterable arguments include
* 'show_option_none' , 'show_option_all' , and various forms of the
* term name .
*
* @ since 1.2 . 0
*
* @ see wp_dropdown_categories ()
*
* @ param string $element Taxonomy element to list .
*/
2010-02-13 00:40:47 -05:00
$show_option_none = apply_filters ( 'list_cats' , $show_option_none );
$output .= " \t <option value='-1' selected='selected'> $show_option_none </option> \n " ;
}
2010-02-20 19:03:42 -05:00
2010-01-11 14:27:44 -05:00
if ( ! empty ( $categories ) ) {
2006-03-01 23:51:24 -05:00
if ( $show_option_all ) {
2014-03-23 21:35:15 -04:00
/** This filter is documented in wp-includes/category-template.php */
2008-08-06 17:01:46 -04:00
$show_option_all = apply_filters ( 'list_cats' , $show_option_all );
2008-12-23 07:51:12 -05:00
$selected = ( '0' === strval ( $r [ 'selected' ]) ) ? " selected='selected' " : '' ;
$output .= " \t <option value='0' $selected > $show_option_all </option> \n " ;
2006-03-01 23:51:24 -05:00
}
2008-08-06 17:01:46 -04:00
if ( $show_option_none ) {
2014-03-23 21:35:15 -04:00
/** This filter is documented in wp-includes/category-template.php */
2008-08-06 17:01:46 -04:00
$show_option_none = apply_filters ( 'list_cats' , $show_option_none );
2008-12-23 07:51:12 -05:00
$selected = ( '-1' === strval ( $r [ 'selected' ]) ) ? " selected='selected' " : '' ;
$output .= " \t <option value='-1' $selected > $show_option_none </option> \n " ;
2005-10-12 13:01:50 -04:00
}
2006-03-01 23:51:24 -05:00
if ( $hierarchical )
2008-01-30 19:58:54 -05:00
$depth = $r [ 'depth' ]; // Walk the full depth.
2006-03-01 23:51:24 -05:00
else
$depth = - 1 ; // Flat.
2008-08-06 17:01:46 -04:00
$output .= walk_category_dropdown_tree ( $categories , $depth , $r );
2005-10-12 13:01:50 -04:00
}
2012-01-05 15:10:39 -05:00
2010-01-11 14:27:44 -05:00
if ( ! $r [ 'hide_if_empty' ] || ! empty ( $categories ) )
$output .= " </select> \n " ;
2014-02-02 00:33:13 -05:00
/**
2014-03-23 21:35:15 -04:00
* Filter the taxonomy drop - down output .
2014-02-02 00:33:13 -05:00
*
* @ since 2.1 . 0
*
2014-03-23 21:35:15 -04:00
* @ param string $output HTML output .
* @ param array $r Arguments used to build the drop - down .
2014-02-02 00:33:13 -05:00
*/
$output = apply_filters ( 'wp_dropdown_cats' , $output , $r );
2006-03-01 23:51:24 -05:00
if ( $echo )
echo $output ;
return $output ;
}
2008-09-25 10:16:27 -04: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_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 ()} .
2008-12-30 17:30:36 -05:00
* 'exclude_tree' ( string ) - See { @ link get_categories ()} .
2008-09-25 10:16:27 -04:00
* '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 17:01:46 -04:00
function wp_list_categories ( $args = '' ) {
2007-05-10 23:10:05 -04:00
$defaults = array (
2010-03-27 22:07:31 -04:00
'show_option_all' => '' , 'show_option_none' => __ ( 'No categories' ),
'orderby' => 'name' , 'order' => 'ASC' ,
2012-02-15 11:46:01 -05:00
'style' => 'list' ,
2010-03-27 22:07:31 -04:00
'show_count' => 0 , 'hide_empty' => 1 ,
'use_desc_for_title' => 1 , 'child_of' => 0 ,
'feed' => '' , 'feed_type' => '' ,
'feed_image' => '' , 'exclude' => '' ,
'exclude_tree' => '' , 'current_category' => 0 ,
2008-08-06 17:01:46 -04:00
'hierarchical' => true , 'title_li' => __ ( 'Categories' ),
2010-03-27 22:07:31 -04:00
'echo' => 1 , 'depth' => 0 ,
'taxonomy' => 'category'
2007-05-10 23:10:05 -04:00
);
2007-06-13 22:25:30 -04:00
2007-05-10 23:10:05 -04:00
$r = wp_parse_args ( $args , $defaults );
2007-06-13 22:25:30 -04:00
2010-03-27 22:07:31 -04:00
if ( ! isset ( $r [ 'pad_counts' ] ) && $r [ 'show_count' ] && $r [ 'hierarchical' ] )
2007-01-09 03:45:05 -05:00
$r [ 'pad_counts' ] = true ;
2007-06-13 22:25:30 -04:00
2008-12-30 17:30:36 -05:00
if ( true == $r [ 'hierarchical' ] ) {
$r [ 'exclude_tree' ] = $r [ 'exclude' ];
$r [ 'exclude' ] = '' ;
}
2010-05-03 16:26:11 -04:00
2010-03-27 22:07:31 -04:00
if ( ! isset ( $r [ 'class' ] ) )
$r [ 'class' ] = ( 'category' == $r [ 'taxonomy' ] ) ? 'categories' : $r [ ' taxonomy ' ];
2008-12-30 17:30:36 -05:00
2007-05-10 23:10:05 -04:00
extract ( $r );
2007-06-13 22:25:30 -04:00
2010-06-11 11:53:41 -04:00
if ( ! taxonomy_exists ( $taxonomy ) )
2010-03-27 22:07:31 -04:00
return false ;
2008-08-06 17:01:46 -04:00
$categories = get_categories ( $r );
2006-11-19 02:56:05 -05:00
2006-03-01 08:30:19 -05:00
$output = '' ;
2006-06-16 20:05:00 -04:00
if ( $title_li && 'list' == $style )
2010-11-13 06:06:26 -05:00
$output = '<li class="' . esc_attr ( $class ) . '">' . $title_li . '<ul>' ;
2006-03-01 08:30:19 -05:00
2008-08-06 17:01:46 -04:00
if ( empty ( $categories ) ) {
2010-03-27 22:07:31 -04:00
if ( ! empty ( $show_option_none ) ) {
if ( 'list' == $style )
2013-12-03 15:51:19 -05:00
$output .= '<li class="cat-item-none">' . $show_option_none . '</li>' ;
2010-03-27 22:07:31 -04:00
else
$output .= $show_option_none ;
}
2006-03-01 08:30:19 -05:00
} else {
2011-11-14 12:24:14 -05:00
if ( ! empty ( $show_option_all ) ) {
$posts_page = ( 'page' == get_option ( 'show_on_front' ) && get_option ( 'page_for_posts' ) ) ? get_permalink ( get_option ( 'page_for_posts' ) ) : home_url ( '/' );
$posts_page = esc_url ( $posts_page );
2008-08-06 17:01:46 -04:00
if ( 'list' == $style )
2013-12-03 15:51:19 -05:00
$output .= " <li class='cat-item-all'><a href=' $posts_page '> $show_option_all </a></li> " ;
2007-04-13 19:20:14 -04:00
else
2011-11-14 12:24:14 -05:00
$output .= " <a href=' $posts_page '> $show_option_all </a> " ;
}
2007-06-13 22:25:30 -04:00
2010-11-08 20:20:38 -05:00
if ( empty ( $r [ 'current_category' ] ) && ( is_category () || is_tax () || is_tag () ) ) {
$current_term_object = get_queried_object ();
2013-09-09 22:28:11 -04:00
if ( $current_term_object && $r [ 'taxonomy' ] === $current_term_object -> taxonomy )
2010-11-08 20:20:38 -05:00
$r [ 'current_category' ] = get_queried_object_id ();
}
2006-12-01 13:55:27 -05:00
2006-03-01 08:30:19 -05:00
if ( $hierarchical )
2008-01-10 16:51:00 -05:00
$depth = $r [ 'depth' ];
2006-03-01 08:30:19 -05:00
else
$depth = - 1 ; // Flat.
2008-08-06 17:01:46 -04:00
$output .= walk_category_tree ( $categories , $depth , $r );
2004-04-30 14:28:50 -04:00
}
2006-06-16 20:05:00 -04:00
if ( $title_li && 'list' == $style )
2006-03-01 08:30:19 -05:00
$output .= '</ul></li>' ;
2006-11-19 02:56:05 -05:00
2014-03-23 21:35:15 -04:00
/**
* Filter the HTML output of a taxonomy list .
*
* @ since 2.1 . 0
*
* @ param string $output HTML output .
* @ param array $args An array of taxonomy - listing arguments .
*/
2010-06-02 10:02:54 -04:00
$output = apply_filters ( 'wp_list_categories' , $output , $args );
2007-09-11 22:53:27 -04:00
if ( $echo )
echo $output ;
else
return $output ;
2006-03-01 08:30:19 -05:00
}
2005-08-30 19:25:34 -04:00
2008-09-25 10:16:27 -04: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 .
*
2014-03-03 12:29:15 -05:00
* The 'topic_count_text' argument is a nooped plural from _n_noop () to generate the
* text for the tooltip of the tag link .
*
* 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 .
2008-09-25 10:16:27 -04:00
*
2014-03-25 14:40:15 -04:00
* The 'post_type' argument is used only when 'link' is set to 'edit' . It determines the post_type
* passed to edit . php for the popular tags edit links .
*
2008-09-25 10:16:27 -04: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 15:52:15 -04:00
function wp_tag_cloud ( $args = '' ) {
$defaults = array (
2007-09-03 19:32:58 -04:00
'smallest' => 8 , 'largest' => 22 , 'unit' => 'pt' , 'number' => 45 ,
2009-10-08 17:51:34 -04:00
'format' => 'flat' , 'separator' => " \n " , 'orderby' => 'name' , 'order' => 'ASC' ,
2014-03-25 14:40:15 -04:00
'exclude' => '' , 'include' => '' , 'link' => 'view' , 'taxonomy' => 'post_tag' , 'post_type' => '' , 'echo' => true
2007-04-10 15:52:15 -04:00
);
$args = wp_parse_args ( $args , $defaults );
2009-02-11 18:41:29 -05:00
$tags = get_terms ( $args [ 'taxonomy' ], array_merge ( $args , array ( 'orderby' => 'count' , 'order' => 'DESC' ) ) ); // Always query top tags
2007-04-10 15:52:15 -04:00
2011-06-22 15:37:05 -04:00
if ( empty ( $tags ) || is_wp_error ( $tags ) )
2007-04-10 15:52:15 -04:00
return ;
2008-08-19 12:36:18 -04:00
foreach ( $tags as $key => $tag ) {
2008-10-25 14:19:42 -04:00
if ( 'edit' == $args [ 'link' ] )
2014-03-25 14:40:15 -04:00
$link = get_edit_term_link ( $tag -> term_id , $tag -> taxonomy , $args [ 'post_type' ] );
2008-10-25 14:19:42 -04:00
else
2010-11-04 06:45:14 -04:00
$link = get_term_link ( intval ( $tag -> term_id ), $tag -> taxonomy );
2008-08-19 12:36:18 -04:00
if ( is_wp_error ( $link ) )
return false ;
2008-01-14 17:35:43 -05:00
2008-08-19 12:36:18 -04: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-18 19:40:41 -04:00
2014-03-23 21:35:15 -04:00
/**
* Filter the tag cloud output .
*
* @ since 2.3 . 0
*
* @ param string $return HTML output of the tag cloud .
* @ param array $args An array of tag cloud arguments .
*/
2008-01-14 17:35:43 -05:00
$return = apply_filters ( 'wp_tag_cloud' , $return , $args );
2009-04-16 13:32:06 -04:00
if ( 'array' == $args [ 'format' ] || empty ( $args [ 'echo' ]) )
2008-01-14 17:35:43 -05:00
return $return ;
echo $return ;
2007-04-10 15:52:15 -04:00
}
2009-09-01 16:06:11 -04:00
/**
* Default topic count scaling for tag links
*
* @ param integer $count number of posts with that tag
* @ return integer scaled count
*/
function default_topic_count_scale ( $count ) {
return round ( log10 ( $count + 1 ) * 100 );
}
2008-08-04 17:01:09 -04:00
/**
2008-09-25 10:16:27 -04:00
* Generates a tag cloud ( heatmap ) from provided data .
2008-08-04 17:01:09 -04:00
*
2008-09-25 10:16:27 -04: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 17:01:46 -04:00
*
2009-07-25 21:23:46 -04:00
* The 'tag_cloud_sort' filter allows you to override the sorting .
* Passed to the filter : $tags array and $args array , has to return the $tags array
* after sorting it .
2009-05-24 19:47:49 -04:00
*
2008-09-25 10:16:27 -04: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 17:01:09 -04:00
*
2008-09-25 10:16:27 -04:00
* The 'number' argument is how many tags to return . By default , the limit will
* be to return the entire tag cloud list .
*
2014-03-03 12:29:15 -05:00
* The 'topic_count_text' argument is a nooped plural from _n_noop () to generate the
* text for the tooltip of the tag link .
*
2008-11-21 13:12:57 -05:00
* The 'topic_count_text_callback' argument is a function , which given the count
2014-03-03 12:29:15 -05:00
* of the posts with that tag returns a text for the tooltip of the tag link .
2008-09-25 10:16:27 -04:00
*
* @ todo Complete functionality .
* @ since 2.3 . 0
*
* @ param array $tags List of tags .
* @ param string | array $args Optional , override default arguments .
2014-03-25 08:56:14 -04:00
* @ return string | array Tag cloud as a string or an array , depending on 'format' argument .
2008-09-25 10:16:27 -04:00
*/
2007-04-10 15:52:15 -04:00
function wp_generate_tag_cloud ( $tags , $args = '' ) {
$defaults = array (
2008-08-19 12:36:18 -04:00
'smallest' => 8 , 'largest' => 22 , 'unit' => 'pt' , 'number' => 0 ,
2009-10-08 17:51:34 -04:00
'format' => 'flat' , 'separator' => " \n " , 'orderby' => 'name' , 'order' => 'ASC' ,
2014-03-03 12:29:15 -05:00
'topic_count_text' => null , 'topic_count_text_callback' => null ,
2009-10-08 17:51:34 -04:00
'topic_count_scale_callback' => 'default_topic_count_scale' , 'filter' => 1 ,
2007-04-10 15:52:15 -04:00
);
2008-12-09 13:03:31 -05:00
2007-04-10 15:52:15 -04:00
$args = wp_parse_args ( $args , $defaults );
2014-03-03 12:29:15 -05:00
extract ( $args , EXTR_SKIP );
2007-04-10 15:52:15 -04:00
2014-03-25 08:56:14 -04:00
$return = ( 'array' === $format ) ? array () : '' ;
if ( empty ( $tags ) ) {
return $return ;
}
2007-04-10 15:52:15 -04:00
2014-03-03 12:29:15 -05:00
// Juggle topic count tooltips:
if ( isset ( $args [ 'topic_count_text' ] ) ) {
// First look for nooped plural support via topic_count_text.
$translate_nooped_plural = $args [ 'topic_count_text' ];
} elseif ( ! empty ( $args [ 'topic_count_text_callback' ] ) ) {
// Look for the alternative callback style. Ignore the previous default.
if ( $args [ 'topic_count_text_callback' ] === 'default_topic_count_text' ) {
$translate_nooped_plural = _n_noop ( '%s topic' , '%s topics' );
} else {
$translate_nooped_plural = false ;
}
} elseif ( isset ( $args [ 'single_text' ] ) && isset ( $args [ 'multiple_text' ] ) ) {
// If no callback exists, look for the old-style single_text and multiple_text arguments.
$translate_nooped_plural = _n_noop ( $args [ 'single_text' ], $args [ 'multiple_text' ] );
} else {
// This is the default for when no callback, plural, or argument is passed in.
$translate_nooped_plural = _n_noop ( '%s topic' , '%s topics' );
}
2014-03-23 21:35:15 -04:00
/**
* Filter how the items in a tag cloud are sorted .
*
* @ since 2.8 . 0
*
* @ param array $tags Ordered array of terms .
* @ param array $args An array of tag cloud arguments .
*/
2009-07-25 21:23:46 -04:00
$tags_sorted = apply_filters ( 'tag_cloud_sort' , $tags , $args );
2014-03-25 09:00:15 -04:00
if ( empty ( $tags_sorted ) ) {
return $return ;
}
if ( $tags_sorted !== $tags ) {
2009-07-25 21:23:46 -04:00
$tags = $tags_sorted ;
2014-03-25 09:00:15 -04:00
unset ( $tags_sorted );
2009-07-25 21:23:46 -04:00
} else {
2014-03-25 09:00:15 -04:00
if ( 'RAND' === $order ) {
shuffle ( $tags );
2009-07-25 21:23:46 -04:00
} else {
// SQL cannot save you; this is a second (potentially different) sort on a subset of data.
2014-03-25 09:00:15 -04:00
if ( 'name' === $orderby ) {
2011-09-29 13:20:34 -04:00
uasort ( $tags , '_wp_object_name_sort_cb' );
2014-03-25 09:00:15 -04:00
} else {
2011-09-29 13:20:34 -04:00
uasort ( $tags , '_wp_object_count_sort_cb' );
2014-03-25 09:00:15 -04:00
}
2009-02-23 04:12:59 -05:00
2014-03-25 09:00:15 -04:00
if ( 'DESC' === $order ) {
2009-07-25 21:23:46 -04:00
$tags = array_reverse ( $tags , true );
2014-03-25 09:00:15 -04:00
}
2009-07-25 21:23:46 -04:00
}
2008-02-13 14:12:46 -05:00
}
2007-04-10 15:52:15 -04:00
2008-08-19 12:36:18 -04:00
if ( $number > 0 )
$tags = array_slice ( $tags , 0 , $number );
$counts = array ();
2009-09-01 16:06:11 -04:00
$real_counts = array (); // For the alt tag
foreach ( ( array ) $tags as $key => $tag ) {
$real_counts [ $key ] = $tag -> count ;
$counts [ $key ] = $topic_count_scale_callback ( $tag -> count );
}
2008-08-19 12:36:18 -04:00
$min_count = min ( $counts );
$spread = max ( $counts ) - $min_count ;
if ( $spread <= 0 )
$spread = 1 ;
$font_spread = $largest - $smallest ;
2008-11-28 16:06:57 -05:00
if ( $font_spread < 0 )
2008-08-19 12:36:18 -04:00
$font_spread = 1 ;
$font_step = $font_spread / $spread ;
2007-04-10 15:52:15 -04:00
$a = array ();
2008-08-19 12:36:18 -04:00
foreach ( $tags as $key => $tag ) {
$count = $counts [ $key ];
2009-09-01 16:06:11 -04:00
$real_count = $real_counts [ $key ];
2009-05-18 12:00:33 -04:00
$tag_link = '#' != $tag -> link ? esc_url ( $tag -> link ) : '#' ;
2008-08-19 12:36:18 -04:00
$tag_id = isset ( $tags [ $key ] -> id ) ? $tags [ $key ] -> id : $key ;
$tag_name = $tags [ $key ] -> name ;
2014-03-03 12:29:15 -05:00
if ( $translate_nooped_plural ) {
$title_attribute = sprintf ( translate_nooped_plural ( $translate_nooped_plural , $real_count ), number_format_i18n ( $real_count ) );
} else {
$title_attribute = call_user_func ( $topic_count_text_callback , $real_count , $tag , $args );
}
$a [] = " <a href=' $tag_link ' class='tag-link- $tag_id ' title=' " . esc_attr ( $title_attribute ) . " ' style='font-size: " .
2012-05-01 18:09:55 -04:00
str_replace ( ',' , '.' , ( $smallest + ( ( $count - $min_count ) * $font_step ) ) )
2008-08-19 12:36:18 -04:00
. " $unit ;'> $tag_name </a> " ;
2007-04-10 15:52:15 -04:00
}
switch ( $format ) :
case 'array' :
$return =& $a ;
break ;
case 'list' :
$return = " <ul class='wp-tag-cloud'> \n \t <li> " ;
2008-08-06 17:01:46 -04:00
$return .= join ( " </li> \n \t <li> " , $a );
2007-04-10 15:52:15 -04:00
$return .= " </li> \n </ul> \n " ;
break ;
default :
2009-10-08 17:51:34 -04:00
$return = join ( $separator , $a );
2007-04-10 15:52:15 -04:00
break ;
endswitch ;
2014-03-23 21:35:15 -04:00
if ( $filter ) {
/**
* Filter the generated output of a tag cloud .
*
* The filter is only evaluated if a true value is passed
* to the $filter argument in wp_generate_tag_cloud () .
*
* @ since 2.3 . 0
*
* @ see wp_generate_tag_cloud ()
*
2014-03-25 08:56:14 -04:00
* @ param array | string $return String containing the generated HTML tag cloud output
* or an array of tag links if the 'format' argument
* equals 'array' .
* @ param array $tags An array of terms used in the tag cloud .
* @ param array $args An array of wp_generate_tag_cloud () arguments .
2014-03-23 21:35:15 -04:00
*/
2009-05-02 14:43:04 -04:00
return apply_filters ( 'wp_generate_tag_cloud' , $return , $tags , $args );
2014-03-23 21:35:15 -04:00
}
2010-06-29 20:05:18 -04:00
else
2009-05-02 14:43:04 -04:00
return $return ;
2007-04-10 15:52:15 -04:00
}
2010-11-11 17:50:36 -05:00
/**
2011-09-29 13:20:34 -04:00
* Callback for comparing objects based on name
2010-11-11 17:50:36 -05:00
*
* @ since 3.1 . 0
* @ access private
*/
2011-09-29 13:20:34 -04:00
function _wp_object_name_sort_cb ( $a , $b ) {
2010-11-11 17:50:36 -05:00
return strnatcasecmp ( $a -> name , $b -> name );
}
/**
2011-09-29 13:20:34 -04:00
* Callback for comparing objects based on count
2010-11-11 17:50:36 -05:00
*
* @ since 3.1 . 0
* @ access private
*/
2011-09-29 13:20:34 -04:00
function _wp_object_count_sort_cb ( $a , $b ) {
2010-11-11 17:50:36 -05:00
return ( $a -> count > $b -> count );
}
2006-06-04 17:36:52 -04:00
//
// Helper functions
//
2006-03-01 08:30:19 -05:00
2008-09-25 10:16:27 -04: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 17:36:52 -04:00
function walk_category_tree () {
$args = func_get_args ();
2008-12-23 07:52:37 -05:00
// the user's options are the third parameter
if ( empty ( $args [ 2 ][ 'walker' ]) || ! is_a ( $args [ 2 ][ 'walker' ], 'Walker' ) )
$walker = new Walker_Category ;
else
$walker = $args [ 2 ][ 'walker' ];
2008-08-06 17:01:46 -04:00
return call_user_func_array ( array ( & $walker , 'walk' ), $args );
2006-03-01 08:30:19 -05:00
}
2008-09-25 10:16:27 -04: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 17:36:52 -04:00
function walk_category_dropdown_tree () {
$args = func_get_args ();
2008-12-23 07:52:37 -05:00
// the user's options are the third parameter
if ( empty ( $args [ 2 ][ 'walker' ]) || ! is_a ( $args [ 2 ][ 'walker' ], 'Walker' ) )
$walker = new Walker_CategoryDropdown ;
else
$walker = $args [ 2 ][ 'walker' ];
2008-08-06 17:01:46 -04:00
return call_user_func_array ( array ( & $walker , 'walk' ), $args );
2006-02-26 23:57:30 -05:00
}
2010-10-30 10:06:08 -04:00
/**
* Create HTML list of categories .
*
* @ package WordPress
* @ since 2.1 . 0
* @ uses Walker
*/
class Walker_Category extends Walker {
/**
2013-09-28 14:02:10 -04:00
* What the class handles .
*
2010-10-30 10:06:08 -04:00
* @ see Walker :: $tree_type
* @ since 2.1 . 0
* @ var string
*/
var $tree_type = 'category' ;
/**
2013-09-28 14:02:10 -04:00
* Database fields to use .
*
2010-10-30 10:06:08 -04:00
* @ see Walker :: $db_fields
* @ since 2.1 . 0
* @ todo Decouple this
* @ var array
*/
var $db_fields = array ( 'parent' => 'parent' , 'id' => 'term_id' );
/**
2013-09-28 14:02:10 -04:00
* Starts the list before the elements are added .
*
2010-10-30 10:06:08 -04:00
* @ see Walker :: start_lvl ()
2013-09-28 14:02:10 -04:00
*
2010-10-30 10:06:08 -04:00
* @ since 2.1 . 0
*
* @ param string $output Passed by reference . Used to append additional content .
2013-09-28 14:02:10 -04:00
* @ param int $depth Depth of category . Used for tab indentation .
* @ param array $args An array of arguments . Will only append content if style argument value is 'list' .
* @ see wp_list_categories ()
2010-10-30 10:06:08 -04:00
*/
2012-01-04 18:03:46 -05:00
function start_lvl ( & $output , $depth = 0 , $args = array () ) {
2010-10-30 10:06:08 -04:00
if ( 'list' != $args [ 'style' ] )
return ;
$indent = str_repeat ( " \t " , $depth );
$output .= " $indent <ul class='children'> \n " ;
}
/**
2013-09-28 14:02:10 -04:00
* Ends the list of after the elements are added .
*
2010-10-30 10:06:08 -04:00
* @ see Walker :: end_lvl ()
2013-09-28 14:02:10 -04:00
*
2010-10-30 10:06:08 -04:00
* @ since 2.1 . 0
*
* @ param string $output Passed by reference . Used to append additional content .
2013-09-28 14:02:10 -04:00
* @ param int $depth Depth of category . Used for tab indentation .
* @ param array $args An array of arguments . Will only append content if style argument value is 'list' .
* @ wsee wp_list_categories ()
2010-10-30 10:06:08 -04:00
*/
2012-01-04 18:03:46 -05:00
function end_lvl ( & $output , $depth = 0 , $args = array () ) {
2010-10-30 10:06:08 -04:00
if ( 'list' != $args [ 'style' ] )
return ;
$indent = str_repeat ( " \t " , $depth );
$output .= " $indent </ul> \n " ;
}
/**
2013-09-28 14:02:10 -04:00
* Start the element output .
*
2010-10-30 10:06:08 -04:00
* @ see Walker :: start_el ()
2013-09-28 14:02:10 -04:00
*
2010-10-30 10:06:08 -04:00
* @ since 2.1 . 0
*
2013-09-28 14:02:10 -04:00
* @ param string $output Passed by reference . Used to append additional content .
2010-10-30 10:06:08 -04:00
* @ param object $category Category data object .
2013-09-28 14:02:10 -04:00
* @ param int $depth Depth of category in reference to parents . Default 0.
* @ param array $args An array of arguments . @ see wp_list_categories ()
* @ param int $id ID of the current category .
2010-10-30 10:06:08 -04:00
*/
2012-01-04 18:03:46 -05:00
function start_el ( & $output , $category , $depth = 0 , $args = array (), $id = 0 ) {
2010-10-30 10:06:08 -04:00
extract ( $args );
$cat_name = esc_attr ( $category -> name );
2014-03-23 21:35:15 -04:00
/** This filter is documented in wp-includes/category-template.php */
2010-10-30 10:06:08 -04:00
$cat_name = apply_filters ( 'list_cats' , $cat_name , $category );
2014-03-23 21:35:15 -04:00
2012-04-30 17:36:43 -04:00
$link = '<a href="' . esc_url ( get_term_link ( $category ) ) . '" ' ;
2014-03-23 21:35:15 -04:00
if ( $use_desc_for_title == 0 || empty ( $category -> description ) ) {
2010-12-21 12:17:58 -05:00
$link .= 'title="' . esc_attr ( sprintf ( __ ( 'View all posts filed under %s' ), $cat_name ) ) . '"' ;
2014-03-23 21:35:15 -04:00
} else {
/**
* Filter the category description for display .
*
* @ since 1.2 . 0
*
* @ param string $description Category description .
* @ param object $category Category object .
*/
2010-10-30 10:06:08 -04:00
$link .= 'title="' . esc_attr ( strip_tags ( apply_filters ( 'category_description' , $category -> description , $category ) ) ) . '"' ;
2014-03-23 21:35:15 -04:00
}
2010-10-30 10:06:08 -04:00
$link .= '>' ;
$link .= $cat_name . '</a>' ;
if ( ! empty ( $feed_image ) || ! empty ( $feed ) ) {
$link .= ' ' ;
if ( empty ( $feed_image ) )
$link .= '(' ;
2012-04-30 17:36:43 -04:00
$link .= '<a href="' . esc_url ( get_term_feed_link ( $category -> term_id , $category -> taxonomy , $feed_type ) ) . '"' ;
2010-10-30 10:06:08 -04:00
if ( empty ( $feed ) ) {
$alt = ' alt="' . sprintf ( __ ( 'Feed for all posts filed under %s' ), $cat_name ) . '"' ;
} else {
$title = ' title="' . $feed . '"' ;
$alt = ' alt="' . $feed . '"' ;
$name = $feed ;
$link .= $title ;
}
$link .= '>' ;
if ( empty ( $feed_image ) )
$link .= $name ;
else
$link .= " <img src=' $feed_image ' $alt $title " . ' />' ;
$link .= '</a>' ;
if ( empty ( $feed_image ) )
$link .= ')' ;
}
if ( ! empty ( $show_count ) )
2014-02-28 16:48:13 -05:00
$link .= ' (' . number_format_i18n ( $category -> count ) . ')' ;
2010-10-30 10:06:08 -04:00
if ( 'list' == $args [ 'style' ] ) {
$output .= " \t <li " ;
$class = 'cat-item cat-item-' . $category -> term_id ;
if ( ! empty ( $current_category ) ) {
$_current_category = get_term ( $current_category , $category -> taxonomy );
if ( $category -> term_id == $current_category )
$class .= ' current-cat' ;
elseif ( $category -> term_id == $_current_category -> parent )
$class .= ' current-cat-parent' ;
}
$output .= ' class="' . $class . '"' ;
$output .= " > $link\n " ;
} else {
$output .= " \t $link <br /> \n " ;
}
}
/**
2013-09-28 14:02:10 -04:00
* Ends the element output , if needed .
*
2010-10-30 10:06:08 -04:00
* @ see Walker :: end_el ()
2013-09-28 14:02:10 -04:00
*
2010-10-30 10:06:08 -04:00
* @ since 2.1 . 0
*
* @ param string $output Passed by reference . Used to append additional content .
2013-09-28 14:02:10 -04:00
* @ param object $page Not used .
* @ param int $depth Depth of category . Not used .
* @ param array $args An array of arguments . Only uses 'list' for whether should append to output . @ see wp_list_categories ()
2010-10-30 10:06:08 -04:00
*/
2012-01-04 18:03:46 -05:00
function end_el ( & $output , $page , $depth = 0 , $args = array () ) {
2010-10-30 10:06:08 -04:00
if ( 'list' != $args [ 'style' ] )
return ;
$output .= " </li> \n " ;
}
}
/**
* Create HTML dropdown list of Categories .
*
* @ package WordPress
* @ since 2.1 . 0
* @ uses Walker
*/
class Walker_CategoryDropdown extends Walker {
/**
* @ see Walker :: $tree_type
* @ since 2.1 . 0
* @ var string
*/
var $tree_type = 'category' ;
/**
* @ see Walker :: $db_fields
* @ since 2.1 . 0
* @ todo Decouple this
* @ var array
*/
var $db_fields = array ( 'parent' => 'parent' , 'id' => 'term_id' );
/**
2013-09-28 14:02:10 -04:00
* Start the element output .
*
2010-10-30 10:06:08 -04:00
* @ see Walker :: start_el ()
* @ since 2.1 . 0
*
2013-09-28 14:02:10 -04:00
* @ param string $output Passed by reference . Used to append additional content .
2010-10-30 10:06:08 -04:00
* @ param object $category Category data object .
2013-09-28 14:02:10 -04:00
* @ param int $depth Depth of category . Used for padding .
* @ param array $args Uses 'selected' and 'show_count' keys , if they exist . @ see wp_dropdown_categories ()
2010-10-30 10:06:08 -04:00
*/
2013-05-27 23:29:15 -04:00
function start_el ( & $output , $category , $depth = 0 , $args = array (), $id = 0 ) {
2010-10-30 10:06:08 -04:00
$pad = str_repeat ( ' ' , $depth * 3 );
2014-03-23 21:35:15 -04:00
/** This filter is documented in wp-includes/category-template.php */
$cat_name = apply_filters ( 'list_cats' , $category -> name , $category );
2010-10-30 10:06:08 -04:00
$output .= " \t <option class= \" level- $depth\ " value = \ " " . $category -> term_id . " \" " ;
if ( $category -> term_id == $args [ 'selected' ] )
$output .= ' selected="selected"' ;
$output .= '>' ;
$output .= $pad . $cat_name ;
if ( $args [ 'show_count' ] )
2014-02-28 16:48:13 -05:00
$output .= ' (' . number_format_i18n ( $category -> count ) . ')' ;
2010-10-30 10:06:08 -04:00
$output .= " </option> \n " ;
}
}
2007-04-10 17:23:11 -04:00
//
// Tags
//
2008-09-25 10:16:27 -04:00
/**
* Retrieve the link to the tag .
*
* @ since 2.3 . 0
2010-10-17 01:41:22 -04:00
* @ see get_term_link ()
2008-09-25 10:16:27 -04:00
*
2011-02-10 16:48:40 -05:00
* @ param int | object $tag Tag ID or object .
2011-02-10 15:17:54 -05:00
* @ return string Link on success , empty string if tag does not exist .
2008-09-25 10:16:27 -04:00
*/
2011-02-10 15:17:54 -05:00
function get_tag_link ( $tag ) {
2011-02-10 16:48:40 -05:00
if ( ! is_object ( $tag ) )
$tag = ( int ) $tag ;
$tag = get_term_link ( $tag , 'post_tag' );
if ( is_wp_error ( $tag ) )
return '' ;
return $tag ;
2007-04-10 17:23:11 -04:00
}
2008-09-25 10:16:27 -04:00
/**
* Retrieve the tags for a post .
*
* @ since 2.3 . 0
*
* @ param int $id Post ID .
2013-06-21 08:45:11 -04:00
* @ return array | bool Array of tag objects on success , false on failure .
2008-09-25 10:16:27 -04:00
*/
2007-04-10 17:23:11 -04:00
function get_the_tags ( $id = 0 ) {
2014-03-23 21:35:15 -04:00
/**
* Filter the array of tags for the given post .
*
* @ since 2.3 . 0
*
* @ see get_the_terms ()
*
* @ param array $terms An array of tags for the given post .
*/
2008-08-06 17:01:46 -04:00
return apply_filters ( 'get_the_tags' , get_the_terms ( $id , 'post_tag' ) );
2008-03-26 02:37:19 -04:00
}
2008-09-25 10:16:27 -04:00
/**
* Retrieve the tags for a post formatted as a string .
*
* @ since 2.3 . 0
*
* @ param string $before Optional . Before tags .
* @ param string $sep Optional . Between tags .
* @ param string $after Optional . After tags .
2012-04-20 06:06:05 -04:00
* @ param int $id Optional . Post ID . Defaults to the current post .
2013-06-21 08:45:11 -04:00
* @ return string | bool | WP_Error A list of tags on success , false or WP_Error on failure .
2008-09-25 10:16:27 -04:00
*/
2012-04-20 06:06:05 -04:00
function get_the_tag_list ( $before = '' , $sep = '' , $after = '' , $id = 0 ) {
2014-03-23 21:35:15 -04:00
/**
* Filter the tags list for a given post .
*
* @ since 2.3 . 0
*
* @ param string $tag_list List of tags .
* @ param string $before String to use before tags .
* @ param string $sep String to use between the tags .
* @ param string $after String to use after tags .
* @ param int $id Post ID .
*/
2012-04-20 06:06:05 -04:00
return apply_filters ( 'the_tags' , get_the_term_list ( $id , 'post_tag' , $before , $sep , $after ), $before , $sep , $after , $id );
2008-03-26 02:37:19 -04:00
}
2008-09-25 10:16:27 -04: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 .
*/
2009-04-07 19:54:16 -04:00
function the_tags ( $before = null , $sep = ', ' , $after = '' ) {
if ( null === $before )
$before = __ ( 'Tags: ' );
echo get_the_tag_list ( $before , $sep , $after );
2008-03-26 02:37:19 -04:00
}
2009-04-09 12:00:40 -04:00
/**
* Retrieve tag description .
*
2013-12-24 13:57:12 -05:00
* @ since 2.8 . 0
2009-04-09 12:00:40 -04:00
*
* @ param int $tag Optional . Tag ID . Will use global tag ID by default .
* @ return string Tag description , available .
*/
function tag_description ( $tag = 0 ) {
return term_description ( $tag );
}
/**
* Retrieve term description .
*
2013-12-24 13:57:12 -05:00
* @ since 2.8 . 0
2009-04-09 12:00:40 -04:00
*
* @ param int $term Optional . Term ID . Will use global term ID by default .
2012-01-06 13:31:43 -05:00
* @ param string $taxonomy Optional taxonomy name . Defaults to 'post_tag' .
2009-04-09 12:00:40 -04:00
* @ return string Term description , available .
*/
function term_description ( $term = 0 , $taxonomy = 'post_tag' ) {
2013-09-09 22:28:11 -04:00
if ( ! $term && ( is_tax () || is_tag () || is_category () ) ) {
2010-10-31 07:02:17 -04:00
$term = get_queried_object ();
2013-09-09 22:28:11 -04:00
if ( $term ) {
$taxonomy = $term -> taxonomy ;
$term = $term -> term_id ;
}
2009-04-09 12:00:40 -04:00
}
2010-03-25 13:28:16 -04:00
$description = get_term_field ( 'description' , $term , $taxonomy );
return is_wp_error ( $description ) ? '' : $description ;
2009-04-09 12:00:40 -04:00
}
2008-09-25 10:16:27 -04:00
/**
* Retrieve the terms of the taxonomy that are attached to the post .
*
* @ since 2.5 . 0
*
2013-06-21 08:45:11 -04:00
* @ param int | object $post Post ID or object .
2008-09-25 10:16:27 -04:00
* @ param string $taxonomy Taxonomy name .
2013-06-21 08:45:11 -04:00
* @ return array | bool | WP_Error Array of term objects on success , false or WP_Error on failure .
2008-09-25 10:16:27 -04:00
*/
2012-09-04 12:29:28 -04:00
function get_the_terms ( $post , $taxonomy ) {
if ( ! $post = get_post ( $post ) )
return false ;
2007-04-10 17:23:11 -04:00
2012-09-04 12:29:28 -04:00
$terms = get_object_term_cache ( $post -> ID , $taxonomy );
2010-11-19 12:09:21 -05:00
if ( false === $terms ) {
2012-09-04 12:29:28 -04:00
$terms = wp_get_object_terms ( $post -> ID , $taxonomy );
wp_cache_add ( $post -> ID , $terms , $taxonomy . '_relationships' );
2010-11-19 12:09:21 -05:00
}
2010-12-13 16:21:50 -05:00
2014-03-23 21:35:15 -04:00
/**
* Filter the list of terms attached to the given post .
*
* @ since 3.1 . 0
*
* @ param array $terms List of attached terms .
* @ param int $post_id Post ID .
* @ param string $taxonomy Name of the taxonomy .
*/
2012-09-04 12:29:28 -04:00
$terms = apply_filters ( 'get_the_terms' , $terms , $post -> ID , $taxonomy );
2010-11-13 09:08:27 -05:00
2008-03-26 02:37:19 -04:00
if ( empty ( $terms ) )
2007-09-03 19:32:58 -04:00
return false ;
2008-03-26 02:37:19 -04:00
return $terms ;
2007-04-10 17:23:11 -04:00
}
2008-09-25 10:16:27 -04:00
/**
2009-12-03 10:52:11 -05:00
* Retrieve a post ' s terms as a list with specified format .
2008-09-25 10:16:27 -04:00
*
* @ since 2.5 . 0
*
2009-12-03 10:52:11 -05:00
* @ param int $id Post ID .
2008-09-25 10:16:27 -04:00
* @ 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 .
2013-06-21 08:45:11 -04:00
* @ return string | bool | WP_Error A list of terms on success , false or WP_Error on failure .
2008-09-25 10:16:27 -04:00
*/
2012-04-20 06:06:05 -04:00
function get_the_term_list ( $id , $taxonomy , $before = '' , $sep = '' , $after = '' ) {
2008-08-06 17:01:46 -04:00
$terms = get_the_terms ( $id , $taxonomy );
2007-04-10 17:23:11 -04:00
2008-08-06 17:01:46 -04:00
if ( is_wp_error ( $terms ) )
2008-03-26 02:37:19 -04:00
return $terms ;
if ( empty ( $terms ) )
2007-04-10 17:23:11 -04:00
return false ;
2007-06-13 22:25:30 -04:00
2008-03-26 02:37:19 -04:00
foreach ( $terms as $term ) {
2009-05-14 00:09:01 -04:00
$link = get_term_link ( $term , $taxonomy );
2007-09-18 12:32:22 -04:00
if ( is_wp_error ( $link ) )
return $link ;
2012-04-30 17:36:43 -04:00
$term_links [] = '<a href="' . esc_url ( $link ) . '" rel="tag">' . $term -> name . '</a>' ;
2007-09-18 12:32:22 -04:00
}
2007-04-10 17:23:11 -04:00
2014-03-23 21:35:15 -04:00
/**
* Filter the term links for a given taxonomy .
*
* The dynamic portion of the filter name , $taxonomy , refers
* to the taxonomy slug .
*
* @ since 2.5 . 0
*
* @ param array $term_links An array of term links .
*/
2008-03-26 02:37:19 -04:00
$term_links = apply_filters ( " term_links- $taxonomy " , $term_links );
2007-04-10 17:23:11 -04:00
2008-08-06 17:01:46 -04:00
return $before . join ( $sep , $term_links ) . $after ;
2007-08-13 23:44:49 -04:00
}
2008-09-25 10:16:27 -04:00
/**
* Display the terms in a list .
*
* @ since 2.5 . 0
*
2010-10-19 18:41:34 -04:00
* @ param int $id Post ID .
2008-09-25 10:16:27 -04:00
* @ 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 .
*/
2012-04-20 06:06:05 -04:00
function the_terms ( $id , $taxonomy , $before = '' , $sep = ', ' , $after = '' ) {
2009-09-04 04:47:36 -04:00
$term_list = get_the_term_list ( $id , $taxonomy , $before , $sep , $after );
if ( is_wp_error ( $term_list ) )
2007-09-18 12:32:22 -04:00
return false ;
2009-09-04 04:47:36 -04:00
2014-03-23 21:35:15 -04:00
/**
* Filter the list of terms to display .
*
* @ since 2.9 . 0
*
* @ param array $term_list List of terms to display .
* @ param string $taxonomy The taxonomy name .
* @ param string $before String to use before the terms .
* @ param string $sep String to use between the terms .
* @ param string $after String to use after the terms .
*/
echo apply_filters ( 'the_terms' , $term_list , $taxonomy , $before , $sep , $after );
2007-04-10 17:23:11 -04:00
}
2010-10-01 13:44:53 -04:00
/**
* Check if the current post has any of given category .
*
* @ since 3.1 . 0
*
2012-01-06 13:31:43 -05:00
* @ param string | int | array $category Optional . The category name / term_id / slug or array of them to check for .
2010-10-01 13:44:53 -04:00
* @ param int | object $post Optional . Post to check instead of the current post .
* @ return bool True if the current post has any of the given categories ( or any category , if no category specified ) .
*/
function has_category ( $category = '' , $post = null ) {
return has_term ( $category , 'category' , $post );
}
2008-06-20 09:52:18 -04:00
/**
2008-12-09 18:31:11 -05:00
* Check if the current post has any of given tags .
*
* The given tags are checked against the post 's tags' term_ids , names and slugs .
* Tags given as integers will only be checked against the post 's tags' term_ids .
* If no tags are given , determines if post has any tags .
2008-06-20 09:52:18 -04:00
*
2008-12-09 18:31:11 -05:00
* Prior to v2 . 7 of WordPress , tags given as integers would also be checked against the post 's tags' names and slugs ( in addition to term_ids )
* Prior to v2 . 7 , this function could only be used in the WordPress Loop .
* As of 2.7 , the function can be used anywhere if it is provided a post ID or post object .
2008-09-25 10:16:27 -04:00
*
* @ since 2.6 . 0
2008-06-20 09:52:18 -04:00
*
2008-12-09 18:31:11 -05:00
* @ param string | int | array $tag Optional . The tag name / term_id / slug or array of them to check for .
2010-10-01 13:44:53 -04:00
* @ param int | object $post Optional . Post to check instead of the current post . ( since 2.7 . 0 )
* @ return bool True if the current post has any of the given tags ( or any tag , if no tag specified ) .
2008-06-20 09:52:18 -04:00
*/
2010-10-01 13:44:53 -04:00
function has_tag ( $tag = '' , $post = null ) {
return has_term ( $tag , 'post_tag' , $post );
}
2008-06-20 09:52:18 -04:00
2010-10-01 13:44:53 -04:00
/**
* Check if the current post has any of given terms .
2010-10-19 03:48:22 -04:00
*
2010-10-01 13:44:53 -04:00
* The given terms are checked against the post 's terms' term_ids , names and slugs .
* Terms given as integers will only be checked against the post 's terms' term_ids .
* If no terms are given , determines if post has any terms .
*
* @ since 3.1 . 0
*
* @ param string | int | array $term Optional . The term name / term_id / slug or array of them to check for .
2010-11-11 12:02:14 -05:00
* @ param string $taxonomy Taxonomy name
2010-11-18 14:12:48 -05:00
* @ param int | object $post Optional . Post to check instead of the current post .
2010-10-01 13:44:53 -04:00
* @ return bool True if the current post has any of the given tags ( or any tag , if no tag specified ) .
*/
function has_term ( $term = '' , $taxonomy = '' , $post = null ) {
$post = get_post ( $post );
if ( ! $post )
2008-12-09 18:31:11 -05:00
return false ;
2010-10-01 13:44:53 -04:00
$r = is_object_in_term ( $post -> ID , $taxonomy , $term );
2008-12-09 18:31:11 -05:00
if ( is_wp_error ( $r ) )
return false ;
2010-10-01 13:44:53 -04:00
2008-12-09 18:31:11 -05:00
return $r ;
2008-06-20 09:52:18 -04:00
}