https://jtcoders.gitub.io/wordpress-themes
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.
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...
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
Open footer.php in the twentythirteen folder and save a copy into your theme's folder. Alter the contents of .site-info and save the file.
<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.
Open page.php in the twentythirteen folder. Rename it page-fullwidth.php and save it into your theme's folder Add the Template Name: to top of the file Remove <?php get_sidebar(); ?> Adjust the css to make .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
Open header.php in the twentythirteen folder and save a copy into your theme's folder. Add <?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
Open footer.php in your theme's folder. Add code to create a copyright lineCopyright © <?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
Open footer.php Add code to create a credit line<?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 } ?>
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) ); ?>
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" />
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
Open category.php in the twentythirteen folder. Rename it category-[slug].php and save it into your theme's folder Modify the templateindex.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 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
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 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 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)
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.
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.