WordPress as an application framework

Preview:

Citation preview

WordPress as an

Application Framework

Dustin Filippini Developer @ WebDevStudios

@dustyf dustyf.com

WWhat Makes a Framework Good?

• Easy

• Well Supported

• Extensible

EASYIt does workfor you

WellSupportedWe are here to help!

ExtensibleAdd on More Dogs

A Real World ExampleCreate a billing/invoicing system using WordPress!

Think… FreshBooks

“I need an easy, reusable way to store, access, and categorize structured data”

Custom Post Types & Custom Taxonomies.

function register_invoice() { $args = array( 'public' => true, 'label' => 'Invoices' ); register_post_type( 'invoice',$args ); } add_action(‘init','register_invoice');

function create_invoice_status() { register_taxonomy( 'status', 'invoice', array( 'label' => ‘Invoice Status', 'rewrite' => array( 'slug' => ‘invoice_status' ), 'hierarchical' => false, ) ); } add_action( 'init', ‘create_invoice_status' );

“I need to store data related to my structured

data and users.”

Post Meta and User Meta.

update_post_meta( $post_id, ‘purchase_order_number’, $value );

update_user_meta( $user_id, ‘job_title’, $value );

“I need users to be able to access

data and limit access to

different users”

Create users and assign roles and capabilities to access different parts of

your application.

Built-in User Management panel and ability to manipulate through your code.

ADD A NEW ROLE

add_role( ‘client', ‘Client', array( 'read' => true, 'edit_posts' => true, ) );

ADD A CAPABILITY TO THE ROLE

$role = get_role( ‘client' ); $role->add_cap( ‘view_invoices’ );

RESTRICT ACTION

if ( current_user_can( ‘view_invoices’ ) { // Do Something

}

“I need to create custom views for different

types of data"

Templating through WordPress Theme API.

Allows you to define different templates for different types

of content and views.

BASIC WORDPRESS PAGE LOOP

get_header(); if (have_posts()) : while (have_posts()) : the_post(); the_content(); endwhile; endif; get_sidebar(); get_footer();

TEMPLATE FILE NAMING

single-invoices.php - Single Invoice View archive-invoices.php - Archive of Invoices

LOADING CUSTOM TEMPLATES

get_template_part( 'loop', 'index' );

will do a PHP require() for the first file that exists among these, in this priority:

wp-content/themes/themename/loop-index.php wp-content/themes/themename/loop.php

“I need to customize

default actions of my app”

WordPress has hooks for nearly everything that happens.

Use ‘add_action’ to do execute custom code at a certain time.

Use ‘add_filter’ to change default values.

function email_invoice( $post_id ) { $to = ‘dusty@dustyf.com’; $subject = get_the_title( $post_id ); $message = get_the_permalink( $post_id );

wp_mail( $to, $subject, $message ); } add_action(‘save_post’,‘email_invoice’);

function mod_title( $title, $post_id ) { if ( ‘invoice’ == get_post_type($post_id) &&

has_term( ‘paid’, ‘invoice_status’, $post_id

) { $title = ‘PAID: ‘ . $title;

} return $title;

} add_filter( ‘the title’, ‘mod_title’, 10, 2 );

“I need easy, secure, access

to the database”

The wpdb class provides easy, secure database

interaction for those times you need it.

global $wpdb;

$results = $wpdb->get_results( 'SELECT * FROM wp_options WHERE option_id = 1');

$wpdb->insert( ‘payments_made', array( 'client' => 'Apple', ‘invoice_num' => 123 ), array( '%s', '%d' ) );

// PROTECT FROM SQL INJECTION

$metakey = ‘purchase_order_num’; $metavalue = ‘12345’; $wpdb->query( $wpdb->prepare( "INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) VALUES ( %d, %s, %s )", 10, $metakey, $metavalue ) );

“I need to have a reliable way

to rewrite URLs”

WordPress rewrites posts, pages, taxonomies, and

custom post types by default. But, you can use the Rewrite API to make

custom rules.

function custom_rewrite() { add_rewrite_rule('^invoice/([0-9]+)/?', 'index.php?page_id=$matches[1]', 'top'); } add_action(‘init','custom_rewrite');

Now, you can access the same page as http://example.com/invoice/95

“Different app instances for

different users/clients/

companies.”

WordPress multisite allows you to create multiple site/app instances. Each can share or have different

functionality, views, settings, userbases, and more.

Add the following to your wp-config.php and follow the instructions in wp-admin under Settings > Network Setup

define( 'WP_ALLOW_MULTISITE', true );

Use Case: Each company using this invoice system can have their own instance at their own url…

google.example.com or example.com/google

“I need to be able to connect with third-party

services”

Built in HTTP API supports multiple transport methods

for your HTTP requests because different hosting

environments support different things.

$response = wp_remote_post( $url, array( 'method' => 'POST', 'timeout' => 45, 'redirection' => 5, 'httpversion' => '1.0', 'blocking' => true, 'headers' => array(), 'body' => array( 'username' => 'bob', 'password' => '1234xyz' ), 'cookies' => array() ) );

$response returns a nice array

AlSO: wp_remote_request() wp_remote_get() wp_remote_post() wp_remote_head() wp_remote_retrieve_body() wp_remote_retrieve_header() wp_remote_retrieve_headers() wp_remote_retrieve_response_code() wp_remote_retrieve_response_message()

“I need to improve

performance by limiting requests”

Transients allow you quickly store data with an expiration

for quick access.

Get more in depth with caching plugins.

set_transient( ‘special_query’, $special_query, 60*60*12

);

get_transient( 'special_query' );

//EXAMPLE

if ( false === ( $special_query = get_transient( 'special_query' ) ) ) {

$special_query_results = new WP_Query( 'cat=5&order=random&tag=tech&post_meta_key=thumbnail' );

set_transient( 'special_query', $special_query, 4 * HOUR_IN_SECONDS

); }

- get_transient - set_transient - wp_cache_set - wp_cache_get

“I need to be able to open

my application to third parties”

Create an API for your app using the XML-RPC API or the new JSON REST API

JSON REST API will be in WP Core soon, but is now available in a stable plugin.

Out of the box provides:

• Endpoints for retrieving, creating, editing, and deleting all built-in post types and registered custom post types

• Also, media, users, taxonomies and meta

• Can be extended to support your other types of data

“I don’t want to create things that have been done

hundreds of times before”

Thousands of WordPress Plugins both free and

premium. Also, feel free to use other PHP Libraries.

35,000+ Free Plugins at wordpress.org/plugins/ and many great premium plugins. BuddyPress - Social Network BBPress - Forums BadgeOS - Award Achievements CMB2 - Custom Fields and Metaboxes Gravity Forms - Form Building Posts 2 Posts - Relational post linking WooCommerce - eCommerce Events Calendar Pro - Calendar

Or build your own to use over and over (or to share or sell!)

MOAREXAMPLES

WordPress is being used as an application framework all

over the web.

Reactor by AppPresser (http://reactor.apppresser.com/) WP Powered application that builds mobile applications from your WP site.

DesktopServer 4.0 (http://serverpress.com/) Desktop application to create local development sites.

ManageWP (http://managewp.com/) Upgrade, perform backups, monitor, track statistics, and manage multiple WP sites.

YMCA Y-MVP App (http://www.ymcanyc.org/association/pages/y-mvp) iPad application used as a kiosk at YMCA to allow members to scan card and log exercise activities.

Frito-Lay Project Management (http://liftux.com/portfolio/frito-lay-creative-project-management-app/) Custom project management app.

Easy

WellSupported

Extensible

Go Forth& Create Apps

Dustin Filippini dusty@dustyf.com @dustyf

dustyf.com webdevstudios.com

Recommended