Bird
Raised Fist0
Wordpressframework~8 mins

Theme from scratch setup in Wordpress - Performance & Optimization

Choose your learning style10 modes available
Performance: Theme from scratch setup
HIGH IMPACT
This affects the initial page load speed and rendering performance by controlling how much code and assets are loaded and how efficiently the theme renders content.
Setting up a WordPress theme from scratch for fast loading
Wordpress
<?php
// functions.php
function theme_scripts() {
  if (is_single()) {
    wp_enqueue_script('custom', get_template_directory_uri() . '/js/custom.js', array(), null, true);
  }
  wp_enqueue_style('style', get_stylesheet_uri(), array(), null, 'all');
}
add_action('wp_enqueue_scripts', 'theme_scripts');

// header.php
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>
  <header>
    <h1><?php bloginfo('name'); ?></h1>
  </header>
  <main>
    <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
      <article>
        <h2><?php the_title(); ?></h2>
        <?php the_excerpt(); ?>
      </article>
    <?php endwhile; endif; ?>
    <?php the_posts_pagination(); ?>
  </main>
  <?php wp_footer(); ?>
</body>
</html>
Loads scripts only when needed, uses excerpts and pagination to reduce DOM size, and includes responsive meta tags for faster rendering.
📈 Performance GainSaves ~80kb JS, reduces DOM nodes by 50%, cuts blocking time by 100+ ms, improves LCP significantly
Setting up a WordPress theme from scratch for fast loading
Wordpress
<?php
// functions.php
function theme_scripts() {
  wp_enqueue_style('style', get_stylesheet_uri());
  wp_enqueue_script('jquery');
  wp_enqueue_script('custom', get_template_directory_uri() . '/js/custom.js', array('jquery'), null, true);
}
add_action('wp_enqueue_scripts', 'theme_scripts');

// header.php
<!DOCTYPE html>
<html>
<head>
  <?php wp_head(); ?>
</head>
<body>
  <header>
    <h1><?php bloginfo('name'); ?></h1>
  </header>
  <main>
    <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
      <article>
        <h2><?php the_title(); ?></h2>
        <?php the_content(); ?>
      </article>
    <?php endwhile; endif; ?>
  </main>
  <?php wp_footer(); ?>
</body>
</html>
Loads jQuery unnecessarily on every page, includes unoptimized scripts and styles, and renders all posts without pagination, causing large DOM and slow LCP.
📉 Performance CostAdds ~100kb of unused JS, triggers multiple reflows due to large DOM, blocks rendering for 200+ ms on slow connections
Performance Comparison
PatternDOM OperationsReflowsPaint CostVerdict
Loads all scripts and full content on every pageHigh (many nodes)Multiple reflowsHigh paint cost[X] Bad
Loads scripts conditionally and uses excerpts with paginationMedium (fewer nodes)Single reflowLower paint cost[OK] Good
Rendering Pipeline
The theme setup controls how HTML, CSS, and JS are loaded and structured, affecting style calculation, layout, paint, and composite stages in the browser.
→Style Calculation
→Layout
→Paint
→Composite
⚠️ BottleneckLayout due to large DOM and blocking scripts
Core Web Vital Affected
LCP
This affects the initial page load speed and rendering performance by controlling how much code and assets are loaded and how efficiently the theme renders content.
Optimization Tips
1Load only necessary scripts and styles on each page.
2Use excerpts and pagination to keep DOM size small.
3Include responsive meta tags and minimal HTML structure.
Performance Quiz - 3 Questions
Test your performance knowledge
What is a key performance benefit of loading scripts conditionally in a WordPress theme?
AMakes the theme compatible with all browsers
BIncreases the number of HTTP requests
CReduces unused JavaScript and speeds up page load
DImproves SEO rankings directly
DevTools: Performance
How to check: Open DevTools > Performance tab, record page load, then analyze Main thread for scripting and rendering times and check Largest Contentful Paint marker.
What to look for: Look for long scripting tasks, multiple reflows/layout shifts, and the timing of LCP to confirm efficient theme setup.

Practice

(1/5)
1. What is the minimum required file to create a basic WordPress theme from scratch?
easy
A. style.css
B. functions.php
C. header.php
D. footer.php

Solution

  1. Step 1: Understand WordPress theme basics

    A WordPress theme must have a style.css file to be recognized by WordPress.
  2. Step 2: Identify the minimum files

    While index.php is also needed for templates, style.css is the absolute minimum to register the theme.
  3. Final Answer:

    style.css -> Option A
  4. Quick Check:

    Minimum theme file = style.css [OK]
Hint: Remember: style.css registers the theme in WordPress [OK]
Common Mistakes:
  • Thinking functions.php is mandatory for a basic theme
  • Confusing header.php as required initially
  • Assuming footer.php is needed to start
2. Which of the following is the correct way to include the header template in a WordPress theme file?
easy
A. include('header.php');
B. load_header();
C. require('header.php');
D. get_header();

Solution

  1. Step 1: Recall WordPress template functions

    WordPress provides get_header() to load the header.php template properly.
  2. Step 2: Compare with PHP includes

    Using include or require bypasses WordPress hooks and is not recommended.
  3. Final Answer:

    get_header(); -> Option D
  4. Quick Check:

    Use get_header() to load header template [OK]
Hint: Use get_header() for proper WordPress header loading [OK]
Common Mistakes:
  • Using PHP include instead of get_header()
  • Trying to call a non-existent load_header() function
  • Using require which skips WordPress hooks
3. Given this code snippet in index.php of a WordPress theme:
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
  <h2><?php the_title(); ?></h2>
<?php endwhile; else : ?>
  <p>No posts found.</p>
<?php endif; ?>

What will be displayed if there are no posts?
medium
A. Nothing will be displayed
B. An error message
C. No posts found.
D. The titles of all posts

Solution

  1. Step 1: Understand the have_posts() check

    The code checks if posts exist with have_posts(). If none, it runs the else block.
  2. Step 2: Identify the else block output

    The else block outputs <p>No posts found.</p> when no posts exist.
  3. Final Answer:

    No posts found. -> Option C
  4. Quick Check:

    No posts triggers else output [OK]
Hint: If no posts, the else block runs showing 'No posts found.' [OK]
Common Mistakes:
  • Assuming no output if no posts
  • Expecting an error message instead
  • Thinking titles show even if no posts
4. You created a new theme but WordPress shows a blank page. Which of the following is the most likely cause?
medium
A. Missing style.css file with theme header comment
B. Using get_footer() instead of footer.php
C. Calling get_header() twice in index.php
D. Not adding functions.php file

Solution

  1. Step 1: Check theme registration requirements

    WordPress requires style.css with a proper header comment to recognize the theme.
  2. Step 2: Understand blank page cause

    If style.css is missing or header comment is absent, WordPress won't load the theme, showing a blank page.
  3. Final Answer:

    Missing style.css file with theme header comment -> Option A
  4. Quick Check:

    Missing style.css causes blank theme page [OK]
Hint: Always include style.css with header comment to register theme [OK]
Common Mistakes:
  • Thinking get_footer() usage causes blank page
  • Assuming duplicate get_header() breaks theme
  • Believing functions.php is mandatory for theme to load
5. You want to create a WordPress theme from scratch that shows a custom message only on the homepage and lists post titles on other pages. Which code snippet correctly implements this in index.php?
hard
A. <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <h2><?php the_title(); ?></h2> <?php endwhile; else : ?> <p>Welcome to my custom homepage!</p> <?php endif; ?>
B. <?php if ( is_front_page() ) : ?> <p>Welcome to my custom homepage!</p> <?php else : if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <h2><?php the_title(); ?></h2> <?php endwhile; endif; endif; ?>
C. <?php if ( is_home() ) : ?> <p>Welcome to my custom homepage!</p> <?php else : ?> <h2>No posts to show</h2> <?php endif; ?>
D. <?php if ( is_front_page() ) : ?> <p>Welcome to my custom homepage!</p> <?php endif; ?> <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <h2><?php the_title(); ?></h2> <?php endwhile; endif; ?>

Solution

  1. Step 1: Use conditional tags correctly

    is_front_page() checks if the current page is the homepage to show the custom message.
  2. Step 2: Show posts only on other pages

    Else block runs the loop to list post titles on non-homepage pages.
  3. Step 3: Verify code structure

    <?php if ( is_front_page() ) : ?> <p>Welcome to my custom homepage!</p> <?php else : if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <h2><?php the_title(); ?></h2> <?php endwhile; endif; endif; ?> nests the else with have_posts() loop correctly, showing message only on homepage.
  4. Final Answer:

    The nested if-else code snippet -> Option B
  5. Quick Check:

    Conditional homepage message + posts elsewhere = <?php if ( is_front_page() ) : ?> <p>Welcome to my custom homepage!</p> <?php else : if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <h2><?php the_title(); ?></h2> <?php endwhile; endif; endif; ?> [OK]
Hint: Use is_front_page() for homepage, else loop for posts [OK]
Common Mistakes:
  • Putting posts loop inside homepage condition
  • Showing message only when no posts exist
  • Not separating homepage and other pages logic
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard