Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Power Your Portfolio With WordPress

Matt Wiebe
September 26, 2011

Power Your Portfolio With WordPress

In this intermediate step-by-step session, you'll learn how to bend WordPress to your will by building a WordPress-powered portfolio. You'll learn WordPress development techniques that boost your productivity and will make your life easier. This session is targeted toward code-savvy designers who are already familiar with WordPress and want to take their skills to the next level, and developers who are looking to strengthen their WordPress chops.

Matt Wiebe

September 26, 2011
Tweet

More Decks by Matt Wiebe

Other Decks in Programming

Transcript

  1. Knowledge. • Make a Child Theme • Make a custom

    content type Wednesday, 24 August, 11
  2. Knowledge. • Make a Child Theme • Make a custom

    content type • Add and retrieve meta data Wednesday, 24 August, 11
  3. 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
  4. 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
  5. 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
  6. 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
  7. Portfolios Need Items add_action('init', 'sd_init'); function sd_init { $args =

    array(); register_post_type('sd_portfolio', $args); } Wednesday, 24 August, 11
  8. Crash Course in Hooks • The foundation of WP’s plugin

    system • ACTIONS run at various points Wednesday, 24 August, 11
  9. Action Hook Example add_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
  10. 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
  11. Filter Hook Example add_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
  12. 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
  13. $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
  14. $args = array( 'has_archive' => 'portfolio' ); // Sets URL

    for all portfolio items // example.com/portfolio/ register_post_type $args Wednesday, 24 August, 11
  15. $args = array( 'labels' => array( 'name' => 'Portfolio Items'

    'singular_name' => 'Portfolio Item', // more labels can be set ) ); register_post_type $args Wednesday, 24 August, 11
  16. $args = array( // Show on front end 'public' =>

    true, // Show the admin UI 'show_ui' => true ); register_post_type $args Wednesday, 24 August, 11
  17. 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
  18. Custom Image Sizes // in your functions.php add_image_size('sd_portfolio', 1000, 500,

    true); // in your theme the_post_thumbnail('sd_portfolio'); Wednesday, 24 August, 11
  19. There’s More to a Portfolio Than a Title & an

    Image Wednesday, 24 August, 11
  20. More Portfolio Info • Work Done • Agency (if you’re

    a freelancer) • URL of finished work • Client quote • Other? Wednesday, 24 August, 11
  21. 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 this if ( isset($_POST['live_url']) ) { update_post_meta(get_the_ID(), 'live_url', $_POST['live_url']); } } Wednesday, 24 August, 11
  22. 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
  23. $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 metabox new Tribe_Meta_Box($meta_box); Wednesday, 24 August, 11
  24. • archive-sd_portfolio.php • 10 most recent portfolio items • single-sd_portfolio.php

    • a single portfolio item Theme It. Wednesday, 24 August, 11
  25. Loop Refresher while ( have_posts() ) : the_post(); // do

    some HTML + template_tags // title, featured image, metadata... endwhile; Wednesday, 24 August, 11
  26. Single Portfolio Item // in loop // featured image the_post_thumbnail('your_image_id');

    // add_image_size('your_image_id'); Wednesday, 24 August, 11
  27. Displaying Metadata // the current post's ID $live_url = get_post_meta(

    get_the_ID(), 'live_url', true ); Wednesday, 24 August, 11
  28. Displaying Metadata // the meta key (set previously) $live_url =

    get_post_meta( get_the_ID(), 'live_url', true ); Wednesday, 24 August, 11
  29. 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
  30. 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
  31. 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
  32. 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
  33. WP Security 101 1. 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
  34. Portfolio Archive Template • Similar bits to the single portfolio

    item, but with less detail Wednesday, 24 August, 11
  35. Portfolio Archive Template • Similar bits to the single portfolio

    item, but with less detail • Add JavaScript for the whooshy bits Wednesday, 24 August, 11
  36. 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
  37. 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
  38. 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
  39. 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
  40. 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
  41. 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
  42. Review • Made a Child Theme • Made a custom

    content type (post_type) Wednesday, 24 August, 11
  43. Review • Made a Child Theme • Made a custom

    content type (post_type) • Added and retrieved meta data (securely!) Wednesday, 24 August, 11
  44. 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
  45. 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