2006-06-04 21:36:52 +00:00
< ? php
2007-04-05 21:16:02 +00:00
define ( 'TAXONOMY_CATEGORY' , 1 );
define ( 'TAXONOMY_TAG' , 2 );
2006-06-04 21:36:52 +00:00
function get_all_category_ids () {
global $wpdb ;
if ( ! $cat_ids = wp_cache_get ( 'all_category_ids' , 'category' ) ) {
2007-05-23 10:32:33 +00:00
$cat_ids = get_terms ( 'category' , 'get=ids&hierarchical=0&hide_empty=0' );
2007-04-12 02:27:12 +00:00
wp_cache_add ( 'all_category_ids' , $cat_ids , 'category' );
2006-06-04 21:36:52 +00:00
}
return $cat_ids ;
}
function & get_categories ( $args = '' ) {
2007-05-23 10:32:33 +00:00
// TODO Add back compat fields into each object.
return get_terms ( 'category' , $args );
2006-06-04 21:36:52 +00:00
}
// Retrieves category data given a category ID or category object.
// Handles category caching.
function & get_category ( & $category , $output = OBJECT ) {
2007-05-23 10:32:33 +00:00
return get_term ( $category , 'category' , $output );
2006-06-04 21:36:52 +00:00
}
function get_category_by_path ( $category_path , $full_match = true , $output = OBJECT ) {
global $wpdb ;
$category_path = rawurlencode ( urldecode ( $category_path ));
$category_path = str_replace ( '%2F' , '/' , $category_path );
$category_path = str_replace ( '%20' , ' ' , $category_path );
$category_paths = '/' . trim ( $category_path , '/' );
$leaf_path = sanitize_title ( basename ( $category_paths ));
$category_paths = explode ( '/' , $category_paths );
2006-12-09 06:35:22 +00:00
$full_path = '' ;
foreach ( ( array ) $category_paths as $pathdir )
$full_path .= ( $pathdir != '' ? '/' : '' ) . sanitize_title ( $pathdir );
2006-06-04 21:36:52 +00:00
2007-05-23 10:32:33 +00:00
$categories = get_terms ( 'category' , " slug= $leaf_path " );
2006-06-04 21:36:52 +00:00
2006-07-11 03:33:25 +00:00
if ( empty ( $categories ) )
2006-06-04 21:36:52 +00:00
return NULL ;
foreach ( $categories as $category ) {
$path = '/' . $leaf_path ;
$curcategory = $category ;
2007-05-23 10:32:33 +00:00
while ( ( $curcategory -> parent != 0 ) && ( $curcategory -> parent != $curcategory -> term_id ) ) {
$curcategory = get_term ( $curcategory -> parent );
$path = '/' . $curcategory -> slug . $path ;
2006-06-04 21:36:52 +00:00
}
if ( $path == $full_path )
2007-05-23 10:32:33 +00:00
return get_category ( $category -> term_id , $output );
2006-06-04 21:36:52 +00:00
}
// If full matching is not required, return the first cat that matches the leaf.
if ( ! $full_match )
2007-05-23 10:32:33 +00:00
return get_category ( $categories [ 0 ] -> term_id , $output );
2006-06-04 21:36:52 +00:00
return NULL ;
}
2007-03-31 06:16:12 +00:00
function get_category_by_slug ( $slug ) {
2007-05-23 10:32:33 +00:00
return get_term_by ( 'slug' , $slug , 'category' );
2007-03-31 06:16:12 +00:00
}
2006-06-04 21:36:52 +00:00
// Get the ID of a category from its name
function get_cat_ID ( $cat_name = 'General' ) {
global $wpdb ;
2007-05-23 10:32:33 +00:00
$cat = get_term_by ( 'name' , $cat_name , 'category' );
if ( $cat )
return $cat -> term_id ;
return 0 ;
2006-06-04 21:36:52 +00:00
}
// Deprecate
function get_catname ( $cat_ID ) {
return get_cat_name ( $cat_ID );
}
// Get the name of a category from its ID
function get_cat_name ( $cat_id ) {
$cat_id = ( int ) $cat_id ;
$category = & get_category ( $cat_id );
return $category -> cat_name ;
}
2006-11-24 16:37:44 +00:00
function cat_is_ancestor_of ( $cat1 , $cat2 ) {
if ( is_int ( $cat1 ) )
$cat1 = & get_category ( $cat1 );
if ( is_int ( $cat2 ) )
$cat2 = & get_category ( $cat2 );
2007-05-23 10:32:33 +00:00
if ( ! $cat1 -> term_id || ! $cat2 -> parent )
2006-11-24 16:37:44 +00:00
return false ;
2007-05-23 10:32:33 +00:00
if ( $cat2 -> parent == $cat1 -> term_id )
2006-11-24 16:37:44 +00:00
return true ;
2007-05-23 10:32:33 +00:00
return cat_is_ancestor_of ( $cat1 , get_category ( $cat2 -> parent ));
2006-11-24 16:37:44 +00:00
}
2006-06-04 21:36:52 +00:00
//
// Private
//
function & _get_cat_children ( $category_id , $categories ) {
if ( empty ( $categories ) )
return array ();
$category_list = array ();
2007-04-23 20:28:38 +00:00
$has_children = _get_category_hierarchy ();
2007-04-04 22:32:24 +00:00
2007-04-23 20:28:38 +00:00
if ( ( 0 != $category_id ) && ! isset ( $has_children [ $category_id ]) )
2007-04-04 22:32:24 +00:00
return array ();
2006-06-04 21:36:52 +00:00
foreach ( $categories as $category ) {
2006-09-07 17:42:24 +00:00
if ( $category -> cat_ID == $category_id )
continue ;
2006-06-04 21:36:52 +00:00
if ( $category -> category_parent == $category_id ) {
$category_list [] = $category ;
2007-04-04 22:32:24 +00:00
2007-04-23 20:28:38 +00:00
if ( ! isset ( $has_children [ $category -> cat_ID ]) )
2007-04-04 20:44:45 +00:00
continue ;
2007-04-23 20:28:38 +00:00
2006-06-04 21:36:52 +00:00
if ( $children = _get_cat_children ( $category -> cat_ID , $categories ) )
$category_list = array_merge ( $category_list , $children );
}
}
return $category_list ;
}
2007-01-09 08:45:05 +00:00
// Recalculates link or post counts by including items from child categories
// Assumes all relevant children are already in the $categories argument
function _pad_category_counts ( $type , & $categories ) {
global $wpdb ;
// Set up some useful arrays
foreach ( $categories as $key => $cat ) {
$cats [ $cat -> cat_ID ] = & $categories [ $key ];
$cat_IDs [] = $cat -> cat_ID ;
}
// Get the relevant post2cat or link2cat records and stick them in a lookup table
if ( $type == 'post' ) {
$results = $wpdb -> get_results ( " SELECT post_id, category_id FROM $wpdb->post2cat LEFT JOIN $wpdb->posts ON post_id = ID WHERE category_id IN ( " . join ( ',' , $cat_IDs ) . " ) AND post_type = 'post' AND post_status = 'publish' " );
foreach ( $results as $row )
++ $cat_items [ $row -> category_id ][ $row -> post_id ];
} else {
$results = $wpdb -> get_results ( " SELECT $wpdb->link2cat .link_id, category_id FROM $wpdb->link2cat LEFT JOIN $wpdb->links USING (link_id) WHERE category_id IN ( " . join ( ',' , $cat_IDs ) . " ) AND link_visible = 'Y' " );
foreach ( $results as $row )
++ $cat_items [ $row -> category_id ][ $row -> link_id ];
}
// Touch every ancestor's lookup row for each post in each category
foreach ( $cat_IDs as $cat_ID ) {
$child = $cat_ID ;
while ( $parent = $cats [ $child ] -> category_parent ) {
if ( ! empty ( $cat_items [ $cat_ID ]) )
foreach ( $cat_items [ $cat_ID ] as $item_id => $touches )
++ $cat_items [ $parent ][ $item_id ];
$child = $parent ;
}
}
// Transfer the touched cells
2007-01-10 20:42:17 +00:00
foreach ( ( array ) $cat_items as $id => $items )
2007-01-09 08:45:05 +00:00
if ( isset ( $cats [ $id ]) )
$cats [ $id ] -> { 'link' == $type ? 'link_count' : 'category_count' } = count ( $items );
}
2007-04-04 20:44:45 +00:00
function _get_category_hierarchy () {
$children = get_option ( 'category_children' );
if ( is_array ( $children ) )
return $children ;
$children = array ();
$categories = get_categories ( 'hide_empty=0&hierarchical=0' );
foreach ( $categories as $cat ) {
if ( $cat -> category_parent > 0 )
$children [ $cat -> category_parent ][] = $cat -> cat_ID ;
}
update_option ( 'category_children' , $children );
return $children ;
}
2007-04-10 18:55:51 +00:00
// Tags
function & get_tags ( $args = '' ) {
global $wpdb , $category_links ;
2007-04-10 19:52:15 +00:00
$key = md5 ( serialize ( $args ) );
2007-04-10 18:55:51 +00:00
if ( $cache = wp_cache_get ( 'get_tags' , 'category' ) )
if ( isset ( $cache [ $key ] ) )
2007-04-10 19:52:15 +00:00
return apply_filters ( 'get_tags' , $cache [ $key ], $args );
2007-04-10 18:55:51 +00:00
2007-05-23 03:57:20 +00:00
$tags = get_terms ( 'post_tag' );
2007-04-10 18:55:51 +00:00
if ( empty ( $tags ) )
return array ();
$cache [ $key ] = $tags ;
wp_cache_set ( 'get_tags' , $cache , 'category' );
2007-04-10 19:52:15 +00:00
$tags = apply_filters ( 'get_tags' , $tags , $args );
2007-04-10 18:55:51 +00:00
return $tags ;
}
2006-06-04 21:36:52 +00:00
?>