Skip to content

The Skeleton of a Theme (Building the Foundation)

Building Your Theme from Scratch: It's Alive! 💀⚡️

Alright, it's time to roll up our sleeves and get down to business. Before your theme can come to life, it needs a skeleton – a basic file structure that holds everything together. Think of this like building a house: you need a solid foundation before you can start decorating with cool wallpapers (and by wallpapers, we mean CSS).

Step 1: Your Theme Folder – A New Home 🏠

Your first step is to create a brand new home for your theme. In your local WordPress installation, navigate to:

wp-content/themes/

In this directory, create a new folder and give it a catchy name, like my-noob-theme. This is your theme’s home, where all the magic will happen.

/wp-content/themes/
    └── my-noob-theme/

Now, let’s add some files to this folder. We’ll start with the two essential ones that every WordPress theme needs to exist (yup, just two files for now).

Step 2: style.css – Your Theme’s ID Card

The style.css file is like the theme’s ID card. It tells WordPress what your theme is called, who made it, and a few other details. Without this file, WordPress won’t recognize your theme. (Cue sad violins.)

Create a style.css file in your theme folder and add this magic at the top:

css
/*
Theme Name: My Noob Theme
Theme URI: http://yourwebsite.com/
Author: Your Name
Author URI: http://yourwebsite.com/
Description: A custom WordPress theme that’s totally for noobs.
Version: 1.0
License: GNU General Public License v2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: my-noob-theme
*/

Boom. Your theme is now officially registered in WordPress’ theme directory. Still doesn’t look like much, but hey, baby steps.

Step 3: index.php – The First Page of the Story

Now that your theme has an identity, it needs a face. Enter index.php, the main file where WordPress will look first when it loads your site. You can think of it as the first page of your story.

Create a file called index.php in your theme folder and throw in some basic HTML:

php
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title><?php bloginfo('name'); ?></title>
    <link rel="stylesheet" href="<?php echo get_stylesheet_uri(); ?>">
</head>
<body>
    <h1>Welcome to My Noob Theme!</h1>
    <p>This is your very first custom WordPress theme. Woohoo!</p>
</body>
</html>

What’s happening here?

  • <?php bloginfo('name'); ?> – This pulls the site’s title from WordPress settings. Magic!
  • <?php echo get_stylesheet_uri(); ?> – This points to your style.css file, so any CSS you add will be applied.

Now, if you go to your WordPress dashboard and activate your new theme (Appearance > Themes), you’ll see that basic “Welcome” message when you visit your site. Simple, but it works!

Step 4: The WordPress Template Hierarchy: How WordPress Thinks 🤔

You’ve got your theme’s skeleton in place. Now let’s talk about how WordPress decides which file to use when displaying different types of content. This is called the template hierarchy, and it’s one of the most important things to understand in theme development.

Imagine WordPress as a detective. It gets a request like, “Show me a post!” and it goes through its mental checklist to figure out which template file to use.

Here’s a quick breakdown of how the detective (aka WordPress) thinks:

  • Homepage – If you’re visiting the homepage, WordPress first looks for home.php. If it doesn’t find it, it checks for index.php.
  • Single Post – When viewing a single post, WordPress looks for single.php. If it’s not there, it falls back to index.php.
  • Page – Viewing a page? WordPress looks for page.php. If it’s missing, it falls back to index.php.
  • Category Archive – Want to see all posts in a category? WordPress tries category.php first, then goes to archive.php, and finally ends up at index.php if all else fails.
  • 404 Page – If something’s not found (oops), WordPress checks for 404.php.

Step 5: Expanding the Skeleton: Adding More Files

Now that you know how WordPress thinks, it’s time to expand your theme’s skeleton by adding more template files to handle different parts of your website.

Here are some of the common files you’ll want to create:

  • header.php – Contains the code for the top part of your site (navigation, logo, etc.).
  • footer.php – Contains the footer section of your site (copyright, links, etc.).
  • single.php – Handles the display of single blog posts.
  • page.php – Used when displaying pages.
  • archive.php – Displays lists of posts, like blog posts, categories, or tags.
  • 404.php – The famous “Page Not Found” template for handling errors.

You don’t need to add all of these at once. We’ll be creating them as we go. For now, let’s just focus on building the foundation.

Let’s take some of the repetitive code (like the <head> section and the <footer>) and break it into reusable parts.

Create header.php:

php
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title><?php bloginfo('name'); ?></title>
    <link rel="stylesheet" href="<?php echo get_stylesheet_uri(); ?>">
    <?php wp_head(); ?>
</head>
<body>

Create footer.php:

php
    <?php wp_footer(); ?>
</body>
</html>

Now, go back to your index.php file and modify it to include the header and footer like so:

php
<?php get_header(); ?>

<h1>Welcome to My Noob Theme!</h1>
<p>This is your very first custom WordPress theme. Woohoo!</p>

<?php get_footer(); ?>

Look at that – you’ve just modularized your code! Now, any changes to the header or footer will automatically be applied everywhere. Efficient, right?

Final skeleton

my-noob-theme/

├── style.css           # Main stylesheet with theme info
├── index.php           # Default template file
├── functions.php       # Theme functions and custom PHP code
├── header.php          # Site header (navigation, meta tags, etc.)
├── footer.php          # Site footer
├── sidebar.php         # Sidebar (optional)
├── single.php          # Template for single posts
├── page.php            # Template for pages
├── archive.php         # Template for archives (categories, tags, etc.)
├── search.php          # Template for search results
├── 404.php             # Error page template (when content is not found)
├── screenshot.png      # Theme screenshot displayed in WordPress admin
└── assets/             # Optional folder for images, CSS, JS, etc.
    ├── css/
    ├── js/
    └── images/

Up Next: Styling and Layout (aka Making Things Pretty) 🎨

Now that your theme skeleton is set up, it's time to start adding some flair. In the next chapter, we’ll dive into CSS (and maybe a little JavaScript) to give your site some style and make it look awesome.

Let’s make this thing shine!

Built by noobs, for noobs, with love 💻❤️