Power Your Portfolio With WordPress Matt Wiebe http://somadesign.ca/ @mattwiebe Wednesday, 24 August, 11
Power Your PortfolioWith WordPress
Matt Wiebe http://somadesign.ca/ @mattwiebe
Wednesday, 24 August, 11
Knowledge.
Wednesday, 24 August, 11
Knowledge.• Make a Child Theme
Wednesday, 24 August, 11
Knowledge.• Make a Child Theme
• Make a custom content type
Wednesday, 24 August, 11
Knowledge.• Make a Child Theme
• Make a custom content type
• Add and retrieve meta data
Wednesday, 24 August, 11
Knowledge.• Make a Child Theme
• Make a custom content type
• Add and retrieve meta data
• Create a custom content type template
Wednesday, 24 August, 11
Child Themes
Wednesday, 24 August, 11
Child Themes• Quick
• DRY (Don’t Repeat Yourself)
Wednesday, 24 August, 11
/*Theme Name: My PortfolioTemplate: twentyeleven*/
style.css
Wednesday, 24 August, 11
/*Theme Name: My PortfolioTemplate: twentyeleven*/
style.css
Wednesday, 24 August, 11
Parent/Child TerminologyParent | Child
Template | Stylesheet
Wednesday, 24 August, 11
Parent Theme (Template)
Wednesday, 24 August, 11
Child Theme (Stylesheet)
Wednesday, 24 August, 11
Child Theme Inheritance• WP looks in the child theme first
Wednesday, 24 August, 11
Child Theme Inheritance• WP looks in the child theme first
• If a file isn't there, it looks in the parent theme
Wednesday, 24 August, 11
Child Theme Inheritance• WP looks in the child theme first
• If a file isn't there, it looks in the parent theme
• exception: both functions.php files will be loaded
Wednesday, 24 August, 11
Child Theme Inheritance• WP looks in the child theme first
• If a file isn't there, it looks in the parent theme
• exception: both functions.php files will be loaded
• functions.php is like your theme's mini-plugin
Wednesday, 24 August, 11
Child Themes:ONLY CHANGE WHAT NEEDS CHANGING
Wednesday, 24 August, 11
Child Themes:ONLY CHANGE WHAT NEEDS CHANGING
O R :
Wednesday, 24 August, 11
Child Themes:ONLY CHANGE WHAT NEEDS CHANGING
O R :
WORK SMARTER, NOT HARDER
Wednesday, 24 August, 11
Let's Code
Wednesday, 24 August, 11
Portfolios Need Itemsadd_action('init', 'sd_init');function sd_init { $args = array(); register_post_type('sd_portfolio', $args);}
Wednesday, 24 August, 11
Crash Course in Hooks
Wednesday, 24 August, 11
Crash Course in Hooks• The foundation of WP’s plugin system
Wednesday, 24 August, 11
Crash Course in Hooks• The foundation of WP’s plugin system
• ACTIONS run at various points
Wednesday, 24 August, 11
Action Hook Exampleadd_action('wp_head', 'my_wp_head');function my_wp_head() { // Does something in a theme's header // Maybe echo a Typekit <script>?}
Wednesday, 24 August, 11
Crash Course in Hooks• The foundation of WP’s plugin system
• ACTIONS run at various points
• FILTERS run and allow you to modify data
Wednesday, 24 August, 11
Filter Hook Exampleadd_filter('the_title', 'no_orphans');function no_orphans($title) { // run an awesome piece of code // ALWAYS return the passed-in filter value return $title;}
Wednesday, 24 August, 11
Crash Course in Hooks• The foundation of WP’s plugin system
• ACTIONS run at various points
• FILTERS run and allow you to modify data
• Both connect a hook with a function of your own
Wednesday, 24 August, 11
add_action('init', 'sd_init');function sd_init { $args = array(); register_post_type('sd_portfolio', $args);}
Wednesday, 24 August, 11
add_action('init', 'sd_init');function sd_init { $args = array(); register_post_type('sd_portfolio', $args);}
Wednesday, 24 August, 11
add_action('init', 'sd_init');function sd_init { $args = array(); register_post_type('sd_portfolio', $args);}
Wednesday, 24 August, 11
add_action('init', 'sd_init');function sd_init { $args = array(); register_post_type('sd_portfolio', $args);}
Wednesday, 24 August, 11
add_action('init', 'sd_init');function sd_init { $args = array(); register_post_type('sd_portfolio', $args);}
Wednesday, 24 August, 11
$args = array( 'supports' => array('title', 'editor', 'thumbnail'));register_post_type('sd_portfolio', $args);
register_post_type $args
Wednesday, 24 August, 11
$args = array( 'rewrite' => array('slug' => 'portfolio'));// Sets URL for single Portfolio Item// example.com/portfolio/some-portfolio-item
register_post_type $args
Wednesday, 24 August, 11
$args = array( 'has_archive' => 'portfolio');// Sets URL for all portfolio items// example.com/portfolio/
register_post_type $args
Wednesday, 24 August, 11
$args = array( 'labels' => array( 'name' => 'Portfolio Items' 'singular_name' => 'Portfolio Item', // more labels can be set ));
register_post_type $args
Wednesday, 24 August, 11
$args = array( // Show on front end 'public' => true, // Show the admin UI 'show_ui' => true);
register_post_type $args
Wednesday, 24 August, 11
Featured Image• AKA thumbnail / post thumbnail
• Associate a specific image with a post/page/portfolio item/whatever
• Perfect for a portfolio: show an image for a portfolio item
Wednesday, 24 August, 11
Custom Image Sizes// in your functions.phpadd_image_size('sd_portfolio', 1000, 500, true);
// in your themethe_post_thumbnail('sd_portfolio');
Wednesday, 24 August, 11
Custom Image Sizes// widthadd_image_size('sd_portfolio', 1000, 500, true);
Wednesday, 24 August, 11
Custom Image Sizes// heightadd_image_size('sd_portfolio', 1000, 500, true);
Wednesday, 24 August, 11
Custom Image Sizes// crop (optional, false default)add_image_size('sd_portfolio', 1000, 500, true);
Wednesday, 24 August, 11
There’s More to a Portfolio Than a Title & an Image
Wednesday, 24 August, 11
More Portfolio Info• Work Done
• Agency (if you’re a freelancer)
• URL of finished work
• Client quote
• Other?
Wednesday, 24 August, 11
We'll Make This:
Wednesday, 24 August, 11
This is a rare thing that WordPress does
NOTmake easy
Wednesday, 24 August, 11
add_meta_box('porfolio-meta', 'Portfolio Metadata', 'sd_portfolio_metabox', 'sd_portfolio', 'normal' );function sd_portfolio_metabox() {
$url = get_post_meta(get_the_ID(), 'live_url', true); ?><table class="form-table">
<tr><th>Live Site URL:</th><td><input type="text" name="live_url" value="<?php echo $url ?>" /></td>
</tr></table><?php
}
add_action( 'admin_init' , 'sd_save_portfolio_metadata' );function sd_save_portfolio_metadata() {
// horribly insecure never actually do thisif ( isset($_POST['live_url']) ) {
update_post_meta(get_the_ID(), 'live_url', $_POST['live_url']);}
}
Wednesday, 24 August, 11
Blech.
Wednesday, 24 August, 11
Simpler Metaboxes• More Fields Plugin
• http://wordpress.org/extend/plugins/more-fields
Wednesday, 24 August, 11
Simpler Metaboxes• More Fields Plugin
• http://wordpress.org/extend/plugins/more-fields
• Tribe_Meta_Box class
• Not yet released. But awesome.
• A few lines of code = no manual metabox labour
Wednesday, 24 August, 11
$meta_fields = array( array( 'name' => 'Live site URL', 'meta' => 'live_url', 'type' => 'text' ));// define our box$meta_box = array( 'id' => 'portfolio-meta', 'title' => 'Portfolio Metadata', 'pages' => array('sd_portfolio'), 'fields' => $meta_fields);// Initialize metaboxnew Tribe_Meta_Box($meta_box);
Wednesday, 24 August, 11
• archive-sd_portfolio.php
• 10 most recent portfolio items
Theme It.
Wednesday, 24 August, 11
• archive-sd_portfolio.php
• 10 most recent portfolio items
• single-sd_portfolio.php
• a single portfolio item
Theme It.
Wednesday, 24 August, 11
Loop Refresherwhile ( have_posts() ) : the_post(); // do some HTML + template_tags // title, featured image, metadata...endwhile;
Wednesday, 24 August, 11
Single Portfolio Itemsingle-sd_portfolio.php
Wednesday, 24 August, 11
Single Portfolio Itemsingle-sd_portfolio.php
Wednesday, 24 August, 11
Single Portfolio Item// in loop
Wednesday, 24 August, 11
Single Portfolio Item// in loop// featured imagethe_post_thumbnail('your_image_id');
Wednesday, 24 August, 11
Single Portfolio Item// in loop// featured imagethe_post_thumbnail('your_image_id');// add_image_size('your_image_id');
Wednesday, 24 August, 11
Displaying Metadata// in loop!$live_url = get_post_meta( get_the_ID(), 'live_url', true );
Wednesday, 24 August, 11
Displaying Metadata// the current post's ID$live_url = get_post_meta( get_the_ID(), 'live_url', true );
Wednesday, 24 August, 11
Displaying Metadata// the meta key (set previously)$live_url = get_post_meta( get_the_ID(), 'live_url', true );
Wednesday, 24 August, 11
Displaying Metadata// single piece of metadata// Usually want true (default false)$live_url = get_post_meta( get_the_ID(), 'live_url', true );
Wednesday, 24 August, 11
Displaying Metadata$live_url = get_post_meta( get_the_ID(), 'live_url', true );
// security FAIL<a href="<?php echo $live_url; ?>">View</a>
Wednesday, 24 August, 11
Displaying Metadata$live_url = get_post_meta( get_the_ID(), 'live_url', true );
// security WIN<a href="<?php echo esc_url($live_url); ?>">View</a>
Wednesday, 24 August, 11
WP Security 1011. Never trust any user-submitted data
Wednesday, 24 August, 11
WP Security 1011. Never trust any user-submitted data
Wednesday, 24 August, 11
1. esc_ is the prefix for WP escaping functions.2. attr is the contexts. The available contexts are attr, html, js, sql,
url, url_raw, and textarea.3. _e is the optional translation suffix. The available suffixes for 2.8
are __, and _e. If you omit the suffix, no translation is performed, and your string is just returned.
Source: http://wp.me/p56-52 (Mark Jaquith)
Wednesday, 24 August, 11
WP Security 1011. Never trust any user-submitted data
2. Watch Mark Jaquith’s security presentation on WordPress.tv: http://wp.me/pllYY-1mO
Wednesday, 24 August, 11
Portfolio Archive Template archive-sd_portfolio.php
Wednesday, 24 August, 11
Portfolio Archive Template • Similar bits to the single portfolio item, but with
less detail
Wednesday, 24 August, 11
Portfolio Archive Template • Similar bits to the single portfolio item, but with
less detail
• Add JavaScript for the whooshy bits
Wednesday, 24 August, 11
Managing JS the WP Way<script src="http://example.com/file.js"></script>
Wednesday, 24 August, 11
Managing JS the WP Way<script src="http://example.com/file.js"></script>
Wednesday, 24 August, 11
Managing JS the WP Way// Your script name. Useful if you register first// and selectively load later.
wp_register_script( 'script-name', 'http://path/to/script.js', array('jquery'), '1.0', true );wp_enqueue_script( 'script-name' );
Wednesday, 24 August, 11
Managing JS the WP Way// URL of JS file.
wp_register_script( 'script-name', 'http://path/to/script.js', array('jquery'), '1.0', true );
Wednesday, 24 August, 11
Managing JS the WP Way// An array of possible dependencies. Optional.
wp_register_script( 'script-name', 'http://path/to/script.js', array('jquery'), '1.0', true );
Wednesday, 24 August, 11
Managing JS the WP Way// Version number of script. Optional.
wp_register_script( 'script-name', 'http://path/to/script.js', array('jquery'), '1.0', true );
Wednesday, 24 August, 11
Managing JS the WP Way// Load in footer. Optional (defaults to false).
wp_register_script( 'script-name', 'http://path/to/script.js', array('jquery'), '1.0', true );
Wednesday, 24 August, 11
Managing JS the WP Way$theme_url = get_stylesheet_directory_uri() . '/';wp_register_script( 'flexslider', $theme_url . 'jquery.flexslider-min.js', array('jquery'), '1.2', true );wp_register_script( 'portfolio-slideshow', $theme_url . 'slideshow.js', array('flexslider'), null, true );wp_enqueue_script( 'portfolio-slideshow' );
Wednesday, 24 August, 11
Review• Made a Child Theme
Wednesday, 24 August, 11
Review• Made a Child Theme
• Made a custom content type (post_type)
Wednesday, 24 August, 11
Review• Made a Child Theme
• Made a custom content type (post_type)
• Added and retrieved meta data (securely!)
Wednesday, 24 August, 11
Review• Made a Child Theme
• Made a custom content type (post_type)
• Added and retrieved meta data (securely!)
• Created a custom content type template
Wednesday, 24 August, 11
Review• Made a Child Theme
• Made a custom content type (post_type)
• Added and retrieved meta data (securely!)
• Created a custom content type template
• Added JS the WP Way
Wednesday, 24 August, 11
Hang Out With WP NerdsWinnipeg WordPress Meetup:
http://winnipegwpmeetup.wordpress.com/
Wednesday, 24 August, 11
Questions?
The code: https://github.com/mattwiebe/My-Portfolio-Theme
Matt Wiebe http://somadesign.ca/ @mattwiebe
Wednesday, 24 August, 11