38
WordPress Plugins: ur doin it wrong Will Norris <http://willnorris.com />

WordPress Plugins: ur doin it wrong

Embed Size (px)

DESCRIPTION

Slides from presentation at WordCamp Portland

Citation preview

Page 1: WordPress Plugins: ur doin it wrong

WordPress Plugins:ur doin it wrong

Will Norris <http://willnorris.com/>

Page 2: WordPress Plugins: ur doin it wrong
Page 3: WordPress Plugins: ur doin it wrong
Page 4: WordPress Plugins: ur doin it wrong
Page 5: WordPress Plugins: ur doin it wrong

Effect of Plugins

•Upgradability

•Performance

•Security

•Extensibility

Page 6: WordPress Plugins: ur doin it wrong

Unique Function Names

Page 7: WordPress Plugins: ur doin it wrong

Function Name Prefix

wcsea_activate()

wcsea_deactivate()

wcsea_uninstall()

Page 8: WordPress Plugins: ur doin it wrong

Class

class WordCampSEA {

function activate()

function deactivate()

function uninstall()

}

Page 9: WordPress Plugins: ur doin it wrong

Escape Values

Page 10: WordPress Plugins: ur doin it wrong

What do these have in common?

XSS

CSRF

SQL-injection

Page 11: WordPress Plugins: ur doin it wrong

Escape Values1. Standard prefix

2. Context (attr, html, js, sql, url, url_raw)

3. Optional translation suffix

http://markjaquith.wordpress.com/2009/06/12/escaping-api-updates-for-wordpress-2-8/

Page 12: WordPress Plugins: ur doin it wrong

Never Assume File Location

Page 13: WordPress Plugins: ur doin it wrong

Traditional Directory Layout

example.com/

wordpress/

wp-config.php

wp-content/

plugins/

themes/

Page 14: WordPress Plugins: ur doin it wrong

Non-Traditional Layout (since WP

2.6)example.com/

wordpress/

wp-config.php

wordpress-content/

plugins/

themes/

Page 15: WordPress Plugins: ur doin it wrong

Plugin URL

ur doin it wrong:<img src=”<?php bloginfo(‘wpurl’) ?>/wp-content/plugins/wcsea/logo.png” ?>

dats bedder:<img src=”<?php echo WP_PLUGIN_URL ?>/wcsea/logo.png ?>”/>

you haz it:<img src=”<?php echo plugins_url(‘logo.png’, __FILE__) ?>” />

Page 16: WordPress Plugins: ur doin it wrong

Plugin URL

plugins_url()

• supports WPMU plugin directory

• auto detects SSL

• supports renamed plugin directory

• calls ‘plugins_url’ filter

Page 17: WordPress Plugins: ur doin it wrong

Friends of plugins_url()

site_url()

admin_url()

includes_url()

content_url()

no home_url() (why not?)

Page 18: WordPress Plugins: ur doin it wrong

Including Files

ur doin it wrong:include ‘../../wp-content/...’

dats bedder:include ABSPATH . ‘wp-content/...’

you haz it:include WP_CONTENT_DIR . ‘/...’

Page 19: WordPress Plugins: ur doin it wrong

Find the Right Hook

Load as late as possible, but no later

Page 20: WordPress Plugins: ur doin it wrong

Admin Hooks

ur doin it wrong:add_action(‘admin_init’, ‘wcsea_admin_init’)

add_action(‘admin_head’, ‘wcsea_admin_head’)

you haz it:$hookname = add_options_page( ... )

add_action(“admin_load-$hookname”, ‘wcsea_admin_init’)

add_action(“admin_head-$hookname”, ‘wcsea_admin_head’)

Page 21: WordPress Plugins: ur doin it wrong

Styles and Scripts

ur doin it wrong:<script rel=”<?php echo plugins_url(‘wcsea.js’, __FILE__) ?>”></script>

you haz it:wp_enqueue_script(‘wcsea’, plugins_url(‘wcsea.js’, __FILE__))

wp_enqueue_style(‘wcsea’, plugins_url(‘wcsea.css’, __FILE__))

Page 22: WordPress Plugins: ur doin it wrong

Styles and Scriptswp_register_* and wp_enqueue_*

• support dependencies

• push scripts to footer

• caching support based on version

• (one day) server side concatenation

Page 23: WordPress Plugins: ur doin it wrong

Add your own hooks

A strategically placed hook covers a multitude of sins.

Page 24: WordPress Plugins: ur doin it wrong

Custom Hooks

Can do everything core WP hooks do:

• event notification (actions)

• massage data (the_content)

• replace values (stylesheet)

• extend functionality (http_api_curl)

• replace functionality

Page 25: WordPress Plugins: ur doin it wrong

Custom Hooks

do_action(‘my-action’)

do_action(‘my-action’, $a, $b)

do_action_ref_array(‘my-action’, array($wcsea))

apply_filters(‘my-filter’, $wcsea)

apply_filters(‘my-filter’, $wcsea, $a, $b)

Page 26: WordPress Plugins: ur doin it wrong

Custom Tables

Page 27: WordPress Plugins: ur doin it wrong

Designed for Flexibility

WordPress database supports

• custom options

• arbitrary metadata for posts, users, and comments (2.9)

• custom taxonomies

• custom post types

Page 28: WordPress Plugins: ur doin it wrong

Custom Post Types

Used by WordPress core for

• posts

• pages

• revisions

• attachments

Page 29: WordPress Plugins: ur doin it wrong

If it walks like a duck...

• author

• date and time

• title

• content

• comments

• categories and tags

• permalink

• order

• hierarchy

• (additional arbitrary metadata)

Page 30: WordPress Plugins: ur doin it wrong

Admin Settings Pages

Page 31: WordPress Plugins: ur doin it wrong

Admin Settings Pages

Don’t waste time processing manuallyregister_setting( ‘wcsea’, ‘my-option’ )

http://codex.wordpress.org/Settings_API

http://codex.wordpress.org/Creating_Options_Pages#Register_Settings

Page 32: WordPress Plugins: ur doin it wrong

Admin Settings Pages

Do you really need a dedicated page?

Add options to any built-in settings pageadd_settings_field( ... )

Page 33: WordPress Plugins: ur doin it wrong

Direct Plugin Files

Page 34: WordPress Plugins: ur doin it wrong

Direct Plugin File Calls

Direct HTTP request to plugin file ajax.php:

echo ‘<script type=”text/javascript”>

jQuery.get(“‘ . plugins_url(‘ajax.php’, __FILE__) . ‘”);

// do something with AJAX data

</script>’;

Page 35: WordPress Plugins: ur doin it wrong

Direct Plugin File Calls

If ajax.php includes anything similar to:require_once(‘../../../wp-load.php’);

ur doin it wrong

Page 36: WordPress Plugins: ur doin it wrong

WordPress Requests

Permalink URL:http://example.com/2009/01/hello-world

becomes:http://example.com/index.php?

year=2009&

monthnum=01&

name=hello-world

Page 37: WordPress Plugins: ur doin it wrong

Custom WP Request

Instead of making an AJAX call to:http://example.com/wp-content/plugins/wcsea/ajax.php

we want a URL like:http://example.com/index.php?wcsea=ajax-handler

Page 38: WordPress Plugins: ur doin it wrong

Custom WP Requests

function wcsea_parse_request($wp) {

// only process requests with "wcsea=ajax-handler"

if (array_key_exists('wcsea', $wp->query_vars)

&& $wp->query_vars['wcsea'] == 'ajax-handler') {

// process the request.

}

}

add_action('parse_request', 'wcsea_parse_request');

function wcsea_query_vars($vars) {

$vars[] = 'wcsea';

return $vars;

}

add_filter('query_vars', 'wcsea_query_vars');