Step by Step guide to Write your own WordPress Template (original) (raw)
Last Updated : 11 Jul, 2025
Writing your own WordPress template from scratch is fairly simple. If you are into Web Development industry, you might've already heard what "WordPress" is. Maybe a client has mentioned, but you're not familiar with it. Maybe you've already worked with it before, but don't know how to make a theme from scratch. Or maybe you're a complete newbie. Whatever is the case, this post is for you.
**Prerequisites:
Before we begin, you'll need to fulfill the following set of requirements.
- You need to have a fully fledged WordPress setup, either on localhost or live hosting. If you want to learn more about starting with WordPress, refer to this article.
- A conceptual design, either as PSD or HTML CSS to follow throughout the development process.
- A little introduction to PHP programming. However, it's not a necessity for this particular post but still recommended.
**Scope
Designing a WordPress theme is a long, tedious, never ending but a great programming challenge. The development process depends entirely on how you want your theme to look like. This post is just a tutorial and does not cover all the bits and pieces required for a standard WordPress theme. After going through this article, you have to heavily rely on
and
for your further queries.
**Getting Started
With the prerequisites in mind, let's get started. The very first thing you need to know is the fact that almost everything you do in WordPress is inside the
wp-content
directory. Everything else is the WordPress CMS itself and you don't want to mess with that. When you'll open
**wp-content -> theme
directory, you'll find default WordPress themes, like
_twentyfifteen, twentyfourteen, twentythirteen
, etc. To start with one of your own, create a directory with whatever name you prefer. For this post, we'll call it
**wpstart
.
A WordPress theme atleast needs two files to exist - **style.css and **index.php
So go into
**wpstart
folder and create these two files. In
**style.css
, insert the following comment. This tells the WordPress dashboard about the theme details and meta information.
CSS `
/* Theme Name: WP Start Author: FedUser Description: A bare bone WordPress theme Version: 0.0.1 */
`
Now switch to your WordPress dashboard, and click on
**Appearance > Themes
. You'll find
**WP Start
in your theme collection.

Go ahead and activate this theme, and then visit the site. And Voila! You've technically created a custom theme, all by yourself. Of course, it doesn't do anything except it has a blank white screen. This is where
index.php
comes into action. Open
**index.php
in text editor and write in the following code.
html `
This is a sample WordPress theme.
`
Visit the site once again and get your first WordPress template up and running.
Divide and Conquer
To develop a standard WordPress theme, you need to divide all your work into sections. This is not necessary, as you can do everything in
index.php
, but a good programming practice involves modularity. For this particular post, we will divide our entire work into
_four
sections, viz. header, footer, sidebar and content. Corresponding to these sections, we will create four different files, namely
header.php
,
footer.php
,
sidebar.php
and
content.php
.
- **header.php: For this particular example, this file will do the following;
- Define all the meta and link tags inside
<head>for HTML. - Display site branding like name and description.
- Provide navigation to different pages.
With these points in mind, let's code our theme header. html ` WP Start
- Define all the meta and link tags inside
Archives
Sample Title
Sample text goes here.......
Integration
Now let's move back to the
index.php
where we will integrate all the above sections into one. As this file is an entry point for our theme, we can cleverly choose to put these sections. Here's how I've done it.
html `
`
The
_php
excerpts used here are self explanatory.
get_header(), get_sidebar()
and
get_footer()
are predefined functions used for embedding corresponding sections. For a custom section like
content.php
, embedding is done by the following code;
**style.css
: Now that we have updated our
index.php
file, let's add some charm with
**CSS
.
CSS `
/* Theme Name: WP Start Author: FedUser Description: A bare bone WordPress theme Version: 0.0.1 */
nav.navbar .navbar-brand .site-branding { margin: 0; }
footer.site-footer { background-color: #502550; color: #fff; padding: 40px 0 20px 0; }
footer.site-footer a { color: #fff; }
`
And Voila! The first look of your custom WordPress theme is ready.

**The Loop
This is the most exciting part of the entire WordPress theme development where you have control of all the posts.
is a functionality with which you can dynamically insert content into your theme. Our aim in this tutorial is to present all the blog posts as a user-friendly list so that the reader can choose any one of them. Let's see how we do it. The loop itself is self-explanatory.
php `
`
IF there are any posts, WHILE there are none left, DISPLAY them. Anything inside this loop will be repeated, till the page runs out of all the posts. We can use this concept to display our list. Here's how I have done it.
html `
<?php if( !is_single() ): ?>
<a href="<?php echo esc_url( get_permalink() ); ?>">
<?php the_title(); ?>
</a>
<?php else:
the_title();
endif; ?>
</h3>
<p class="post-meta">
<?php the_date(); ?>
by <a href="#">
<?php the_author(); ?>
</a>
</p>
<?php if( !is_single() ): ?>
<a href="<?php echo esc_url( get_permalink() ); ?>">
<?php the_title(); ?>
</a>
<?php else:
the_title();
endif; ?>
</h3>
<p class="post-meta">
<?php the_date(); ?>
by <a href="#">
<?php the_author(); ?>
</a>
</p><?php if( !is_single() ):
the_excerpt();
else:
the_content();
endif; ?> `
And changed the
**index.php
to this.
html `
the_post();
get_template_part( 'content', get_post_format() );
endwhile;
endif;
?>
</div>
<div class="col-md-3">
<?php get_sidebar(); ?>
</div> `
Let's look at what just happened! The Loop in
**index.php
is calling the
**content.php
everytime the page has a post. Inside
**content.php
, I've checked if the current post
**is_single()
. This condition will hold true if the current page contains only a single post to loop through. When it is not single, I wanted a link to that post via its title. So I used
**get_permalink()
to get the url of that particular post. However, if the page is single, there is no need of a link and therefore, I've used only
**the_title()
function. Moving on to the meta info of the post. I've displayed
**the_date()
on which the article was published and its
**the_author()
. Finally, I've used the same concept of
**is_single()
to either display
**the_excerpt()
or
**the_content()
of the post. See, it was that easy and fun. Now with a little charm of
CSS
, I got the following result.

**Conclusion
:
- We're ending this post on this very point but you need to know that there is still a _lot to learn about WordPress. It was just an example drill but a standard theme would be much complex. Still, we hope that you've learnt something new.
- If there was something that you didn't understand, do mention it in the comments. If there is something that needs to be corrected, please let us know! If you've any feedback or suggestions for further improvements, we would highly appreciate that as well.
- We would love to see what you've learnt through this post. So do share links to your first WordPress themes. Your first steps can cheer up the new-comers.
Happy Programming!