From b127cd82af1e6f0d41f4a91e1c8af3c4c39fbfde Mon Sep 17 00:00:00 2001 From: Ryan Boren Date: Fri, 28 Oct 2005 01:14:57 +0000 Subject: [PATCH] Use full hierarchy when resolving category URIs. fixes #1787 Props: ringmaster Owen git-svn-id: https://develop.svn.wordpress.org/trunk@2968 602fd350-edb4-49c9-b593-d223f7449a82 --- wp-includes/classes.php | 32 ++++++++++++++++++++++---------- wp-includes/functions.php | 13 +++++++++++-- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/wp-includes/classes.php b/wp-includes/classes.php index 7f46c43e08..deab5fff75 100644 --- a/wp-includes/classes.php +++ b/wp-includes/classes.php @@ -434,20 +434,32 @@ class WP_Query { // Category stuff for nice URIs + global $cache_categories; if ('' != $q['category_name']) { - if (stristr($q['category_name'],'/')) { - $q['category_name'] = explode('/',$q['category_name']); - if ($q['category_name'][count($q['category_name'])-1]) { - $q['category_name'] = $q['category_name'][count($q['category_name'])-1]; // no trailing slash - } else { - $q['category_name'] = $q['category_name'][count($q['category_name'])-2]; // there was a trailling slash - } + $cat_paths = '/' . trim(urldecode($q['category_name']), '/'); + $q['category_name'] = sanitize_title(basename($cat_paths)); + $cat_paths = explode('/', $cat_paths); + foreach($cat_paths as $pathdir) + $cat_path .= ($pathdir!=''?'/':'') . sanitize_title($pathdir); + + $q['cat'] = array_reduce( + $cache_categories, + create_function('$a, $b', 'return ($b->fullpath == "'.$cat_path.'") ? $b->cat_ID : $a;'), + 0 + ); + + // If full path not found, look for last dir as category ignoring parent + if($q['cat'] == 0) { + $q['cat'] = array_reduce( + $cache_categories, + create_function('$a, $b', 'return ($b->category_nicename == "'.$q['category_name'].'") ? $b->cat_ID : $a;'), + 0 + ); } - $q['category_name'] = sanitize_title($q['category_name']); + $tables = ", $wpdb->post2cat, $wpdb->categories"; $join = " LEFT JOIN $wpdb->post2cat ON ($wpdb->posts.ID = $wpdb->post2cat.post_id) LEFT JOIN $wpdb->categories ON ($wpdb->post2cat.category_id = $wpdb->categories.cat_ID) "; - $whichcat = " AND (category_nicename = '" . $q['category_name'] . "'"; - $q['cat'] = $wpdb->get_var("SELECT cat_ID FROM $wpdb->categories WHERE category_nicename = '" . $q['category_name'] . "'"); + $whichcat = " AND (category_id = '" . $q['cat'] . "'"; $whichcat .= get_category_children($q['cat'], " OR category_id = "); $whichcat .= ")"; } diff --git a/wp-includes/functions.php b/wp-includes/functions.php index 34ae916abb..8bb188d231 100644 --- a/wp-includes/functions.php +++ b/wp-includes/functions.php @@ -1319,8 +1319,17 @@ function update_post_caches(&$posts) { function update_category_cache() { global $cache_categories, $wpdb; if ( $dogs = $wpdb->get_results("SELECT * FROM $wpdb->categories") ): - foreach ($dogs as $catt) - $cache_categories[$catt->cat_ID] = $catt; + foreach ($dogs as $catt) + $cache_categories[$catt->cat_ID] = $catt; + + foreach ($cache_categories as $catt) { + $curcat = $catt->cat_ID; + $cache_categories[$catt->cat_ID]->fullpath = '/' . $cache_categories[$catt->cat_ID]->category_nicename; + while ($cache_categories[$curcat]->category_parent != 0) { + $curcat = $cache_categories[$curcat]->category_parent; + $cache_categories[$catt->cat_ID]->fullpath = '/' . $cache_categories[$curcat]->category_nicename . $cache_categories[$catt->cat_ID]->fullpath; + } + } return true; else : return false;