Nov 17

Tagged in: Comments:Add

Building Custom WordPress Theme

This is the Chapter II of the Complete WordPress Theme Guide series. This chapter will show you how to build a custom WordPress theme. Although the Codex site provides very good documentations on how to create a theme, but I find it too complicated for a beginner. In this tutorial, I will explain the basics of how WordPress theme works and show you how to convert a static HTML template into a theme. No PHP skill is required, but you need Photoshop and CSS skills to create your own design.

1. The Blog Frontend

Before you start, let’s take a look at the WordPress default theme and see how it is structured. Take note of the elements (header, post title, search form, navigation, footer, etc.).

default homepage Default Frontpage (index.php)

default homepage Default Single (single.php)

2. Photoshop Mockups

Based on the information gathered from the default theme, design a Photoshop mockup of your blog. Here I’m using GlossyBlue, one of my free WordPress themes, as an example. Download the demo.zip to see the Photoshop file.

default homepage

3. HTML + CSS

After the PSD design is done, create a static HTML+CSS template of each page. You can use my GlossyBlue HTML files in the demo.zip to follow this tutorial. Extract the zip and take a look at the index.html, single.html, and page.html. Later in the tutorial, I will use these HTML files and convert them into a theme.

default homepage

Why Create a Static HTML File First?

Mainly because it will make the development process a lot easier. I usually create a HTML file for every template that I need, test it across all browsers, validate both HTML and CSS markups, then all I have to do is cut & paste the WordPress code. By doing so, I don’t have to worry about HTML or CSS bugs during my theme making process.

4. How WordPress Theme Works

If you go the default theme folder (wp-content/themes/default), you should see many PHP files (called template file) and one style.css file. When you are viewing the front page, WordPress actually uses several template files to generate the page (index.php << header.php, sidebar.php, and footer.php).

how theme works

For more details, check out Site Architecture and Template Hierarchy at Codex.

5. Duplicate The Template Files

Copy the GlossyBlue HTML folder into the wp-content/themes folder. Then, go to the default theme folder, copy the comments.php and searchform.php file to the glossyblue folder.

copy files

6. Style.css

Go to the WordPress default theme folder, open the style.css file. Copy the commented code at the top and paste it to the GlossyBlue style.css file. Change the theme name and the author information as you desire.

theme name and author's information

7. Splitting The Files

Now you need to understand where to split the file into several files: header.php, sidebar.php, and footer.php. The image below shows a simplified version of my index file and how the markups should split.

splitting files

8. Header.php

Open the index.html file. Cut from the top to where the <!--/header --> ends, paste it in a new PHP file, and save the file as header.php.

header code

Go to the default theme folder, open the header.php. Copy and replace the tags where it requires PHP code (Template Tag): <title>, <link> stylesheet, <h1>, and <div class=description>.

replace code

Navigation Menu (wp_list_pages)

Replace the <li> tags in the <ul id=nav> with <?php wp_list_pages('sort_column=menu_order&depth=1&title_li=');?>

replace code

Reference: wp_list_pages.

9. Sidebar.php

Back to the index.html file, cut from where the <form id=searchform> start to the closing tag of <div id=sidebar> and paste it in a new PHP file, save it as sidebar.php.

  • Replace the <form id=searchform> wrap with <?php include (TEMPLATEPATH . '/searchform.php'); ?>.
  • Replace the category <li> tags with <?php wp_list_categories('show_count=1&title_li='); ?>
  • Replace the archive <li> tags with <?php wp_get_archives('type=monthly'); ?>

sidebar

References: wp_list_categories and wp_get_archives.

10. Footer.php

Back to the index.html file, cut from the <div id=footer> tag to the end of </html> and paste it in a new PHP file, save it as footer.php.

footer

Recent Posts

Here I used the query_post to display the 5 latest posts.

recent posts

Recent Comments

Recent comments are generated by a plugin (included in the theme folder).

recent comments

11. Index.php

Now in your index.html file, you should only have the <div id=content> wrap. Save the file as index.php. Insert the line:get_header, get_sidebar, and get_footer in the same order as your layout structure.

index

12. Understanding The Loop

The image below illustrates how The Loop works. The Loop is used to display blog posts and it also lets you control what to display. Basically, The Loop checks if there are posts in your blog, while there are posts, display it, if no post found, say "Not Found".

the loop

13. Copy The Loop

Go to the default theme folder, open the index.php file. Copy The Loop from the default index.php and paste it in between the <div id=content>..</div>. Then, replace the static text with the WordPress Template Tags: post date, title, category, comments, next and previous link.

the Loop

14. Preview The Theme

Congrats! You’ve done the front page (the main part of the theme). Now, login to your admin panel, go to the Design tab, you should see the GlossyBlue theme, activate it and go to the front page to preview the theme.

15. Single.php

Now, it is time to do the single.php template. If you want, you can go through the same process — cut & paste from the default theme. But, I find it easier to use the index.php that you just created and save it as single.php. Open the default theme single.php file and copy the Template Tags over. Then include the comments_template. The image below highlights what I’ve changed:

single.php

16. Page.php

With the single.php template you just created, save it as page.php. Remove the post date, comment form, next/previous link… and that’s it.. there goes your page.php template.

17. Delete The HTML Files

Delete all the HTML files in the glossyblue folder (we don’t need them anymore). Technically, that is enough for a basic WordPress theme. You may notice there are more PHP files in the default theme. Well, you don’t really need those files if you just want a basic theme. For example, if the search.php or 404.php is not present in the theme folder, WordPress will automatically use the index.php to render the page. Read the Template Hierarchy for more details.

18. WordPress Page Template

Ok, final example. I will show you how to use Page Template to create an archive page that will list all posts on your blog (good for sitemap). Copy the archives.php file from the default theme folder. Delete the unwanted code and you should have something like this:

Archives template

Here I’m using the query_post (showposts=-1 means display all posts) to display a list of all posts.

Archives query posts

Now, login to your admin panel, write a new page, title it Archives. On the Page Template dropdown, select Archives.

Archives page

More Reading:

Check out a list of WordPress Plugins that you may find useful. For more advance theme coding, read my WordPress Theme Hacks.

What’s Next…

In the next chapter, I will show you how to export your local WordPress to a web host and keep the local version for backup purpose.

Delicious Stumbleupon Digg

Installing WordPress Locally Exporting and Importing WordPress

Comments

Pages: 15 14 13 12 11 10 9 8 7 6 51 » Show All

There are 148 comments (+Add)

  • 148 Frank Barrera Jr http://www.frankspointofview.com

    Thanks for the detailed information! Let’s see if I can do it!

  • 147 Fiona http://sugoi.ws

    You have encouraged me to make my own Wordpress them. Thank you so much for the details tutorial.

  • 146 vncomet

    How to add banner ads to two sides that are outside the content table?

    I have a question: How to add banner ads to two sides that are outside the content table.
    Look at this blog: http://www.spunk-ransom.com/. This blog has 2 sides that are obviously outside its content table.

    I don’t know if my question is clear. The thing I want is to add banner ads to such 2 sides. Here is a good example of what I mean: http://nhacvietplus.vietnamnet.vn/vn/index.aspx

  • 145 ali http://www.didimtoday.com

    Very clear, l will try it soon

  • 144 Felipe

    It encouraged me to make a wordpress theme.

    And, I’d really made a wordpress theme.

    Thank you!

  • 143 Roald André Pedersen

    I dont understand this. :( I am totally new to this, is this the most basic? :S

  • 142 abhijit http://www.abhijitdutta.com

    in the footer section, some images have the right side part chopped off. This makes it difficult to use them. I tried the footer.php file of the default theme, but there I found only the wp_footer() function called.

  • 141 Jengly

    THANK YOU!

  • 140 Grégoire Noyelle http://www.gregoirenoyelle.com

    So great. Thanks you ! I just wonder how to improve this part of my work !
    Grégoire

  • 139 factotum218 http://designingcrap.com

    Great in depth tutorial. Being someone who is going from a few years of desktop publishing and pursuing and interest in web development I want to use something like Wordpress or Joomla! not only as a tool to get results, but to also get a good understanding of how to work with php and javascript.
    Eventually I would love to be someone fluent enough to consider myself a hobbyist AJAX developer. Who knows where I will really end up. Probably cold and alone still trying t decide whether I want to use Linux or Windows as my platform because I’m to old and still too broke to get a Mac. But I digress.

    Great post, very informative.

Pages: 15 14 13 12 11 10 9 8 7 6 51 » Show All

Post Your Comments

(required)

(required)

Comment Guidelines

  • Please keep comments related to topic. And be nice, don't spam!
  • Basic HTML tags are allowed:
    <a href> <abbr> <acronym> <blockquote> <code> <em> <strike> <strong>
  • Note: un-related or spam comments will be deleted.

Live Comment Preview

Advertise Here
advertisement

Back to top