[wp-trac] [WordPress Trac] #6952: non-latin category names not
alpha sorted (broken in 2.5.1)
WordPress Trac
wp-trac at lists.automattic.com
Fri May 9 22:32:13 GMT 2008
#6952: non-latin category names not alpha sorted (broken in 2.5.1)
--------------------------+-------------------------------------------------
Reporter: jeremyclarke | Owner: jeremyclarke
Type: defect | Status: new
Priority: normal | Milestone: 2.5.2
Component: General | Version: 2.6
Severity: normal | Keywords: has-patch
--------------------------+-------------------------------------------------
This is a wierd one, but the revamping of the category code to use the
Walker class in 2.5.1 broke the alphabetical sorting of categories for my
arabic editor (seperate site in arabic with translations of english
content). We have more than 200 categories in a hierarchy, so it is vital
that authors be able to scan quickly to find categories without reading
each one.
In all previous versions it worked fine, but at 2.5.1 there was no
discernible sorting of category names. I tracked it down to the removal of
the sort_cats() function, which was used with usort() to sort the
categories array alphabetically inside the get_nested_categories()
function. It uses the strcasecmp() php function to compare the names which
seems to work in all cases at sorting Arabic (my Bangla editor confirmed
that Bangla is also affected, there must also be others).
Right now the get_terms() function is supposed to deal with the sorting
using the 'orderby' argument and feeding that to the SQL so that the
results are already sorted (~line 595 wp-includes/taxonomy.php).
Unfortunately, for my setup (which worked before), Arabic category names
just don't get sorted by name. I am using mysql version 5.0.22 and the
collation of the whole DB is utf8_unicode_ci, it's possible that a
different setup would fix the problem, but I think that having it work on
a standard setup by default it a very good idea (tested it on a centos
private server and on Dreamhost with same results).
Now, I can write a quick bit of plugin code to hook into
apply_filters('get_terms', $terms, $taxonomies, $args);
and run the sorting function myself on the categories, but it seems to me
that it would be a lot more user-friendly to make this part of core so
that users (especially Arabic users, who are way less likely to be able to
wade through forums and trac to find out why their categories are randomly
sorted) don't even have to think about it, it should just work.
As a point of consideration, I think it would be foolish to let a plugin
called "Make Non-Latin Category Names be Sorted on Write Screen" even
exist.
My patch creates the _usort_terms_by_name() function to do the sorting. It
seems to be exactly what is needed. I set the actual sorting to happen
near the end of &get_terms() before the $terms array is reset but after
empty terms are removed, obviously it only does the sorting if the
$args['orderby'] value is 'name'. If you guys think it should happen
elsewhere no beef by me, though it seems that somewhere in get_terms() is
the best idea so that other times when it's called the same effect is felt
(like a sidebar list, which should also be alphabetical if that was
requested). If the position of the sort in get_terms() seems unelegant we
could instead do an add_filter('get_terms') around line 595 when we're
already going through the $orderby value, but the effect will be the exact
same (let me know if you'd like another patch in that format). Here's the
basic code:
// Resort by name in PHP in case SQL didn't (for non-latin
alphabets)
if ( 'name' == $args['orderby'] )
usort( $terms, '_usort_terms_by_name' );
Any thougts, scoldings welcome. Sorry to reintroduce bloat, but I think it
would be valuable for all the international WP users.
(it would be great if this could go into 2.5.2 as it's pretty non-
destructive and basically reverts a behavior from <2.3.3
--
Ticket URL: <http://trac.wordpress.org/ticket/6952>
WordPress Trac <http://trac.wordpress.org/>
WordPress blogging software
More information about the wp-trac
mailing list