Your first child

Gaelan Lloyd

WordCamp Seattle - 2015

(theme)

UPDATE

 

I have created an updated version of this slide deck, it's available at:

 

http://www.gaelanlloyd.com/slides/your-first-child-theme/

 

If you wish to view the original presentation I gave at WordCamp Seattle 2015, please continue on...

It's nice to meet you.

How many of you have installed a custom theme?

And wanted to change it?

How many of you have edited a theme's PHP?

Using WP's built-in editor?

WordPress themes

It's tempting to directly edit a theme's code...

If both you and the author are making changes to a theme, whose code gets to stay?

...but, as Admiral Ackbar said:

IT'S A TRAP!

Themes are fundamental to a WordPress site.

 

But they usually require some customization.

Development timeline

v1.0

v1.1

AUTHOR

First
release

Update

YOU

v1.1a

Change

v1.1b

Change

v1.2

Update

You install the theme on your server

Your options

#1 - Update the theme

  • Author's latest code gets installed.
  • You lose all of your customizations, need to re-apply them.

#2 - Manually merge

  • Get the theme's updates and merge your changes back in.
  • Complex and burdensome process to find all changes and merge the code.

#3 - Do nothing

  • Never update the theme.
  • Dangerous - no security updates.
  • You may accidentally update it anyway (see #1).

What if there was a way to keep your changes isolated from the theme?

What if you could make changes to a theme and still apply the author's updates?

"A child theme is a theme that inherits the functionality and styling of another theme, called the parent theme."

It's called a child theme!

A child theme:

  • Is a new, blank theme
     
  • That uses an existing theme as a starting point
     
  • That stores only the changes you want to make to that existing theme

What can a child theme do?

Modify style of a theme

  • CSS
  • Page templates

Modify functions of a theme

  • Shortcodes
  • Functions

New things the parent theme never did

  • New page templates
  • New shortcodes
  • New functions

Example

Modify the TwentyTwelve theme by creating a child theme

Requirements

A WordPress host that allows you to install custom themes

(WordPress.com accounts don't let you build custom themes)

 

 

SSH or FTP access to your server (SSH preferred)

 

 

The ability to create folders and set permissions

/wordpress

    /wp-content

        /themes

            /twentytwelve

            /twentytwelve-child
# Navigate to your site's THEMES folder
cd /var/www/wptest/wp-content/themes/

# Create the child theme folder
# Be sure to name it the same as the parent theme and add "-child"
sudo mkdir twentytwelve-child

# Set the permissions on the folder so that the web service can access it
sudo chown -R www-data:www-data twentytwelve-child/

STEP 1

Create the child theme folder

STEP 2

Make the style.css file

# Change to the new child theme folder
cd twentytwelve-child

# Create the style.css file
sudo vi style.css
/*
 Theme Name:   Twenty Twelve Child
 Description:  Twenty Twelve Child Theme
 Author:       Gaelan Lloyd
 Author URI:   http://www.gaelanlloyd.com
 Template:     twentytwelve
 Version:      1.0.0
*/

Contents of the style.css file

The template name must exactly match the parent theme's folder name.

STEP 3

Make the functions.php file

# Create the functions.php file
sudo vi functions.php
<?php

function theme_enqueue_styles() {

    wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' );

    wp_enqueue_style( 'child-style',
        get_stylesheet_directory_uri() . '/style.css',
        array('parent-style')
    );

}

add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );

?>

Contents of the functions.php file

STEP 4

Set file permissions

# Allow the web service permission to access these files
# Do this for any new files you create in the folder
sudo chown www-data:www-data style.css functions.php

# Or, to do the entire directory and its contents at once
sudo chown -R www-data:www-data /path/wp-content/themes/twentytwelve-child

The new child theme will now appear in the list of available themes for your site.

STEP 5

Switch to the new child theme

Et voila!

Wait a second...

TWENTY TWELVE

TWENTY TWELVE CHILD

because we haven't customized the child theme yet!

They look the same

 

Remember:

"A child theme is a theme that inherits the functionality and styling of another theme, called the parent theme."

What's a child theme?

A child theme:

  • Is a new, blank theme
     
  • That uses an existing theme as a starting point
     
  • That stores only the changes you want to make to that existing theme

Our new child theme is going to look exactly like the parent theme...

 

Until we make some customizations!

STEP 6

Add customizations to style.css

/*
 Theme Name:   Twenty Twelve Child
 Description:  Twenty Twelve Child Theme
 Author:       Gaelan Lloyd
 Author URI:   http://www.gaelanlloyd.com
 Template:     twentytwelve
 Version:      1.0.0
*/

# Center the page banner text
h1.site-title,
h2.site-description { text-align: center; }

# Make the article links red and bold
h1.entry-title a { font-weight: bold; color: #FF3030; }

Contents of the style.css file

TWENTY TWELVE CHILD (with changes now!)

Modify page templates, too!

If you want to make a change to one of the page templates from the parent theme:

 

  • Copy the page template file into your child theme folder

 

  • Edit the page template file and make whatever modifications you wish

Say we want to remove the comment area on all pages...

STEP 1

Copy the page.php page template into the child theme folder

# Copy the parent theme's PAGE.PHP to the child theme folder
# Assumes that you're still in the child theme folder
sudo cp ../twentytwelve/page.php .


# Remember to set permissions!
sudo chown www-data:www-data page.php


# Edit the page template and make your changes
sudo vi page.php
/wp-content
    /themes
        /twentytwelve
            404.php
            archive.php
            author.php
            category.php
            page.php
/wp-content
    /themes
        /twentytwelve-child
            functions.php
            style.css
            page.php

STEP 2

Remove the comments section in the page.php child theme file

shown on next slide...

We will change the code into a comment, which keeps it there for us to see but tells WordPress to ignore it.

<?php
/**
 * The template for displaying all pages
 *
 * This is the template that displays all pages by default.
 * Please note that this is the WordPress construct of pages
 * and that other 'pages' on your WordPress site will use a
 * different template.
 *
 * @package WordPress
 * @subpackage Twenty_Twelve
 * @since Twenty Twelve 1.0
 */

get_header(); ?>

    <div id="primary" class="site-content">
        <div id="content" role="main">

            <?php while ( have_posts() ) : the_post(); ?>

                <?php get_template_part( 'content', 'page' ); ?>

                <?php comments_template( '', true ); ?>

            <?php endwhile; // end of the loop. ?>

        </div><!-- #content -->
    </div><!-- #primary -->

<?php get_sidebar(); ?>
<?php get_footer(); ?>
<?php
/**
 * The template for displaying all pages
 *
 * This is the template that displays all pages by default.
 * Please note that this is the WordPress construct of pages
 * and that other 'pages' on your WordPress site will use a
 * different template.
 *
 * @package WordPress
 * @subpackage Twenty_Twelve
 * @since Twenty Twelve 1.0
 */

get_header(); ?>

    <div id="primary" class="site-content">
        <div id="content" role="main">

            <?php while ( have_posts() ) : the_post(); ?>

                <?php get_template_part( 'content', 'page' ); ?>

                <?php /* comments_template( '', true ); */ ?>

            <?php endwhile; // end of the loop. ?>

        </div><!-- #content -->
    </div><!-- #primary -->

<?php get_sidebar(); ?>
<?php get_footer(); ?>

And now the comment section is gone!

If a developer updates the parent theme, you'll be able to get their updates and keep your customizations.

STORY TIME

Once upon a time, we updated a parent theme.  The developer changed the naming convention of some DIVs, and so our child theme modifications broke.

But since we used a child theme and had our changes isolated from the developer's code, it was relatively easy to track down the problem, find the developer's change, and make a fix.

CAUTION

Customizations in your child theme may break after a parent theme update.

Use a DEV environment to test the theme update.

Advanced applications

Framework themes provide a great foundation for custom website designs.

https://bootstrapwp.com/themes/strappress/
https://codex.wordpress.org/Theme_Frameworks

Real life example

../wp-content/themes/bootstrap/

images/
languages/
library/

404.php               page-full-width.php
archive.php           page-homepage.php
attachment.php        page-left-sidebar.php
author.php            page.php
comments.php          README.md
editor-style.css      screenshot.png
favicon.ico           searchform.php
footer.php            search.php
functions.php         sidebar.php
header.php            sidebar-sidebar2.php
image.php             single.php
index.php             style.css

Folder contents of the Bootstrap theme

# My favorite theme framework so far, but it has fallen out of development.
https://github.com/320press/wordpress-bootstrap
../wp-content/themes/bootstrap-child/

functions/
functions-priority/
shortcodes/

404.php                         page-full-width.php
style.css                       page-hero.php
custom-login-logo.png           page-homepage.php
footer.php                      page-no-sidebar.php
functions-javascript.js         page.php
functions.php
header-full-width.php           sidebar-blog.php
header.php                      sidebar-newsletter.php
                                sidebar.php
archive-newsletter.php
archive-people.php              single-asset.php
archive.php                     single-career.php
archive-press-releases.php      single-event.php
                                single-newsletter.php
category-blog.php               single-people.php
                                single.php
menu-footer-en.php              single-post.php
menu-main-en.php                single-press-releases.php
menu-top-en.php                 single-webinars.php
../wp-content/themes/bootstrap-child/

functions/
functions-priority/
shortcodes/

404.php                         page-full-width.php
style.css                       page-hero.php
custom-login-logo.png           page-homepage.php
footer.php                      page-no-sidebar.php
functions-javascript.js         page.php
functions.php
header-full-width.php           sidebar-blog.php
header.php                      sidebar-newsletter.php
                                sidebar.php
archive-newsletter.php
archive-people.php              single-asset.php
archive.php                     single-career.php
archive-press-releases.php      single-event.php
                                single-newsletter.php
category-blog.php               single-people.php
                                single.php
menu-footer-en.php              single-post.php
menu-main-en.php                single-press-releases.php
menu-top-en.php                 single-webinars.php
../wp-content/themes/bootstrap-child/

functions/
functions-priority/
shortcodes/

404.php                         page-full-width.php
style.css                       page-hero.php
custom-login-logo.png           page-homepage.php
footer.php                      page-no-sidebar.php
functions-javascript.js         page.php
functions.php
header-full-width.php           sidebar-blog.php
header.php                      sidebar-newsletter.php
                                sidebar.php
archive-newsletter.php
archive-people.php              single-asset.php
archive.php                     single-career.php
archive-press-releases.php      single-event.php
                                single-newsletter.php
category-blog.php               single-people.php
                                single.php
menu-footer-en.php              single-post.php
menu-main-en.php                single-press-releases.php
menu-top-en.php                 single-webinars.php
../wp-content/themes/bootstrap-child/

functions/
functions-priority/
shortcodes/

404.php                         page-full-width.php
style.css                       page-hero.php
custom-login-logo.png           page-homepage.php
footer.php                      page-no-sidebar.php
functions-javascript.js         page.php
functions.php
header-full-width.php           sidebar-blog.php
header.php                      sidebar-newsletter.php
                                sidebar.php
archive-newsletter.php
archive-people.php              single-asset.php
archive.php                     single-career.php
archive-press-releases.php      single-event.php
                                single-newsletter.php
category-blog.php               single-people.php
                                single.php
menu-footer-en.php              single-post.php
menu-main-en.php                single-press-releases.php
menu-top-en.php                 single-webinars.php
../wp-content/themes/bootstrap-child/

functions/
functions-priority/
shortcodes/

404.php                         page-full-width.php
style.css                       page-hero.php
custom-login-logo.png           page-homepage.php
footer.php                      page-no-sidebar.php
functions-javascript.js         page.php
functions.php
header-full-width.php           sidebar-blog.php
header.php                      sidebar-newsletter.php
                                sidebar.php
archive-newsletter.php
archive-people.php              single-asset.php
archive.php                     single-career.php
archive-press-releases.php      single-event.php
                                single-newsletter.php
category-blog.php               single-people.php
                                single.php
menu-footer-en.php              single-post.php
menu-main-en.php                single-press-releases.php
menu-top-en.php                 single-webinars.php

Child themes make themes flexible

  • Custom page templates
  • Custom single pages
  • Custom archive pages
  • Custom single / archive pages for specific post types
  • Multiple variations of page layouts

Even more complex customizations, like:

Tailor-made to your specific site's need:

Take a look at the WordPress codex to learn more!

 

http://codex.wordpress.org/Child_Themes

Thanks for your time!

www.gaelanlloyd.com   @gaelanlloyd

Customizing a WordPress theme properly

By Gaelan Lloyd

Customizing a WordPress theme properly

Learn how to safely modify an existing WordPress theme using Child Themes.

  • 4,134