WordPress: Conversational Categories
A friend asked if there was a way for WordPress to display the categories under which an entry is filed in the following way:
Single category: Category1
Two categories: Category1 and Category 2
Three categories: Category1, Category2 and Category3
Four categories: Category 1, Category 2, Category 3 and Category 4
And so forth.
The existing the_category() function has no way of telling how many categories there are, and so can’t do something fancy like inserting the word “and” between the penultimate (second-to-last) and ultimate categories. So I just made a plugin with a new function called the_nice_category().
Download
WordPress Nice Categories Plugin (WP 1.5.1 and above)
Instructions
Go ahead and save this text as a file with a “.php” extension, and drop it in your plugin folder. After activating it, you will be able to use a new function in your WordPress template. The function is the_nice_category(). You will replace the instance of the_category() with the_nice_category() in the “posted” section of your main index file.
the_nice_category() takes two optional parameters. The first is the text string to appear between categories when the category on the right isn’t the last category. This defaults to “, ” (a comma and a space). The second parameter is the text string to appear between the penultimate category, and the last category. This defaults to ” and ” (the word “and” buffered by spaces.)
If you wanted to display your categories like the default, but with double quotes around them, you would use this code:
"<?php the_nice_category(', "', '" and "'); ?>"
Notice that you need to place quotes on either side of the_nice_category(). This is to put the quotes at the beginning of the first category, and at the end of the last category.
Notes
Also, if you want to determine if there are multiple categories, you can do so by using count(get_the_category()).
This code will output “Category: ” if there is only one category, and “Categories: ” if there are more than one.
<?php if (count(get_the_category()) > 1) echo 'Categories: '; if (count(get_the_category()) === 1) echo 'Category: '; ?>
Versions
- version 1.5.1, updated for WordPress 1.5.1 compatibility.
- version 1.5, updated for WordPress 1.5 compatibility.
- version 1.1, merged in updated WP 1.3 the_category() code (only change is that it won’t throw out an error if there are no categories for that entry). Should work fine with WordPress 1.2 as well.
- version 1.0, the initial release.
Conversational categories
That Mark Jaquith is awright! I mentioned in the WordPress forums and also during our “not often enough now that he has a real life” online chats that I’d like to make the display of a post’s categories more like conversational English.
Well, wa…
Is there any way to display only subcategories with this? I don’t want to display the parent categories.
[...] st’s categories more like conversational English. Well, waddaya know? He whipped up a plug-in to do just that. Works pretty spiffy, if I do say so. If you like it, [...]
It doesn’t show parent categories. It only shows subcategories.
I’m sorry. I didn’t clarify myself. If I have both the parent category ticked and the subcategory ticked, is there a way to only show the subcategory name and not the parent name?
The reason I ask this is that I have all posts categorized with subcategories, but I want the parent categories to show a total of them in my post count on my category list. The only way of doing that was to tick both the parent and the subcategory.
FYI, I just noticed you have a tick box that doesn’t move down with your “Comment Preview” field, when it moves down to accomodate lengthy comments (like this one). It is the “Do not save my info” tick box. You might want to take a look at that. I’m using IE to view this.
Hey I got it to work
Something else I found, in trying to edit all of my posts…
Choosing “All” from the Show Posts From Category dropdown produced no posts, while choosing “None” from that same dropdown produced all of my posts. Shouldn’t it be the other way around?
BTW, what is “None” for anyway? Is it possible to have a post that is not assigned to a category with WP?
#5: Thanks for the bugreport. IE was doing something funky with the JS. Fixed now.
#7: What’s the Show Posts From Category dropdown? I’m assuming it’s a plugin you’re using. And yes, that does sound strange acting as it does. As far as I can tell, it is impossible to have an entry that is not in a category (defaults to “General”).
Oh no! I can’t believe I posted that comment - to the wrong website! I was trying to get the Batch Category Editing For WordPress hack to work, so I could get rid of the posts’ parent categories. That was so that I could clean up the category displays for each post, while using this plugin. Sorry for the confusion.
Unfortunately, I made another mistake. When I removed the parent categories for posts, the subcategory posts dropped out of the category dropdown on my index.php file. I had to put them all back to where they were.
So, I’m between a rock and a hard place. I don’t want the parent categories displayed under the heading of every post, just the subcategories. But, if I get unassign them from the posts, they won’t appear in the category dropdown.
Is there any other way?
Yeah. Upgrade to WordPress 1.3 The function that gets the categories is broken in 1.2 I got it to work by doing a “selective upgrade” of that function.
See here: mosquito.wordrpress.org report
“selective upgrade”Â?
Basically just upgrading that function. So while your WP install would still be technically 1.2, it’d have the upgraded 1.3 version of that function. You can’t always upgrade a function without adding other functions, but a lot of the time, it is a self-contained upgrade.
How did you do that? The URL in that comment, #10, is broken.
Beautiful plugin. Installed in seconds and worked like a charm first time out.
I got a problem after installing this plugin. It shows up fine. but when i click on login, it show, headers are already sent from ‘nicecategories.php’
do u face this problem any time ?
Sadish,
This is a generic error, and not really one related to my plugin. The problem is that plugins are loaded before headers are sent to the browser. If you accidentally leave a space before the beginning
<?phpor after the ending?>, the space gets sent to the browser (normal html). But in order to send that space to the browser, headers need to be sent first, so the browser knows what it’s getting. Then, when WordPress tries to send its custom headers, after the plugins have been processed, it gets an error, because headers have already been sent.So the solution to this problem is to open up
nicecategories.phpand to eliminate any spaces before the beginning<?phpor after the ending?>. Space inbetween the two do not matter, because these are absorbed by the PHP processor, and are not sent to the browser.b)NiceCategories.php The original WP 1.2 gives multiple categories as a list of items. This will change it to one single line of text like “Category1, Category2 and Category3″³ downloaded from : http://txfx.net/2004/07/22/ wordpress-conversational-categories/ c)TimeoftheDay.php The original WP 1.2 displays the time of the post as ‘12:30 AM’. This plugin enables you to specify it as ‘midnight’, ‘morning’ etc. downloaded from : http://www.ifelse.co.uk/archives/2004/08/17/ time-of-day-plugin-v1/
Will you update this plugin for WordPress 1.3? I am in the progress of converting Binary Bonsai to 1.3, and I love this little plugin. Unfortunately it seems to break in the foreach loop under 1.3.
Thanks for the heads-up. I’ll take a look at it tonight.
Updated it. Tested in WP 1.3
The only thing that changed is that it now checks to see if there is no category, and calls it “Uncategorized” if so (which is what the_category() does in WP 1.3 now). Just redownload it using the link above, and you’ll be good to go.
When I view my admin, I get the following problem, printed out at the very top of the page:
Parse error: parse error in /Library/WebServer/Documents/binarybonsai13/wp-content/plugins/nicecategories.php on line 24
For whatever reason, Safari has a problem copying PHP code. I opened Camino instead and copied it. Now it works fine
ingle line of text like “Category1, Category2 and Category3″ downloaded from : http://txfx.net/2004/07/22/ wordpress-conversational-categories/ [...]
rdPress plugin tweaked from wordpress related entries plugin, it also uses portions of the nice categories plugin to list the related posts - comma separated with ‘an [...]
Binary Bonsai was who made me like this plugin. It is one of the nicest plugins avaliable. Thank you for creating this plugin.
I’m a little confused by the line right after the foreach loop:
$category->cat_name = $category->cat_name;That looks like it’s assigning cat_name back to itself, a null operation, rather than doing something useful. Am I missing something here? Is this required for WP1.3 compatibility?
Alderete, it looks strange to me too… but it exists in the WP
the_category()function, so I included it. It may be an issue with variable scope. I’m honestly clueless as to its purpose or lack thereof. Feel free to comment the line out and see what happens.How this weblog is run
As I have been working on this site, I’ve visited quite a few other weblogs run by WordPress, and occasionally see something that I’d like to know how to do myself. A little widget here, a list of related posts there, etc. Cool things, but nothing th…
entries with LiveJournal. It works with the data from the LJ Extras plugin.* MonthArchives: A more tidy way to display archives; seperated by year and grouped by month. View the archives by adding somewhere where the WP headers are included.* Nice Categories: Displays the categories conversationally, like: Category1, Category2 and Category3* Show Category Posts: Creates a $scp_posts global variable containing the posts of the specified categories for use in a WP loop. Creates a $hcp_posts global variable
I have a problem with your plugin. If I activate it, then, when i do a login to wordpress i receive a blank page. I have to access to phpAdmin and change the register of wp_options table to de-activate your plugin to make wordpress login work. My version is 1.2.2 Mingus.
Any solution?
Thanks
Hello.
I had done a search for a plugin or hack like this previously, though obviously not thoroughly enough since I didn’t find this site until lbessant pointed me to it from the thread I started on WordPress’s support forum.
Since your plugin was made ages before mine, I’m ceasing development for mine, but feel free to use any of its code if you want to.
Anibol: As far as I know, my plugin works fine on 1.2.2 Mingus which is the install I run on my blog and off-line. I’m too much of a wuss to be on the bleeding edge with nightly builds. ;-P
Stick around though and I’m sure Mr. Jaquith will help you out in adapting his to work on your install.
Anibol, that error is likely due to white space before the first
<?phpor after the ending?>Make sure that those opening and ending PHP tags are the first and last things in the file you create!
When I upgraded to WP 1.5, the category links broke. Instead of pointing to the category, it points to the category base (in my case /archives/categories).
Any suggestions on how to fix this?
Brad,
Thanks for pointing this out! Looks like they changed the
function right before 1.5’s release. I’ve posted a 1.5 compatible version.get_the_category()get_category_link()[...]
Freedom Envy
February 17th, 2005
Plugin Update
My popular little “Conversational Categories” plugin for WordPress was broken by some c [...]
I run Wp 1.5. When I activate the plugin I get this printet at the top of my admin header:
Whats going on?
I chekked to se if the code was correctly copy/pasted - it was.
Morten, see comment #30. You likely have a space after the ending
?>That should be the last thing in the file… any spaces after it will give that error you described.
some nice features in his theme such as live comment previewing, advanced graphical tooltips and it is Google AdSense ready. He also has a Gravatar plugin that will put an author’s image beside their post. It supports Spam Karma, LiveCalendar, Nice Categories , Spelling Checker and WP-CC plugins. On a 10 scale I give it a 9.5.
[...] tatic pages for archives and links. By the way, I also installed another cool plugin named Nice Categories. Okay I am heading to my bed now, please let me know what do you [...]
[...] egory links for posts are broken, Ill have to have a look when I get home. Fixed now, new Conversational Categories plugin for WP1.5. [...]
[...] Its mostly for the sidebar. Category links are working again. I hadn’t upgraded the “Nice Categories” plugin for WP 1.5. I’m not sure how many peop [...]
[...] This version has been tested in both WordPress 1.2.1 as well as WordPress 1.5 Strayhorn. WordPress: Conversational Categories [ Tempus Fugit | TxFx.net ] A friend asked i [...]
[...] ingle line of text like “Category1, Category2 and Category3″ downloaded from : http://txfx.net/2004/07/22/ wordpress-conversational-categories/ [...]
[...] hp and other stuff formally so I couldn’t write my own fucntions… In comes the Conversational categories plugin whose code I used along with the variable listin [...]
Looks like the plugin is broken with the WP 1.5.1 nightlies - it’s doing the same thing it did pre 1.5 (showing the catagory base only).
Thanks Brendan. I really wish that they’d stop changing the
get_category_link()function so much. Try the new 1.5.1 version.It would appear the link is dead.
Oops
Doh! It’s good now.
Excellent, indeed it is. Categories are displaying nicely now. Nice work.
I liked your plugin and was using it quite happily until I upgraded to 1.5.1. The categories still displayed correctly, but instead of linking to the category archive they linked into the base category structure.
Clarification: what I mean is that if my category permalink was like this: “dogblog.com/category/cute-puppies/”, the plugin was linking like this: “dogblog.com/category/”. This resulted in a not found error page for any category link clicked.
Wanted to bring this to your attention so anyone who enjoyed using this plugin in 1.5 can continue to use it in 1.5.1 (like me!)
Orin, there has been a 1.5.1 compatible version available for a few weeks (see above). It sounds like you’re still using the 1.5 version. (I know, it’s a pain that I keep having to release new versions… they keep changing the underlying code on me. I have a new version coming out soon that should be much more future-proof, as well as work without messing with templates.)
Eep!
Absoulutely correct, sir. Shouldna opened my big mouth when there was a solution right before my eyes.
del administrador, el autor de la entrada o usuarios con un cierto nivel de privilegios nunca serán moderados, independientemente de su contenido. Nice Categories : Muestra las categorÃÂas asociadas a la entrada de forma conversacional, en lugar de en forma de lista, por ejemplo:
danae whispering Dark Siren’s Domaine Down On My Knees Life as His Sevian Rei Strays Adopt A Blog Kindlings Labelled with IRCA My Gravatar [IMG] Plugged In Bad Behavior Gravatar LiveCommentPreview Nice Categories Simple Spoiler Etcetera Register Login RSS Comments RSS LiveJournal Syndication Valid XHTML XFN WP
@mark-
i recently downloaded your plugin and received header errors (i checked-no white spaces) when activating the plugin. Odd thing is I received the same error with the heatmap plugin as well. It turns out that downloading the file .phps format threw a bunch of junk into the code as to render it unusable. Of course I can’t say for sure if it is the same problem but since I would like to get this to work could you possibly check this out? Thanks! here’s his comments on it…
garblejunk
Mike, you shouldn’t be downloading the phps file, but viewing it in a web browser and then copy-pasting the text, making sure there is no leading or lagging whitespace. The colorization is indeed done with html markup, but you’ll only get that if you save the file itself or view its source and save that. You should click the link, select all, copy, paste into plain text program, eliminate leading/lagging whitespace, and save with .php extension, and upload as ASCII to your
/plugins/directorysorry mark, that is exactly how i did the first 5 or 6 times and just to make sure, i did it again with same results. i simply copy and paste from browser into notepad, wordpad, dreamweaver (i’ve tried a few) and i just can’t get it to act nice. this is very weird. i’ve looked at the file up and down and can’t see what the problem could be. i can honestly say that with the other plugin when he changed it from a phps file to a txt file for downloading the problem was solved with that one…
oh well, thanks for the reply.
oops! i know you’re a stickler for spelling and i didn’t want to offend!
:redface:
Mike, try this zipped version. There are two versions in there that use different approaches. One is nice because it doesn’t require modification of templates, and the other is nice because it offers better customization. I’m going to merge them together when I have some time, but until then, have at it.
as of this time the link seems to be dead…
Gah! It works now.
got it! thanks1
i’m having problems ftping into my site but i’ll let you know as soon as i can get in.
and now my site has nice categories!
thanks for all the help mark!
additional programs . Flash Player is required for the web client. Live Post Preview - Shows your post as you write it in real time. Nice Categories - Displays the categories conversationally, like: Category1, Category2 and Category3 Go get your wordpress customised! [IMG :)]
» WordPress: Conversational Categories [ Tempus Fugi…
Not much to add, but damn fine plug-in. Works flawlessly and really contributes to the overall design.
Hmm, I just get a
500 Internal Server Error, when I click on any of the plugin links.Barry Price,
Artifact of my server move. It has been fixed since.
[...] Plugin Site: http://txfx.net/2004/07/22/wordpress-conversational-categories/ [...]
[...] 13 | Nice Categories: geef een verzorg lijst van de categoriën van een post weer in plaats van een lijstje waarbij elke item gescheiden is door bv een komma. Zo krijg je lijstjes als: categorie 1, categorie 2 en categorie 3 in plaats van categorie 1, categorie 2, categorie 3. Een plugin voor de puristen. [...]
[...] There is an update on Mark’s site which fixes the problem. Posted: 2005-05-11 21:00:56 # [...]
[...] Nice Categories: Muestra las categorÃÂas asociadas a la entrada de forma conversacional, en lugar de en forma de lista, por ejemplo: CategorÃÂa1, CategorÃÂa2 y CategorÃÂa3. [...]
[...] sadish Member Thanks Everyone, I took the nice category plugin and modified it to just show it as text. I call this as ‘the_text_category’ Its live on http://v2.simpleinside.com. If anyone is interested I can release it as a plugin. Posted: 2004-12-13 21:26:37 # [...]
[...] Plugin Site: http://txfx.net/2004/07/22/wordpress-conversational-categories/ [...]
[...] Nice Categories: Muestra las categorÃÂas asociadas a la entrada de forma conversacional, en lugar de en forma de lista, por ejemplo: CategorÃÂa1, CategorÃÂa2 y CategorÃÂa3. [...]
[...] http://txfx.net/2004/07/22/wordpress-conversational-categories/ [...]
[...] It was Mark Jaquith’s “Nice Categories” plugin. [...]
Collapsible More Link, Transpose Email, Blogs Of The Day, Wayback, Evermore, Search Hilite, Kramer, Referrer Bouncer, Noteworthy Plugin, Popularity Contest, Related Posts, Show Plugins, SimpleTags, SpotPress, Nice Categories
[...] Nice Categories [...]
[...] Conversational Categories [...]
Thanks for the update…I just noticed it wasn’t working correctly under 1.5.1.3 a day or so ago…’preciate it!
[...] - Conversational categories [...]
[...] Conversational Categories [...]
[...] Per Post Comment Text Gravatar Recent Links Textile 2 Improved Nice Categories Posted 5 months ago. ( Permalink ) [...]
[...] Nice Categories [...]
[...] Nice Categories [...]
[...] Nice Categories [...]
[...] Nice Categories mejora ligeramente la función por defecto de WordPress. [...]
Excellent! Thank you!
[...] Nice Categories [...]
[...] Nice Categories [...]
[...] Readable Category. This is essentially my own homegrown version of WP Nice Cetegories (I wrote it before I knew the plugin already existed). Mark Jaquith’s plugin is probably better. [...]
[...] Plugins that I am using now….sometimes they change: wpquotes http://www.zombierobot.com/wp-quotes/ Technorati Tagging Plugin http://boneill.ninjagrapefruit.com/index.php?pagename=wp-tag-plugin&page= WP-Scrobbler http://www.tedpearson.com/blog/?page_id=778 GetWeather http://dev.wp-plugins.org/wiki/GetWeather Get Recent Comments http://dev.wp-plugins.org/wiki/GetRecentComments and I was using TitleImages2 on my other template. The url was here http://chris.coggburn.us/wordpress-plugins/titleimages2/, but I don’t think it is there anymore. I really like this one, but it’s a little hard to configure. Maybe I’ll get around to making it work with my new layout. WP-Nice Categories http://txfx.net/2004/07/22/wordpress-conversational-categories/ (I’m not sure about that URL)_________________ [...]
[...] Tempus Fugit Blog [ Tempus Fugit | ... [ Ã“¢Ò뺺] (tem’pus fyOO’jit), [Latin]: Time Flies. Tempus Fugit Blog. September 18th, 2005. Well, I finally got an iPod through freeipods.com!txfx.net - 155k - 2005Äê9ÔÂ19ÈÕ - ÃøÒ³¿ìÕÕ WordPress: Conversational Categories … [ Ã“¢Ò뺺] (tem’pus fyOO’jit), [Latin]: Time Flies July 22nd, 2004 WordPress: … Pingback from Tempus Fugit | TxFx.net | Plugin Update I run Wp 1.5. When I activate the … txfx.net/2004/07/22/wordpress-conversational-categories - 94k - 2005Äê8ÔÂ31ÈÕ - ÃøÒ³¿ìÕÕ[ ÔÚ txfx.net Õ¾ÄÚ¸ü¶à ÄÚÈà ] Rebrand Democrat [ Ã“¢Ò뺺] June 28, 2005 Author: michaelkpate Created on: June 28th, 2005, 5:03 pm The Aftermath of 9/11rebrand-democrat.txfx.net - 48k - 2005Äê9ÔÂ17ÈÕ - ÃøÒ³¿ìÕÕ[ ÔÚ rebrand-democrat.txfx.net Õ¾ÄÚ¸ü¶à ÄÚÈà ] ÒøÃÓ»¨ÒôÀÖÔÚÃß–¿ìÀÖÎÞ¼«ÃÞ ¹²38λ»áÔ± Ê×Ò³ ÉÃÒ»Ò³ ÃÂÒ»Ò³ ĩҳ Ò³´Î:1/2Ò³ תµ½:µÚ1Ò³ µÚ2Ò³ ID »áÔ± ÃÔ±ð ÃÃ…Ãä Ö÷Ò³ OICQ »ý·Ö µÈ¼¶ 38 Îà éÊ÷ Äà tzstudent@163.com Ì©ÖÃѧÉúÃø … 37 fx Å® txfx@pub.tz.jsrnfo.net 1 36 ³ÂÎÞµà Äà sdjk@sedl.com … dj2588.com/music/UserList.asp - 24k - 2005Äê8ÔÂ9ÈÕ - ÃøÒ³¿ìÕÕ[ ÔÚ dj2588.com Õ¾ÄÚ¸ü¶à ÄÚÈà ] º«¾çÃø-º«¾çÌÖÂÛ-º«¾çÌÖÂÛ-Ȯ慁ÃÔÚÄÄÃÂÔØ Ȯ慁ÃÔÚÄÄÃÂÔØ http://koreatvplay.com liyanhp 2005-05-08 10:18:32 ¸÷λÅóÓÑ:ËÂÖªµÀ»ÆÊÖÅÃÄÜÔÚÄÄÊÕ¿´µ½? ½ð»ÆÉ«µÄÂó×Ókoreatvplay.com(2005-05-08 14:30:41) ìÎÊ,ÿÌ쿴ý¼¯Ì«Ä¥ÈËÃËwww.koreatvplay.com/html/276.html - 7k - 2005Äê9ÔÂ14ÈÕ - ÃøÒ³¿ìÕÕ[ ÔÚ http://www.koreatvplay.com Õ¾ÄÚ¸ü¶à ÄÚÈà ] Photo Matt ” Staticize 2.5 [ Ã“¢Ò뺺] Unlucky in Cards Version 2.5 of the Staticize Reloaded plugin is now available for download. Installation instructions are included in the archive. What does Staticize Reloaded do?photomatt.net/2004/07/26/staticize-25 - 32k - 2005Äê9ÔÂ3ÈÕ - ÃøÒ³¿ìÕÕ[ ÔÚ photomatt.net Õ¾ÄÚ¸ü¶à ÄÚÈà ] Technorati Tag: trackback Currently tracking 17.4 million sites and 1.5 billion links. Sign … Tempus Fugit | TxFx.net ] I must have been half asleep when I first looked at this plugin … http://www.technorati.com/tag/trackback - 33k - 2005Äê9ÔÂ19ÈÕ - ÃøÒ³¿ìÕÕ[ ÔÚ http://www.technorati.com Õ¾ÄÚ¸ü¶à ÄÚÈà ] Outside The Beltway : The Press … [ Ã“¢Ò뺺] Tuesday, April 13, 2004 The Press Conference Posted by James … linked with Post Press Conference Tempus Fugit | TxFx.net linked with My Fellow Americans … http://www.outsidethebeltway.com/archives/5791 - 18k - 2005Äê9ÔÂ9ÈÕ - ÃøÒ³¿ìÕÕ[ ÔÚ http://www.outsidethebeltway.com Õ¾ÄÚ¸ü¶à ÄÚÈà ] pseudorandom: When Does $350 Million … Frank Boosman’s irregular but not infrequent thoughts. January 04, 2005. When Does $350 Million Equal 42 Hours?www.boosman.com/blog/archives/2005/01/when_does_350_m.html - 25k - 2005Äê8ÔÂ24ÈÕ - ÃøÒ³¿ìÕÕ[ ÔÚ http://www.boosman.com Õ¾ÄÚ¸ü¶à ÄÚÈà ] [»î¶¯Ê±¼äÑÓ³¤][Äêµ×Å̵ã]Ó㵸ö¹Ø¼ü´Ê»ØÒäÄãµÄ£²£°£°£´Äê,,, @ … 2001ÄêÊ×´´ÃøÂçÈ˹¤»¥Öú¸ÅÄî,TOMÃƼöÓéÀÖ×ÛºÃÀà ÉçÇø,µçÄÔ½ÌÓý±¨+ÃÂÀËÃøÃƼö·Â³ªÓéÀÖÂÛ̳,GOOGLE¶à ¸öÓéÀÖÀà ¹Ø¼ü×ÖËÑË÷ÅÅλ¾ÓÊ×Ò³,¶à ¼ÒÊ¡Êü¶µç̨սÂÔºÃ×÷ÃøÕ¾www.5find.com/cgi-bin/topic.cgi?forum=1&topic=2469&start=12&show=0 - 122k - 2005Äê8ÔÂ29ÈÕ - ÃøÒ³¿ìÕÕ[ ÔÚ http://www.5find.com Õ¾ÄÚ¸ü¶à ÄÚÈà ] [...]
[...] Conversational Categories [...]
[...] Conversational Categories [...]
[...] Conversational Categories [...]
[...] Nice Categories [...]
[...] Nice Categories [...]
[...] Nice Categories [...]