From df5c96795365fd9e960757c60cba564546d6a14f Mon Sep 17 00:00:00 2001 From: ryan Date: Sun, 4 Jun 2006 21:36:52 +0000 Subject: [PATCH] Reorg category functions. #2525 git-svn-id: http://svn.automattic.com/wordpress/trunk@3843 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- ...ons-category.php => category-template.php} | 252 ++++++------------ wp-includes/category.php | 205 ++++++++++++++ wp-includes/functions-post.php | 19 -- wp-includes/functions.php | 80 ------ 4 files changed, 282 insertions(+), 274 deletions(-) rename wp-includes/{template-functions-category.php => category-template.php} (72%) create mode 100644 wp-includes/category.php diff --git a/wp-includes/template-functions-category.php b/wp-includes/category-template.php similarity index 72% rename from wp-includes/template-functions-category.php rename to wp-includes/category-template.php index a269e69f6a..3df9b73cf7 100644 --- a/wp-includes/template-functions-category.php +++ b/wp-includes/category-template.php @@ -1,15 +1,60 @@ category_parent == $id ) { + $chain .= $before.$category->cat_ID.$after; + $chain .= get_category_children($category->cat_ID, $before, $after); + } + } + return $chain; } -function walk_category_dropdown_tree() { - $walker = new Walker_CategoryDropdown; - $args = func_get_args(); - return call_user_func_array(array(&$walker, 'walk'), $args); +function get_category_link($category_id) { + global $wp_rewrite; + $catlink = $wp_rewrite->get_category_permastruct(); + + if ( empty($catlink) ) { + $file = get_settings('home') . '/'; + $catlink = $file . '?cat=' . $category_id; + } else { + $category = &get_category($category_id); + $category_nicename = $category->category_nicename; + + if ( $parent = $category->category_parent ) + $category_nicename = get_category_parents($parent, false, '/', true) . $category_nicename . '/'; + + $catlink = str_replace('%category%', $category_nicename, $catlink); + $catlink = get_settings('home') . trailingslashit($catlink); + } + return apply_filters('category_link', $catlink, $category_id); +} + +function get_category_parents($id, $link = FALSE, $separator = '/', $nicename = FALSE){ + $chain = ''; + $parent = &get_category($id); + + if ( $nicename ) + $name = $parent->category_nicename; + else + $name = $parent->cat_name; + + if ( $parent->category_parent ) + $chain .= get_category_parents($parent->category_parent, $link, $separator, $nicename); + + if ( $link ) + $chain .= 'cat_name) . '">'.$name.'' . $separator; + else + $chain .= $name.$separator; + return $chain; } function get_the_category($id = false) { @@ -31,24 +76,10 @@ global $post, $category_cache; return $categories; } -function get_category_link($category_id) { - global $wp_rewrite; - $catlink = $wp_rewrite->get_category_permastruct(); - - if ( empty($catlink) ) { - $file = get_settings('home') . '/'; - $catlink = $file . '?cat=' . $category_id; - } else { - $category = &get_category($category_id); - $category_nicename = $category->category_nicename; - - if ( $parent = $category->category_parent ) - $category_nicename = get_category_parents($parent, false, '/', true) . $category_nicename . '/'; - - $catlink = str_replace('%category%', $category_nicename, $catlink); - $catlink = get_settings('home') . trailingslashit($catlink); - } - return apply_filters('category_link', $catlink, $category_id); +function get_the_category_by_ID($cat_ID) { + $cat_ID = (int) $cat_ID; + $category = &get_category($cat_ID); + return $category->cat_name; } function get_the_category_list($separator = '', $parents='') { @@ -106,53 +137,19 @@ function get_the_category_list($separator = '', $parents='') { return apply_filters('the_category', $thelist, $separator, $parents); } +function in_category($category) { // Check if the current post is in the given category + global $category_cache, $post; + + if ( isset( $category_cache[$post->ID][$category] ) ) + return true; + else + return false; +} + function the_category($separator = '', $parents='') { echo get_the_category_list($separator, $parents); } -function get_the_category_by_ID($cat_ID) { - $cat_ID = (int) $cat_ID; - $category = &get_category($cat_ID); - return $category->cat_name; -} - -function get_category_parents($id, $link = FALSE, $separator = '/', $nicename = FALSE){ - $chain = ''; - $parent = &get_category($id); - - if ( $nicename ) - $name = $parent->category_nicename; - else - $name = $parent->cat_name; - - if ( $parent->category_parent ) - $chain .= get_category_parents($parent->category_parent, $link, $separator, $nicename); - - if ( $link ) - $chain .= 'cat_name) . '">'.$name.'' . $separator; - else - $chain .= $name.$separator; - return $chain; -} - -function get_category_children($id, $before = '/', $after = '') { - if ( 0 == $id ) - return ''; - - $cat_ids = get_all_category_ids(); - foreach ( $cat_ids as $cat_id ) { - if ( $cat_id == $id) - continue; - - $category = get_category($cat_id); - if ( $category->category_parent == $id ) { - $chain .= $before.$category->cat_ID.$after; - $chain .= get_category_children($category->cat_ID, $before, $after); - } - } - return $chain; -} - function category_description($category = 0) { global $cat; if ( !$category ) @@ -252,115 +249,20 @@ function wp_list_categories($args = '') { echo apply_filters('list_cats', $output); } -function in_category($category) { // Check if the current post is in the given category - global $category_cache, $post; +// +// Helper functions +// - if ( isset( $category_cache[$post->ID][$category] ) ) - return true; - else - return false; +function walk_category_tree() { + $walker = new Walker_Category; + $args = func_get_args(); + return call_user_func_array(array(&$walker, 'walk'), $args); } -function &_get_cat_children($category_id, $categories) { - if ( empty($categories) ) - return array(); - - $category_list = array(); - foreach ( $categories as $category ) { - if ( $category->category_parent == $category_id ) { - $category_list[] = $category; - if ( $children = _get_cat_children($category->cat_ID, $categories) ) - $category_list = array_merge($category_list, $children); - } - } - - return $category_list; -} - -function &get_categories($args = '') { - global $wpdb, $category_links; - - if ( is_array($args) ) - $r = &$args; - else - parse_str($args, $r); - - $defaults = array('type' => 'post', 'child_of' => 0, 'orderby' => 'name', 'order' => 'ASC', - 'hide_empty' => true, 'include_last_update_time' => false, 'hierarchical' => 1, $exclude => '', $include => ''); - $r = array_merge($defaults, $r); - $r['orderby'] = "cat_" . $r['orderby']; // restricts order by to cat_ID and cat_name fields - extract($r); - - $where = 'cat_ID > 0'; - $inclusions = ''; - if ( !empty($include) ) { - $child_of = 0; //ignore child_of and exclude params if using include - $exclude = ''; - $incategories = preg_split('/[\s,]+/',$include); - if ( count($incategories) ) { - foreach ( $incategories as $incat ) { - if (empty($inclusions)) - $inclusions = ' AND ( cat_ID = ' . intval($incat) . ' '; - else - $inclusions .= ' OR cat_ID = ' . intval($incat) . ' '; - } - } - } - if (!empty($inclusions)) - $inclusions .= ')'; - $where .= $inclusions; - - $exclusions = ''; - if ( !empty($exclude) ) { - $excategories = preg_split('/[\s,]+/',$exclude); - if ( count($excategories) ) { - foreach ( $excategories as $excat ) { - if (empty($exclusions)) - $exclusions = ' AND ( cat_ID <> ' . intval($excat) . ' '; - else - $exclusions .= ' AND cat_ID <> ' . intval($excat) . ' '; - // TODO: Exclude children of excluded cats? Note: children are getting excluded - } - } - } - if (!empty($exclusions)) - $exclusions .= ')'; - $exclusions = apply_filters('list_cats_exclusions', $exclusions ); - $where .= $exclusions; - - $having = ''; - if ( $hide_empty ) { - if ( 'link' == $type ) - $having = 'HAVING link_count > 0'; - else - $having = 'HAVING category_count > 0'; - } - - $categories = $wpdb->get_results("SELECT * FROM $wpdb->categories WHERE $where $having ORDER BY $orderby $order"); - - if ( empty($categories) ) - return array(); - - // TODO: Integrate this into the main query. - if ( $include_last_update_time ) { - $stamps = $wpdb->get_results("SELECT category_id, UNIX_TIMESTAMP( MAX(post_date) ) AS ts FROM $wpdb->posts, $wpdb->post2cat, $wpdb->categories - WHERE post_status = 'publish' AND post_id = ID AND $where GROUP BY category_id"); - global $cat_stamps; - foreach ($stamps as $stamp) - $cat_stamps[$stamp->category_id] = $stamp->ts; - function stamp_cat($cat) { - global $cat_stamps; - $cat->last_update_timestamp = $cat_stamps[$cat->cat_ID]; - return $cat; - } - $categories = array_map('stamp_cat', $categories); - unset($cat_stamps); - } - - if ( $child_of || $hierarchical ) - $categories = & _get_cat_children($child_of, $categories); - - return apply_filters('get_categories', $categories); +function walk_category_dropdown_tree() { + $walker = new Walker_CategoryDropdown; + $args = func_get_args(); + return call_user_func_array(array(&$walker, 'walk'), $args); } ?> diff --git a/wp-includes/category.php b/wp-includes/category.php new file mode 100644 index 0000000000..fb0ec87490 --- /dev/null +++ b/wp-includes/category.php @@ -0,0 +1,205 @@ +get_col("SELECT cat_ID FROM $wpdb->categories"); + wp_cache_add('all_category_ids', $cat_ids, 'category'); + } + + return $cat_ids; +} + +function &get_categories($args = '') { + global $wpdb, $category_links; + + if ( is_array($args) ) + $r = &$args; + else + parse_str($args, $r); + + $defaults = array('type' => 'post', 'child_of' => 0, 'orderby' => 'name', 'order' => 'ASC', + 'hide_empty' => true, 'include_last_update_time' => false, 'hierarchical' => 1, $exclude => '', $include => ''); + $r = array_merge($defaults, $r); + $r['orderby'] = "cat_" . $r['orderby']; // restricts order by to cat_ID and cat_name fields + extract($r); + + $where = 'cat_ID > 0'; + $inclusions = ''; + if ( !empty($include) ) { + $child_of = 0; //ignore child_of and exclude params if using include + $exclude = ''; + $incategories = preg_split('/[\s,]+/',$include); + if ( count($incategories) ) { + foreach ( $incategories as $incat ) { + if (empty($inclusions)) + $inclusions = ' AND ( cat_ID = ' . intval($incat) . ' '; + else + $inclusions .= ' OR cat_ID = ' . intval($incat) . ' '; + } + } + } + if (!empty($inclusions)) + $inclusions .= ')'; + $where .= $inclusions; + + $exclusions = ''; + if ( !empty($exclude) ) { + $excategories = preg_split('/[\s,]+/',$exclude); + if ( count($excategories) ) { + foreach ( $excategories as $excat ) { + if (empty($exclusions)) + $exclusions = ' AND ( cat_ID <> ' . intval($excat) . ' '; + else + $exclusions .= ' AND cat_ID <> ' . intval($excat) . ' '; + // TODO: Exclude children of excluded cats? Note: children are getting excluded + } + } + } + if (!empty($exclusions)) + $exclusions .= ')'; + $exclusions = apply_filters('list_cats_exclusions', $exclusions ); + $where .= $exclusions; + + $having = ''; + if ( $hide_empty ) { + if ( 'link' == $type ) + $having = 'HAVING link_count > 0'; + else + $having = 'HAVING category_count > 0'; + } + + $categories = $wpdb->get_results("SELECT * FROM $wpdb->categories WHERE $where $having ORDER BY $orderby $order"); + + if ( empty($categories) ) + return array(); + + // TODO: Integrate this into the main query. + if ( $include_last_update_time ) { + $stamps = $wpdb->get_results("SELECT category_id, UNIX_TIMESTAMP( MAX(post_date) ) AS ts FROM $wpdb->posts, $wpdb->post2cat, $wpdb->categories + WHERE post_status = 'publish' AND post_id = ID AND $where GROUP BY category_id"); + global $cat_stamps; + foreach ($stamps as $stamp) + $cat_stamps[$stamp->category_id] = $stamp->ts; + function stamp_cat($cat) { + global $cat_stamps; + $cat->last_update_timestamp = $cat_stamps[$cat->cat_ID]; + return $cat; + } + $categories = array_map('stamp_cat', $categories); + unset($cat_stamps); + } + + if ( $child_of || $hierarchical ) + $categories = & _get_cat_children($child_of, $categories); + + return apply_filters('get_categories', $categories); +} + +// Retrieves category data given a category ID or category object. +// Handles category caching. +function &get_category(&$category, $output = OBJECT) { + global $wpdb; + + if ( empty($category) ) + return null; + + if ( is_object($category) ) { + wp_cache_add($category->cat_ID, $category, 'category'); + $_category = $category; + } else { + if ( ! $_category = wp_cache_get($category, 'category') ) { + $_category = $wpdb->get_row("SELECT * FROM $wpdb->categories WHERE cat_ID = '$category' LIMIT 1"); + wp_cache_add($category, $_category, 'category'); + } + } + + if ( $output == OBJECT ) { + return $_category; + } elseif ( $output == ARRAY_A ) { + return get_object_vars($_category); + } elseif ( $output == ARRAY_N ) { + return array_values(get_object_vars($_category)); + } else { + return $_category; + } +} + +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); + foreach($category_paths as $pathdir) + $full_path .= ($pathdir!=''?'/':'') . sanitize_title($pathdir); + + $categories = $wpdb->get_results("SELECT cat_ID, category_nicename, category_parent FROM $wpdb->categories WHERE category_nicename = '$leaf_path'"); + + if ( empty($categories) ) + return NULL; + + foreach ($categories as $category) { + $path = '/' . $leaf_path; + $curcategory = $category; + while ($curcategory->category_parent != 0) { + $curcategory = $wpdb->get_row("SELECT cat_ID, category_nicename, category_parent FROM $wpdb->categories WHERE cat_ID = '$curcategory->category_parent'"); + $path = '/' . $curcategory->category_nicename . $path; + } + + if ( $path == $full_path ) + return get_category($category->cat_ID, $output); + } + + // If full matching is not required, return the first cat that matches the leaf. + if ( ! $full_match ) + return get_category($categories[0]->cat_ID, $output); + + return NULL; +} + +// Get the ID of a category from its name +function get_cat_ID($cat_name='General') { + global $wpdb; + + $cid = $wpdb->get_var("SELECT cat_ID FROM $wpdb->categories WHERE cat_name='$cat_name'"); + + return $cid?$cid:1; // default to cat 1 +} + +// 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; +} + +// +// Private +// + +function &_get_cat_children($category_id, $categories) { + if ( empty($categories) ) + return array(); + + $category_list = array(); + foreach ( $categories as $category ) { + if ( $category->category_parent == $category_id ) { + $category_list[] = $category; + if ( $children = _get_cat_children($category->cat_ID, $categories) ) + $category_list = array_merge($category_list, $children); + } + } + + return $category_list; +} + +?> diff --git a/wp-includes/functions-post.php b/wp-includes/functions-post.php index ff49203def..0d18e52622 100644 --- a/wp-includes/functions-post.php +++ b/wp-includes/functions-post.php @@ -607,25 +607,6 @@ function post_permalink($post_id = 0, $mode = '') { // $mode legacy return get_permalink($post_id); } -// Get the name of a category from its ID -function get_cat_name($cat_id) { - global $wpdb; - - $cat_id -= 0; // force numeric - $name = $wpdb->get_var("SELECT cat_name FROM $wpdb->categories WHERE cat_ID=$cat_id"); - - return $name; -} - -// Get the ID of a category from its name -function get_cat_ID($cat_name='General') { - global $wpdb; - - $cid = $wpdb->get_var("SELECT cat_ID FROM $wpdb->categories WHERE cat_name='$cat_name'"); - - return $cid?$cid:1; // default to cat 1 -} - // Get author's preferred display name function get_author_name( $auth_id ) { $authordata = get_userdata( $auth_id ); diff --git a/wp-includes/functions.php b/wp-includes/functions.php index 8d9f5d9d9d..1c07813128 100644 --- a/wp-includes/functions.php +++ b/wp-includes/functions.php @@ -626,86 +626,6 @@ function &get_page(&$page, $output = OBJECT) { } } -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); - foreach($category_paths as $pathdir) - $full_path .= ($pathdir!=''?'/':'') . sanitize_title($pathdir); - - $categories = $wpdb->get_results("SELECT cat_ID, category_nicename, category_parent FROM $wpdb->categories WHERE category_nicename = '$leaf_path'"); - - if ( empty($categories) ) - return NULL; - - foreach ($categories as $category) { - $path = '/' . $leaf_path; - $curcategory = $category; - while ($curcategory->category_parent != 0) { - $curcategory = $wpdb->get_row("SELECT cat_ID, category_nicename, category_parent FROM $wpdb->categories WHERE cat_ID = '$curcategory->category_parent'"); - $path = '/' . $curcategory->category_nicename . $path; - } - - if ( $path == $full_path ) - return get_category($category->cat_ID, $output); - } - - // If full matching is not required, return the first cat that matches the leaf. - if ( ! $full_match ) - return get_category($categories[0]->cat_ID, $output); - - return NULL; -} - -// Retrieves category data given a category ID or category object. -// Handles category caching. -function &get_category(&$category, $output = OBJECT) { - global $wpdb; - - if ( empty($category) ) - return null; - - if ( is_object($category) ) { - wp_cache_add($category->cat_ID, $category, 'category'); - $_category = $category; - } else { - if ( ! $_category = wp_cache_get($category, 'category') ) { - $_category = $wpdb->get_row("SELECT * FROM $wpdb->categories WHERE cat_ID = '$category' LIMIT 1"); - wp_cache_add($category, $_category, 'category'); - } - } - - if ( $output == OBJECT ) { - return $_category; - } elseif ( $output == ARRAY_A ) { - return get_object_vars($_category); - } elseif ( $output == ARRAY_N ) { - return array_values(get_object_vars($_category)); - } else { - return $_category; - } -} - -function get_catname($cat_ID) { - $category = &get_category($cat_ID); - return $category->cat_name; -} - -function get_all_category_ids() { - global $wpdb; - - if ( ! $cat_ids = wp_cache_get('all_category_ids', 'category') ) { - $cat_ids = $wpdb->get_col("SELECT cat_ID FROM $wpdb->categories"); - wp_cache_add('all_category_ids', $cat_ids, 'category'); - } - - return $cat_ids; -} - function get_all_page_ids() { global $wpdb;