https://jtcoders.gitub.io/wordpress-themes
WordPress Themes are files that work together to create the design and functionality of a WordPress site.
NO!
This means do not edit:
If you break something you can just hit undo or remove your file. All parent theme files will remain intact.
Define the general information for your theme.
/*
Theme Name: [Your Theme Name]
Theme URI: [URL for your theme if you have one]
Description: A description for your theme.
Author: [You]
Author URI: [Your URL]
Template: twentythirteen
Version: 1
*/
Define the general information for your theme.
Enqueue the parent and child theme stylesheets
<?php
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );
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')
);
}
This is the thumbnail image that represents each theme in Appearance > Themes in the WordPress admin.
Create a 880px by 660px image file, name it “screenshot.png” and place it into the child theme’s folder.
wp-content/themes
(no spaces)
Go to Appearance > Themes in the WP admin.
Your child theme is now there!
The 3 files illustrate how a child theme's files affect the parent's files -- they either override and add functionality to its identically named file, or completely replaces it.
Your style.css file will override styles in the parent theme's style.css file with the same selectors.
Example: Changing the size of the header title. The font-size for .site-title
is 60px. Use the css selector in your child theme to change it.
.site-title {
font-size: 40px;
}
First, an introduction to templates...
Template files are the building blocks of your WordPress site. They fit together like the pieces of a puzzle to generate the web pages on your site.
In the twentythirteen folder is all the theme's the template files. You can create your own versions of these files in your child theme.
Example: Removing WordPress credit from footer.php
footer.php
in the twentythirteen folder and save a copy into your theme's folder.
<div class="site-info">
<?php do_action( 'twentythirteen_credits' ); ?>
<a href="<?php echo esc_url( __( 'http://wordpress.org/', 'twentythirteen' ) ); ?>" title="<?php esc_attr_e( 'Semantic Personal Publishing Platform', 'twentythirteen' ); ?>"><?php printf( __( 'Proudly powered by %s', 'twentythirteen' ), 'WordPress' ); ?></a>
</div?><!-- .site-info -->
Twentythirteen has just one default template, a content area with a right sidebar.
You can make additional templates. Templates you create will appear in the Template drop-down menu on the Page edit screen.
<?php
/*
Template Name: [Type your template name here]
*/
?>
<?php get_header(); ?>
<?php get_footer(); ?>
Example: Create a full-width, no sidebar template.
page.php
in the twentythirteen folder.page-fullwidth.php
and save it into your theme's folderTemplate Name:
to top of the file<?php get_sidebar(); ?>
.entry-content
full width.WordPress dynamically adds classes to the body tag depending what page you are on or template you are using. Use them to create unique styles for pages.
<?php get_search_form(); ?>
<?php get_sidebar(); ?>
<?php comments_template(); ?>
Check out the WordPress Codex Include Tags Page
Example: Add the search form to the header
header.php
in the twentythirteen folder and save a copy into your theme's folder.<?php get_search_form(); ?>
to the header just below the site description
<?php the_title(); ?>
<?php the_content(); ?>
<?php the_permalink(); ?>
<?php the_excerpt(); ?>
<?php get_the_post_thumbnail(); ?>
Check out the WordPress Codex Function Reference
Example: Add a copyright to the footer
footer.php
in your theme's folder.
Copyright © <?php echo date('Y'); ?> <a href="<?php echo home_url( '/' ); ?>"><?php bloginfo( 'name' ); ?></a>
is_front_page()
is_home()
is_single()
is_page()
is_category()
Check out the WordPress Codex Conditional Tags Page and this blog post on is_front_page()
vs. is_home()
Example: Add credit to the footer that only shows on the home page
footer.php
<?php
if(is_front_page()){
echo "<p>Web design by [your name here]</p>";
}
?>
Example: Add a div to the header that only shows on the home page
header.php
<?php if (is_front_page() ) {?>
<div class='header-homediv'>
<h1>THIS IS THE HOME PAGE</h1>
</div>
<?php } ?>
bloginfo
to add the blog description to the footer.
get_template_part is a special include tag that allows you to load any other template file into a template. It lets you to reuse code in multiple templates.
Important Dev rule #2 Don't Repeat Yourself.
Check out the WordPress Codex get template part
<?php get_template_part( 'content', 'none' ); ?>
Will load a template file named content-none.php
<?php the_post_thumbnail('medium'); ?>
This will create an img
tag for the medium sized version of a post or page's "Featured Image"
Check out the WordPress Codex the post thumbnail
You can bring up the thumbnail, medium, large, original or a custom size of the featured image. If no size is defined it will default to the thumbnail size.
<?php the_post_thumbnail('thumbnail'); ?>
<?php the_post_thumbnail('medium'); ?>
<?php the_post_thumbnail('large'); ?>
<?php the_post_thumbnail('full'); ?>
<?php the_post_thumbnail( array(250,100) ); ?>
get_template_directory_uri
- Retrieves stylesheet directory address for the current theme.get_stylesheet_directory_uri
- Retrieves stylesheet directory address for the current theme/child theme.
Check out the WordPress Codex get template directory uri and get stylesheet directory uri
To include images in your theme you can use the code below.
<img src="<?php echo get_stylesheet_directory_uri(); ?>/images/image.png" />
VS.
<img src="http://whatever.com/wp-content/mytheme/images/image.png" />
WordPress uses the Query String — information contained within each link on your web site — to decide which template or set of templates will be used to display the page.
If you name a template file a certain way, it will automatically apply to a certain page.
There's a chart on WordPress.org that shows how the naming conventions work.
The chart looks confusing, but if you break it down it's really pretty simple. We'll look at the template hierarchy for category archives.
If you name template a file a certain way they will affect the display of a certain page. Just follow the chart to find the correct naming convention.
Custom archive and post templates can be named by id or slug
Check out this interactive version of the chart
Example: Make an archive term template
category.php
in the twentythirteen folder.category-[slug].php
and save it into your theme's folder
index.php
is the end of the road. Any page that does not have another template file made for it will use index.php
aka the default template for the posts (blog) page.
Child themes are great for modifying existing themes, but you can create your own custom theme with a starter theme.
Starter themes have base WordPress functionality, but very little or no style. Starter theme developers encourage you to hack it and make it your own.
Starter themes can also come with a base framework, like HTML 5 Boilerplate, Twitter Bootstrap or a responsive grid if you enjoy using frameworks. There's no need to reinvent the wheel!
The Loop is PHP code used by WordPress to display posts.
The Loop is a set of instructions in a template that grabs content and displays it on a page.
It's called a "loop" because the set of instructions can be repeated multiple times on a page. For example, index.php
.
Check out the WordPress Codex The Loop
Within the main loop are the main parts of a page or post.
<?php the_title(); ?>
<?php the_content(); ?>
You can also grab additional content, aka Metadata, attached to pages or posts. Some function tags will only work if they are placed within The Loop.
Let's check out The Loop in a few different Twentythirteen templates
page.php
index.php
content.php
Use WP_Query
to write your own loops
Check out the WordPress Codex WP_Query
<!-- // The Query -->
<?php $myloop = new WP_Query( $args ); ?>
<ul>
<!-- // Loop starts -->
<?php while ($myloop->have_posts()) : $myloop->the_post(); ?>
<li>
<h2><?php the_title(); ?></h2>
<p><?php the_content(); ?></p>
</li>
<!-- // Loop ends -->
<?php endwhile; ?>
</ul>
Check out the WordPress Codex WP_Query
<!-- // The Query -->
<?php $myloop = new WP_Query( 'author_name=tracy' ); ?>
Check out the WordPress Codex WP_Query Author Parameters
<!-- // The Query -->
<?php $myloop = new WP_Query( 'cat=4' ); ?>
Check out the WordPress Codex WP_Query Category Parameters
<!-- // The Query -->
<?php $myloop = new WP_Query( 'tag=cats' ); ?>
Check out the WordPress Codex WP_Query Tag Parameters
<!-- // The Query -->
<?php $myloop = new WP_Query( 'posts_per_page=5' ); ?>
Check out the WordPress Codex WP_Query Pagination Parameters
<!-- // The Query -->
<?php $myloop = new WP_Query( 'orderby=title' ); ?>
Check out the WordPress Codex WP_Query Orderby Parameters
<!-- // The Query -->
<?php $myloop = new WP_Query( array(
'cat' => 'cats',
'posts_per_page' => '4',
'orderby' => 'date',
'order' => 'DESC'
) );
?>
<ul>
<!-- // The Loop -->
<?php while ($myloop->have_posts()) : $myloop->the_post(); ?>
<li>
<h2><?php the_title(); ?></h2>
<p><?php the_excerpt(); ?></p>
</li>
<?php endwhile; ?>
<!-- // The end of The Loop -->
</ul>
Use wp_reset_postdata();
<!-- // The Query -->
<?php $myloop = new WP_Query( $args ); ?>
<ul>
<!-- // Loop starts -->
<?php while ($myloop->have_posts()) : $myloop->the_post(); ?>
<li>
<h2><?php the_title(); ?></h2>
<p><?php the_content(); ?></p>
</li>
<!-- // Loop ends -->
<?php endwhile; ?>
<?php wp_reset_postdata(); // restores the main loop ?>
</ul>
<?php
// Check for transient. If none, then execute WP_Query
if ( false === ( $lastpostsloop = get_transient( 'home_lastposts_loop' ) ) ) {
$lastpostsloop = new WP_Query( $args ));
// Put the results in a transient. Expire after 12 hours.
set_transient( 'home_lastposts_loop', $lastpostsloop, 12 * HOUR_IN_SECONDS );
} ?>
<!-- // The Loop -->
<?php while ($lastpostsloop->have_posts()) : $lastpostsloop->the_post(); ?>
<h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
<!-- // The end of The Loop -->
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
Check out the WordPress Codex Transients API
functions.php
functions.php is a special file that acts like a plugin to add functionality to your theme.
Check out the WordPress Codex Functions File Explained
functions.php
in a child theme
functions.php
works like style.css
in a child theme. It adds to and modifies the parent's functions.php
. You don't make a copy of it in your child theme folder like you do with template files, you start a new one.
<?php
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );
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')
);
}
(all of your additional functions go here)
functions.php
You can tell your theme to load external files in functions.php
. It helps you keep functions.php
from being overloaded with too much code.
// Load a file from the inc folder
require_once 'inc/my-file.php';
It's important to keep theme files organized.
inc
folder)inc
folder)inc
folder)Hooks are provided by WordPress to allow your plugin to 'hook into' the rest of WordPress...There are 2 kinds of hooks:
- Actions: A custom PHP function defined in your plugin (or theme) and hooked, i.e. set to respond, to specific events that take place in WordPress.
- Filters: Functions that WordPress passes data through, at certain points in execution, just before taking some action with the data
Hooks, Actions and Filters allow you to change core WordPress functionality without breaking it.
Hooks - Points at which WordPress allows you to tap into a function and safely modify it.
Some examples are:
Actions - A hook that makes something new happen when a WordPress function is triggered.
Filters - A hook that modifies a WordPress function when it is triggered.
The following is an overview of some handy WordPress functions you can hook into to enrich your themes.
Check out the WordPress Codex Entire Function Reference
You can add custom images sizes (in addition to the default thumb, medium, large and original).
add_image_size( 'my-img', 400, 400 ); // soft proportional crop mode
add_image_size( 'other-img', 200, 269, true ); // hard crop mode
add_image_size( 'custom-size', 220, 220, array( 'left', 'top' ) ); // Hard crop left top
Check out the WordPress Codex add image size
In your queries you can use get_the_post_thumbnail
to load custom sizes of featured images.
<?php echo get_the_post_thumbnail($page->ID, 'my-img'); ?>
Adding custom thumbnail sizes to functions.php will not affect images previously uploaded, only images uploaded from that point on. You will need to regenerate older images.
You can use the handy Force Regenerate Thumbnails plugin to create the custom sizes of your previously uploaded images.
If you have used custom menus in WordPress sites before (Appearance > Menus in the admin) you know a theme can have specific menu locations.
Check out the WordPress Codex register nav menus
Use register_nav_menus
in functions.php to register your menus.
register_nav_menus( array(
'footer-nav' => 'Footer Menu',
) );
Use the wp_nav_menu
tag to assign a menu to a location in your theme.
<?php wp_nav_menu( array( 'theme_location' => 'footer-nav' ) ); ?>
Check out the WordPress Codex wp nav menu
Add fallback_cb to make sure no menu displays if there are no custom menus assigned to that location.
<?php wp_nav_menu( array( 'theme_location' => 'footer-nav', 'fallback_cb' => false ) ); ?>
Check out the WordPress Codex wp nav menu
You can also use wp_nav_menu
to load any custom menu you've created in Appearance > Menus. You can use the menu's ID, slug, or name.
<?php wp_nav_menu( array('menu' => '2' )); ?>
Most themes come with specific widgetized areas -- locations in the sidebar, footer, header, etc. that you can drag and drop widgets into. You can use register_sidebar
to create widgetized areas in your theme.
Check out the WordPress Codex register sidebar
Use register_sidebar
to register your widgetized areas.
register_sidebar(array(
'name' => __( 'Header Widget Area' ),
'id' => 'headerwidget',
'description' => __( 'The header widget area.' ),
'before_widget' => '<div id="%1$s" class="headerwidget %2$s">',
'after_widget' => '</div>',
'before_title' => '<h4 class="headerwidgettitle">',
'after_title' => '</h4>',
));
Use the dynamic_sidebar
tag to assign a widgetized area to a location in your theme.
<?php dynamic_sidebar( 'headerwidget' ); ?>
Check out the WordPress Codex dynamic sidebar
Use the dynamic_sidebar
tag along with conditional tags to load certain widget areas on certain pages.
if(is_page( 'about' )){
dynamic_sidebar( 'aboutsidebar' );
}
if(is_page( 'contact' )){
dynamic_sidebar( 'contactsidebar' );
}
Try to use any of the functions we learned today.
Try to do it yourself (if you're stuck view functions.php on Github).
Not only can you create widgetized areas, you can create widgets to drag and drop into those areas.
Check out the WordPress Codex Widgets API
Note: You should put the widget code in its own file. If your widget is breaking the site you can easily turn it "on" and "off" while you troubleshoot code. Add a line of code to functions.php
to load the file.
"On"
/* load my widget */
require_once 'inc/my-widget.php';
"Off"
/* load my widget */
//require_once 'inc/my-widget.php';
We'll go through all the code for My Awesome Widget
We'll be here to help.