http://wonderflux.com@jonnyauk http://tancdesign.com
DESIGNING
WITH DATA
Jonny Allbutโ€จ
Director & Head of Digital
http://wonderflux.com@jonnyauk http://tancdesign.com
WordCamp Bournemouth 2014
http://wonderflux.com@jonnyauk http://tancdesign.com
HOWDY!
โ€ข Working with WordPress since 2004.
โ€ข Involved in WPUK group & co-organiserโ€จ
of Birmingham WordPress user group.
โ€ข Likes to share:
โ€ข Wonderflux - free GPL theme frameworkโ€จ
http://wonderflux.com
โ€ข WP-CMS Post Control - control post editing capabilitiesโ€จ
http://wordpress.org/plugins/wp-cms-post-control
http://wonderflux.com@jonnyauk http://tancdesign.com
GET SMART(ER) WITH THEMES
โ€ข Content detection can be brittle.
โ€ข More creative flexibility.
โ€ข A bespoke editing experience.
โ€ข Accommodating future development.
http://wonderflux.com@jonnyauk http://tancdesign.com
STRUCTURE YOUR DATA
โ€ข Identify โ€˜contentโ€™ and โ€˜designโ€™ elements.
โ€ข What needs to be editable?
โ€ข What needs to be queried?
โ€ข How will you achieve the design requirements?
http://wonderflux.com@jonnyauk http://tancdesign.com
STRUCTURE: DATA ATTRIBUTES
โ€ข Page/post hierarchy
โ€ข Post types/formats
โ€ข Tags/categories
โ€ข Custom taxonomies
โ€ข Custom fields
โ€ข Images/attachments
http://wonderflux.com@jonnyauk http://tancdesign.com
STRUCTURE: DESIGN ATTRIBUTES
โ€ข General static(ish) design/structure
โ€ข Editable WordPress Menus
โ€ข Editable Widget areas
โ€ข Archive views
http://wonderflux.com@jonnyauk http://tancdesign.com
THEME FILE ORGANISATION
โ€ข The theme file hierarchy/cascade:โ€จ
http://codex.wordpress.org/Template_Hierarchy
โ€ข Post types
โ€ข Archive/taxonomy/term
โ€ข get_template_part()
http://wonderflux.com@jonnyauk http://tancdesign.com
CREDIT: Michelle Schulp: http://marktimemedia.com/redesigning-the-template-hierarchy
http://wonderflux.com@jonnyauk http://tancdesign.com
CREDIT: Michelle Schulp: http://marktimemedia.com/redesigning-the-template-hierarchy
http://wonderflux.com@jonnyauk http://tancdesign.com
TAXONOMY ARCHIVE EXAMPLE
โ€ข Taxonomy: colour
โ€ข Terms: red, green, blue
โ€ข File cascade:
1. taxonomy-colour-red.php
2. taxonomy-colour.php
3. taxonomy.php
http://wonderflux.com@jonnyauk http://tancdesign.com
BASICS: CONTENT DETECTION
โ€ข CSS
โ€ข Body class
โ€ข Post class
โ€ข PHP
โ€ข Post ID/query vars
โ€ข is_page() is_archive() etc!
โ€ข Has post image
โ€ข Has widgets
http://wonderflux.com@jonnyauk http://tancdesign.com
CONTENT DETECTION: CSS
<body <?php body_class(); ?>>
<body class="browser-chrome home page page-id-10 โ€จ
page-template-default content-no-sidebar-1 width-950โ€>
!
add_filter('body_class','ja_filter_body_class');
function ja_filter_body_class($classes) {โ€จ
$classes[] = โ€˜custom-class-name';โ€จ
return $classes;โ€จ
}
http://wonderflux.com@jonnyauk http://tancdesign.com
CONTENT DETECTION: CSS
<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<div id="post-310" class="post-310 post type-post status-publish format-
standard hentry category-branding-design category-events-and-conferences
category-work single-post">
!
add_filter('post_class','ja_filter_post_class');
function ja_filter_post_class($classes) {โ€จ
$classes[] = 'custom-class-name';โ€จ
return $classes;โ€จ
}
http://wonderflux.com@jonnyauk http://tancdesign.com
CONTENT DETECTION: PHP
function ja_add_help_links() {โ€จ
if (!is_page(โ€˜helpโ€™)) return;โ€จ
global $post;โ€จ
$mypages = get_pages( array( โ€จ
'child_of' => $post->ID, โ€จ
'sort_column' => 'title', โ€จ
'sort_order' => 'desc' โ€จ
) );โ€จ
foreach( $mypages as $page ) {โ€จ
echo '<p><a href=โ€œ' . get_permalink( $page->ID ) . 'โ€>โ€™;โ€จ
echo esc_html( $page->post_title ) . '</a></p>';โ€จ
}โ€จ
}
http://wonderflux.com@jonnyauk http://tancdesign.com
OTHER PAGE STRUCTURE FUNCTIONS
โ€ข get_page_hierarchy()โ€จ
http://codex.wordpress.org/get_page_hierarchy
โ€ข get_page_children()โ€จ
http://codex.wordpress.org/get_page_children
โ€ข get_ancestors( $object_id, $object_type )โ€จ
http://codex.wordpress.org/get_ancestors
http://wonderflux.com@jonnyauk http://tancdesign.com
CONTENT DETECTION: PHP
has_post_thumbnail( $post_id );
// Must be inside a loop if no ID supplied.โ€จ
if ( has_post_thumbnail() ) {โ€จ
the_post_thumbnail();โ€จ
} else {โ€จ
echo '<img src="' .โ€จ
get_bloginfo( 'stylesheet_directory' ) .โ€จ
'/images/thumbnail-default.jpg" />';โ€จ
}
http://wonderflux.com@jonnyauk http://tancdesign.com
CONTENT DETECTION: PHP
get_the_post_thumbnail( $post_id )
// Must be inside a loop if no ID set.โ€จ
if ( empty(get_the_post_thumbnail()) ) {โ€จ
// Do some fallbackโ€จ
}
http://wonderflux.com@jonnyauk http://tancdesign.com
CONTENT DETECTION: PHP
is_active_sidebar( $name-or-id );
โ€จ
if ( is_active_sidebar( 'primary-sidebar' ) ) :โ€จ
echo โ€˜<div class=โ€œprimary-widget-contentโ€œ>โ€™;โ€จ
dynamic_sidebar( 'primary-sidebar' ); ?>โ€จ
echo โ€˜</div>โ€™;โ€จ
endif;
http://wonderflux.com@jonnyauk http://tancdesign.com
MORE ADVANCED USES OF DATA
โ€ข Page/post hierarchy
โ€ข Taxonomies
โ€ข Custom fields
โ€ข Altering queries
http://wonderflux.com@jonnyauk http://tancdesign.com
INTERACTING WITH QUERIES
function ja_query_taxo_country_region( $query ) {โ€จ
if ( !is_admin() && $query->is_main_query() && is_tax( 'country_region' ) ) {
$query->set( 'posts_per_page', -1 );โ€จ
$query->set( 'orderby', 'title' );โ€จ
$query->set( 'order', 'ASC' );โ€จ
return;โ€จ
}โ€จ
}โ€จ
add_action( 'pre_get_posts', โ€˜ja_query_taxo_country_regionโ€™ );
http://wonderflux.com@jonnyauk http://tancdesign.com
INTERACTING WITH QUERIES
function ja_query_taxo_order_events($query) {
if ( !is_admin() && $query->is_main_query() && $query->is_tax('genre') ) {
//Get original meta query
$meta_query = $query->get('meta_query');
!
$query->set( 'meta_key', 'event_date_start' );
$query->set( 'orderby', 'meta_value' );
$query->set( 'order', 'ASC' );
!
//Add our meta query to the original meta queries
$meta_query[] = array(
โ€˜key' => 'event_date_start',โ€จ
'value' => date('Y-m-d' ),
'compare' => '>='
);
!
$query->set('meta_query',$meta_query);
}
}
add_action('pre_get_posts','ja_query_taxo_order_events', 1 );
http://wonderflux.com@jonnyauk http://tancdesign.com
DATA USE EXAMPLE: FILTERING
http://wonderflux.com@jonnyauk http://tancdesign.com
DATA USE EXAMPLE: CUSTOM FIELDS
http://wonderflux.com@jonnyauk http://tancdesign.com
DATA USE EXAMPLE: TAXONOMIES
http://wonderflux.com@jonnyauk http://tancdesign.com
DATA USE EXAMPLE: TAXONOMIES
http://wonderflux.com@jonnyauk http://tancdesign.com
DATA USE EXAMPLE: FILTERING
http://wonderflux.com@jonnyauk http://tancdesign.com
DATA USE EXAMPLE: FILTERING
http://wonderflux.com@jonnyauk http://tancdesign.com
USER INPUT OF DATA
โ€ข WordPress metaboxes:โ€จ
http://codex.wordpress.org/Function_Reference/add_meta_box
โ€ข ACF and Pods pluginsโ€ฆ if you really have to:โ€จ
https://wordpress.org/plugins/advanced-custom-fieldsโ€จ
http://wordpress.org/plugins/pods
โ€ข Learn to make your ownโ€ฆ itโ€™s worth it!
http://wonderflux.com@jonnyauk http://tancdesign.com
DONโ€™T TRUST USER DATA!
โ€ข Validate user input - donโ€™t let them break it!
โ€ข Always escape output to stop nasties!
โ€ข Escape late, so you know the data is safe on output.
โ€ข Use $wpdb class if you are interacting with database.
โ€ข Reference:โ€จ
http://codex.wordpress.org/Validating_Sanitizing_and_Escaping_User_Data
http://wonderflux.com@jonnyauk http://tancdesign.com
USER DATA: STRICT WHITELIST
$accept_values = array( โ€˜fineโ€™, โ€˜goodโ€™, โ€˜dandyโ€™ );
if ( in_array( $user_data, $accept_values ) ){โ€จ
//Data input acceptableโ€จ
} else {โ€จ
// Data input not acceptableโ€จ
}
http://wonderflux.com@jonnyauk http://tancdesign.com
USER DATA: IS EMAIL?
if ( is_email( โ€˜jonny@example.comโ€™ ) ){โ€จ
//Data input acceptableโ€จ
} else {โ€จ
// Data input not acceptableโ€จ
}
http://wonderflux.com@jonnyauk http://tancdesign.com
USER DATA: LIMITED HTML INPUT
wp_kses_post( $user_data );
http://wonderflux.com@jonnyauk http://tancdesign.com
USER DATA: JUST BASIC TEXT
sanitize_text_field( $user_data );
http://wonderflux.com@jonnyauk http://tancdesign.com
USER DATA OUTPUT: ESCAPING
โ€ข esc_html()
โ€ข esc_textarea()
โ€ข sanitize_html_class()
โ€ข esc_attr()
โ€ข esc_js()
โ€ข esc_url()
โ€ข esc_url_raw()
โ€ข __, _e and _x for esc_html() and esc_attr
http://wonderflux.com@jonnyauk http://tancdesign.com
USER INPUT: EXAMPLE
http://wonderflux.com@jonnyauk http://tancdesign.com
USER INPUT: EXAMPLE
http://wonderflux.com@jonnyauk http://tancdesign.com
USER INPUT: EXAMPLE
http://wonderflux.com@jonnyauk http://tancdesign.com
USER INPUT: EXAMPLE
http://wonderflux.com@jonnyauk http://tancdesign.com
FOOD FOR THOUGHTโ€ฆ
โ€ข Extra CSS classes/colourways/layout configuration.
โ€ข Extra/manipulate template parts.
โ€ข Build associations between different types of content.
โ€ข Exclude/manipulate in queries.
โ€ข WP-API.
โ€ข WordPress metabox API.
http://wonderflux.com@jonnyauk http://tancdesign.com
DESIGNING
WITH DATA
Jonny Allbutโ€จ
Director & Head of Digital
http://wonderflux.com@jonnyauk http://tancdesign.com
WordCamp Bournemouth 2014

WordCamp Bournemouth 2014 - Designing with data in WordPress