Continuing my ongoing discussion about using WordPress as a CMS platform, today I would like to discuss themes. One of the really great things about WordPress is the tremendous amount of themes that are available and how easy it is to install and try them out.  I admit to being somewhat of a theme junkie and will download several at a time to see how they would look on one of my sites. If you find you too like to try out new themes it is a good idea to have a practice or dummy site set up with your favorite plugins and some content to see how it all works together. After a while you will find those theme features you really like and also those you do not want on your websites.

To find themes you can google ‘WordPress themes’ and get enough feedback to keep you busy for days. Instead of the google approach I usually go first to the themes section of WordPress.org. As I write this there are 532 themes available for download at WordPress.org.  A great source for new themes is weblog tools collection which highlights a collection of new themes every week or so.These are sources for free themes, premium themes are the subject for another post.

When you are looking for a theme as a CMS application the features to consider are different than for a theme that will be used for a blog. Two features that will be most important for your WordPress website will be the page template (pages will hold most of the content of your site) and the menu system (websites usually need a more extensive navigation system than a blog). To illustrate these points I am going to discuss a couple of sites I have built and why I chose the theme they use.

My first WordPress CMS site was for my wife’s ceramic studio, Pintalo Tu. My search for a theme led mecms-theme to the Drikatruu Jelly theme. The Jelly theme was designed to use as a CMS and gives the beginning WordPress website designer lots tips and directions on how to modify the theme to fit the user’s desires. Besides the very informative website the theme is well documented in the PHP and CSS files to help make many of the typical changes to personalize the theme. I liked the theme for the all white style to highlight the colors in the content. The horizontal menu was fine for the simple nature of the site. One nice feature of the theme is an additional page template without the sidebar.

For my next site I wanted to get away from the typical WordPress layout of header, main column and 1 biz-cardor 2 sidebars. I ended up going with a premium theme from iThemes. The Business Card theme comes with 6 color combinations. The layout of the theme and site is compact and I have used nested pages to guide readers through the site. I like the fact that the entire home page fits on the screen (or close). The picture rotator on the top of the main column is definitely a plus for a real estate oriented site. I would like to have a more robust menu in the side bar and I will be working on that in the near future. You can see how the theme worked out for my site here.

These examples are from the someone (me) who has very little programming knowledge and was able to put together WordPress websites that accomplish my purpose. For a truly top-drawer looking WP based website I suggest finding a designer that specializes in WP to give you something really unique (sounds like another upcoming post).

Finally, before the fun of installing WordPress and trying out a bunch of themes make sure you have a good outline of the content you want on your site and how you want it organized. That will take you a long way to finding the theme that fits the image you are trying to project.

27 Responses to “Themes for WordPress CMS”

  1. Hi

    Juste a note, your link to the theme (http://www.drikatruu.com/) is blocked by Google as a dangerous site – last time I saw that warning it was on a hacked WordPress site so you may want to change the link or let the owner know if you can ?

    Thanks for this site, I’ll keep reading !

  2. Hi!

    Very nice and useful script, thank you. But there is a couple of questions:

    1. I have tried the plugin with different themes and I found that the link on Home there looks like:
    <a href=”/”>
    and as result plugin form the Home-url as (f.E.):
    How can I remove the closing double slash? I should edit the theme’s scripts? Or may be there is proper option for that?

    2. Is it possible to add two different language switches to a theme: one (under the title of post may be) for the post only (which skip a language when translation is missing) and other (in the header may be) to switch through homes of languages?

    And is anywhere a proper manuals/tutorials/instructions for the plugin?

    Thanks anyway! )

    • Well, in previous comment filter here just eat call of get_option(‘home’) in href parameter.

      • Thank you very much for help. : )

        1. I see. Still it is not so systematic solution. There is nice themes which have multiple calls of get_option(‘home’) in different scripts. And to tune it someone should search for all calls and manually replace them with proper one. Auto replace is useless just because there are, f.E., such forms:
        echo get_option(‘home’).’?feed=rss2′
        echo get_option(‘home’).’/sitemap.xml’. And who know what could be else.
        And without the plugin the changed theme will be broken and someone should remember places where he changed code and how, to revert it to previous state.

        But it really works in my case. Thanks! )

        2. I have read it of cource. ) Yes, I can place as many switchers as I want. But there is only one global option which determines either ‘Skip language’ or ‘Link to home of language for missign translations’. And if I select option once all switchers will look the same. Or I miss something. : (
        What I’m trying to do:
        Let’s suppose there is 3 languages, f.E.: English, Spanish, German. Let’s suppose there is a page content translated only to English and Spanish. Then it would be nice if in header would appear all languages: en, es, ge. But in the sidebar (or under page title) only: en, es. So user could see what translations are available (switcher in sidebar), and could able to switch to the proper home of language (if translation in the language is missing for current page – how else he may do it now without changing address manually?). If there is only one switcher with all languages (with option ‘Link to home…’) and if there is a case of ‘missing translation’ user intends to see translation but finds himself on the other page, and it’s not possible to know beforehand where it leads. It’s a bit misleading and annoying. I hope I’m clear…
        Or may be there is another way to show user what translations are available for the current page?

        Don’t think that I scold n grumble! ) I like your plugin very much! Just trying to adjust it to my needs. : )

        • 1) You’re right about having to change the home in multiple places. The problem is, if we hook and change the get_option(’home’) many things, internal in WP core will break. It’s being used in far too many places and functions for us to change it. So, better just change the theme.

          I do a GREP command in Linux to find all occurrences. Windows and Mac also have file content search.

          2) This is something I should add to our todo list. We’ll all passing arguments to the language switcher so that it can be displayed differently in different parts of the page. Also planned is to display as a simple list of names and with country flags.

          When we do that, we’ll also include the option to set what to do when translations are missing.

          Thanks for the idea!

          • Hi!

            1. It seems that get_option is already hooked. Though not in all cases it works. F.E. in the theme Constructor (see: http://wordpress.org/extend/themes/constructor ) there is such code in header.php:



            In functions.php::get_constructor_menu() there is also call of get_option(‘home’).
            But in header.php hook works, in function doesn’t. I don’t see why.

            Proper solution (for slash-problem) is the same output format for hook as for native get_option(‘home’). I mean: ‘domain/path’ not ‘domain/path/’. And there won’t be a problem with other plugins and things in WP, I think.

            Though, the problem common for other plugins too. If user has php-skills to change the theme then this is fastest solution for him now. If has not… I don’t know.

            2. OK. Yes, flags – would be great! : )
            I have solved for myself the problem of separate switchers. The simplest way to do so now is to create 2 different functions. I have worked it out in such manner (may it be useful for someone else):

            (2.0. Do backup of all files which you going to change.)

            2.1. Switcher for all available languages (is there a translation or not):
            a. sitepress.class.php:
            a.1. Copy the function language_selector() and change to this:

            /* //090403 Piyavkin: language selector for all active languages : begin */
            function language_selector_all(){
            $w_active_languages = $this->get_active_languages();

            include ICL_PLUGIN_PATH . ‘/menu/language-selector-all.php’;
            /* //090403 Piyavkin: language selector for all active languages : end */

            Also add in this class constructor the string:

            /* 090403 Piyavkin: begin */
            add_action(‘icl_language_selector_all’, array($this, ‘language_selector_all’));
            /* 090403 Piyavkin: end */

            b. Copy %the_plugin_dir%/menu/language-selector.php to %the_plugin_dir%/menu/language-selector-all.php and change it in such manner:

            <a href=”language_url($lang[‘code’]); ? >”><img src=”” alt=”” title=””>

            (I’ve got the flags from plugin Codestyling Localization (see: http://wordpress.org/extend/plugins/codestyling-localization/ ). They are nice and properly named. I hope the plugin author don’t be offended. I have the CL plugin with the flags on my blog anyway.
            In my case flags had placed in the folder: /wp-includes/images/flags/ , but you can just point to the proper CL folder (if you have the plugin).)

            c. Erase or comment all in %the_plugin_dir%/res/css/language-selector.css and place here such code (or what you need):

            .lang_sel_all {
            font-size: 0; //remove gap under img

            .lang_sel_all a {
            margin: 0;
            padding: 0;
            text-decoration: none !important;

            .lang_sel_all img {
            margin: 0px 0px 0px 5px;
            padding: 0;
            border: 0;

            d. Place in theme’s sidebar.php next code:

            And we have the switcher for all available languages now (each flag-link points to proper homepage).

            2.2. Switcher for current post || page (‘Skip language’ mode; only languages for available translations are visible):

            а. Change %the_plugin_dir%/menu/language-selector.php in such manner:

            <img src=”” alt=”” title=””>
            <a href=””><img src=”” alt=”” title=””>

            b. Add in %the_plugin_dir%/res/css/language-selector.css such code (or what you need):

            .lang_sel {
            font-size: 0;

            .lang_sel a {
            margin: 0;
            padding: 0;
            text-decoration: none !important;

            .lang_sel img {
            margin: 5px 0px 0px 5px;
            padding: 0;
            border: 0;

            c. Place in theme’s single.php and page.php (or where you wish) next code:

            And we have the switcher for current content now (only flag-links for available translation are present).

            PROBLEM: the native SitePress switcher don’t work in loop on home page (though the code for each post in list and for single post is the same). Tested on iNove theme (see: http://wordpress.org/extend/themes/inove ).
            SOLUTION (quite possible that dirty): I have change the function sitepress.class.php::language_selector(). In the first big IF statement [ if(is_singular()){… ] I have added one more section:

            } elseif (isset($post) && isset($post->ID) && $post->ID > 0) {
            /* 090403 Piyavkin: trying to apply for blog loop (list of posts)*/
            /* The same as in case of ‘is_singular()’ (just outer cicle) */
            $trid = $wpdb->get_var(“SELECT trid FROM {$wpdb->prefix}icl_translations WHERE element_id='{$post->ID}’ AND element_type=’post'”);
            $translations = $this->get_element_translations($trid,’post’);

            I don’t know how it affects other parts of theme or plugin, but it works properly yet.

            And voilà! : )
            May be I’m a vandal? ) So, than I severely apologize. )

          • Alas, all php tags (even with spaces) and some html tags was eaten again. : (
            Such a pity!

  3. My site is PHP 5 activated but it gives this error when I try to activate the plugin .

    “SitePress cannot be activated because your version of PHP is too old. To run correctly, you must have PHP5 installed. We recommend that you contact your hosting company and request them to switch you to PHP5.”


    1. Search doesn’t work for translations. Main (English) language only. [The problem.]
    2. Featured Posts (stick to the top, fixed) don’t work for translations. See for details f.E. Igloo theme ( http://bizzartic.com/bizzthemes/iglu/ ).
    3. Is it possible to give to a user rights to edit only selected translations? F.E. author(s) creates blog in one language and everyone (registered) can help with translation into other languages.
    4. Is it possible to translate Blog Title and Tagline (especially Tagline)?
    5. Is it possible to switch language of Admin to?
    6. If contributor make a post and its translation, and place it as a Pending Review. And if admin publish only one of the posts and other stay Pending. Than there’ll be a situation when on published post SitePress switcher display both languages – for published post and for its hidden translation. And if a user tries to select language for hidden (pending) post he’ll get the message ‘no such one’ (something like).
    7. All available translations (irrespective of current active language) appear In blocks like Random/Recent Posts. See f.E. themes Igloo (above) or iNove ( http://wordpress.org/extend/themes/inove ).

    From above points really crucial the search issue I think. Can you give me some advice or solution?
    Thanks in advance!

    • Hi Piyavkin,

      Your help is extremely useful. We’ll first handle the “bug” items (1 and 2). I hope that we can also hook to catch the Randon/Recent posts. These will go to the next minor release very soon.

      Translation for blog title and tagline clearly need to be done too. We’ll check how to do them. I think that we’ll need to create some sort of String Translation mechanism for things like that (much like exists in Drupal). I’m not sure how long this will take, but we’ll certainly add it. This will also serve to translate things like the Text Widget and other small texts that your site produces.

      We’re also planning to include admin language selection per user. It will come next.

      And, I’ll also add your suggestion for the per-language admin privileges.

      • The plugin is really good, and it will be better. Glad to assist in somewhat.
        BTW, is the plugin an open source software? I don’t see any license.
        Is there OSS comunity?

        • Hello? )
          What about some simple forum here? It’s extremely inconvenient to discuss technical matters without ability to post code and screenshots (links) (if necessary).

    • Hi Piyavkin,

      I’ll need just a little more clarification on the problems you reported.

      re: #1 – It doesn’t seem that you have the plugin activated right now on http://bizzartic.com/bizzthemes/iglu/, but I’m assuming that the problem might be from using a custom search form. The ‘action’ attribute for the ‘form’ tag needs to correspond to the current language. If you use the url for the ‘action’ attribute will include the language parameter.

      e.g. <form method=”get” id=”searchform” action=”<?php bloginfo(‘url’); ?>/”>

      re #2. – the problem I’m seeing is that sticky posts show on all languages rather just on the language they are on. Is this what you’re seeing too?


      • Hi Mihai,

        1. It solves the problem. Thanks! : )
        There was a bloginfo(‘home’) in my case. I have tried the plugin with different themes, including such as the Igloo, iNove ( http://wordpress.org/extend/themes/inove ), Gear ( http://wordpress.org/extend/themes/gear ) and Fusion ( http://digitalnature.ro/projects/fusion/ ), etc. with the same result.

        2. No, posts on all languages in boxes like ‘Recent Posts’ is another problem (see # 7).
        In Igloo News Options is such option ‘Display Featured Posts’. You can select a category and posts of the category will be shown as sticky. You able to select only categories in English. And thereafter you’ll see the posts of the category as sticky, but only for English. For translations this don’t work. The same is true also for very useful options ‘Breaking News’ and ‘Videos’ in the theme.

        • If you use directory for each language and not domain bloginfo(’url’) does not solve the problem for the search engine…

          Instead I have made the following “patch”

          in wp-includes/general-template.php modify the function get_bloginfo :

          case ‘short_language’:
          $output = get_locale();
          $short_language = explode(“_”, $output);
          $output = $short_language[0];

          and then in wp-content/themes/inove/templates/header.php you can do

          <form action="//” method=”get”>



    When you add post via standard page (Add New) – all OK. But something is going wrong if you use an ‘automatic’ posting (via scripts).
    Have you tested the plugin with f.e. standard PressThis?
    I have tried the PressThis and FeedWordPress (RSS to WP – I really need it or something like). What has happened:

    I have f.e. few languages (Eng and other). I’ve created category Country-name and its translation category.
    If I add new post in English via f.e. PressThis:
    I add via PressThis new post (categories in English only are available; select proper category). Save Draft. The post appears in All Languages. Do Edit and select: language=English; Publish. Post appears in English (in the same category).Do Edit: All Categories block is empty now (!). Do Translate (show) and select other (nonenglish) language. Create new post: proper language is selected by default, all categories in proper language are visible – are OK here. Select proper category, do Publish. New post (translation) appears in proper langage.
    It’s work, except that there no ability to change or select more categories (empty All Categories block in first (eng) post Edit).

    If I add new post in other language via PressThis and add English translation to the post:
    I add via PressThis new post (categories in English only are available; select nothing). Save draft. Post appears in All Languages, under category Uncategorized in English by default (!) (it is indicated in the list). Do Edit (All Categories block is empty (!)) and select: language=nonenglish (All Categories block refreshes and all categories in proper languages appear there); select proper category; Publish. Post appears in nonenglish section (in the proper category).Do Edit: All Categories block is empty now (!); language switcher indicates ‘English’ (!). On front-end the post appears on nonenglish page and switcher in the list indicates nonenglish translation, but link points to nowhere (on nonexistent English version: language selector in URL is missing and page 404 as result) (!). Again as before select proper language and category; press Update. Nothing changes (!). Do Translate (show) to create English translation and see that there is no English but there indicated nonenglish translation link (on the edit page where I am now) (!). Delete the post.

    I add via PressThis new post (categories in English only are available; select nonenglish category). Save draft. Post appears in All Languages, in proper category but in English (it is visible in the list). I’m going to change language. Do Edit (All Categories block is empty except one selected in PressThis (!)). There is 2 possibility: 1) to unselect category first, and then to change language; 2) to keep the category selected and to change the language. In first case the post will be placed into Uncategorised and I review it before. Do 2nd choice. Select: language=nonenglish (All Categories block refreshes and all categories in proper languages appear there); select proper category; Publish. Post appears in nonEnglish (in the proper category).Do Edit: All Categories block is empty now except one unselected category in English which one was selected in PressThis (!); language switcher indicates ‘English’ (!). On front-end the post appears on nonenglish page and switcher in the list indicates nonenglish translation, but link points to nowhere… And so on as before. Delete the post.
    But there one more oddity now. The category in English which was selected in PressThis disappears from English categories on Categories page, but is normally visible in All Languages section of the page. In a proper place in English categories tree. %( Do edit: language selector indicate English, Translations (show) indicate nonenglish translation (All OK). Select English and press Update. Category counter in English’ve increased, but there is no the category in the list (!). ‘All Languages’ / ‘Edit’ again, and select another nonenglish language (noneenglish2), Update. Category counter in English have not decreased, in nonenglish2 – have increased, but there is no the directory in nonenglish2 list (!).
    ‘All Languages’ / ‘Delete’: both counters have decreased, the category disappears from All Languages. But first nonenglish translation category left over in nonenglish section. Do Edit; Translation (show) indicates:
    English n/a ‘Catchable fatal error: Object of class WP_Error could not be converted to string in /home/***/www/***/www/wp-content/plugins/sitepress-multilingual-cms/menu/category-menu.php on line 28’ (the link to: ‘http://***/wp-admin/%3Cbr’).
    Other active languages are missing.

    Something like that occurred with the FeedWordPress. There was such mess that I was reluctant to delete all the posts, alas.

    P.S. The same occurs even if post have been created via standard Add New page and you’re trying to change language (it seems that auto-posting features have nothing to do with it). The replacement of a language is in somewhat going wrong.

  6. Hi, I’ve got a serious problem related to your plugin and Igloo News Theme:
    Navigation switcher (pages) is missing from the main page (html class Navi).

    When I switch plugin off the problem disappears. When I switch it on it comes again.

    It would be great to see some workaround here 🙂