Hooks WCSD12

Preview:

DESCRIPTION

Basic to intermediate skills for WordPress hooks (actions and filters).

Citation preview

WordPress HooksActions and Filters

WordCamp San Diego 2012

Jeffrey Zinn

ocean goer, wordpress fanboy, avid backpacker, euro gamer, soccer hooligan, voracious coffee drinker

• co-founder of pixel jar• wordcamp oc co-organizer• adsanity co-developer• @jeffreyzinn• jeff@jzinn.us

What are Hooks?• Actions - Actions are the hooks that the WordPress core

launches at specific points during execution, or when specific events occur. Your plugin can specify that one or more of its PHP functions are executed at these points, using the Action API.

• Filters - Filters are the hooks that WordPress launches to modify text of various types before adding it to the database or sending it to the browser screen. Your plugin can specify that one or more of its PHP functions is executed to modify specific types of text at these times, using the Filter API.

Wait...What are Hooks?

•Actions - Do Stuff

•Filters - Change Stuff

Why Hooks?

• Crack into code without editing core files

• Let others alter your work

HypotheticalLet’s say we were desperate for a widget to place in our sidebar that displays the word “awesome.”

Basic Awesome Widget

activate

Basic Awesome Widget

activate

sidebar

Basic Awesome Widget

activate

sidebar

test

HypotheticalUpon further consideration you realize this widget is sorely lacking in puppy pictures. Now what? Let’s look in the code...

Basic Widget Codepublic function widget( $args, $instance ) {

extract( $args ); $title = $instance['title'];

echo $before_widget; if ( ! empty( $title ) ) echo $before_title . $title . $after_title; echo '<h2>awesome</h2>'; echo $after_widget;}

Basic Widget Codepublic function widget( $args, $instance ) {

extract( $args ); $title = $instance['title'];

echo $before_widget; if ( ! empty( $title ) ) echo $before_title . $title . $after_title; echo '<h2>awesome</h2>'; echo $after_widget;}

Deluxe Awesome Widget

widgetsame

Deluxe Widget Codepublic function widget( $args, $instance ) { extract( $args ); $title = apply_filters( 'widget_title', $instance['title'] );

echo $before_widget; if ( ! empty( $title ) ) echo $before_title . $title . $after_title; do_action( 'before_awesome_widget' ); echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' ); do_action( 'after_awesome_widget' ); echo $after_widget;}

Deluxe Widget Codepublic function widget( $args, $instance ) { extract( $args ); $title = apply_filters( 'widget_title', $instance['title'] );

echo $before_widget; if ( ! empty( $title ) ) echo $before_title . $title . $after_title; do_action( 'before_awesome_widget' ); echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' ); do_action( 'after_awesome_widget' ); echo $after_widget;}

Deluxe Widget Codepublic function widget( $args, $instance ) { extract( $args ); $title = apply_filters( 'widget_title', $instance['title'] );

echo $before_widget; if ( ! empty( $title ) ) echo $before_title . $title . $after_title; do_action( 'before_awesome_widget' ); echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' ); do_action( 'after_awesome_widget' ); echo $after_widget;}

filter!

Deluxe Widget Codepublic function widget( $args, $instance ) { extract( $args ); $title = apply_filters( 'widget_title', $instance['title'] );

echo $before_widget; if ( ! empty( $title ) ) echo $before_title . $title . $after_title; do_action( 'before_awesome_widget' ); echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' ); do_action( 'after_awesome_widget' ); echo $after_widget;}

action!

filter!

Deluxe Widget Codepublic function widget( $args, $instance ) { extract( $args ); $title = apply_filters( 'widget_title', $instance['title'] );

echo $before_widget; if ( ! empty( $title ) ) echo $before_title . $title . $after_title; do_action( 'before_awesome_widget' ); echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' ); do_action( 'after_awesome_widget' ); echo $after_widget;}

action!

filter!

filter!

Deluxe Widget Codepublic function widget( $args, $instance ) { extract( $args ); $title = apply_filters( 'widget_title', $instance['title'] );

echo $before_widget; if ( ! empty( $title ) ) echo $before_title . $title . $after_title; do_action( 'before_awesome_widget' ); echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' ); do_action( 'after_awesome_widget' ); echo $after_widget;}

action!

action!

filter!

filter!

Actions

• do_action() - Creates a hook for attaching actions via add_action()

• add_action() - Hooks a function onto a specific action created with do_action()

• remove_action() - Removes a function attached to a specified action hook

(do stuff)

Actions: do_action()

• $tag - (string) (required) The name of the hook you wish to create.Default: None

• $arg - (mixed) (optional) The list of arguments this hook accepts.Default: ''

do_action( $tag, $arg, $extra_arg );

...their code...

Actions: add_action()

• $tag - (string) (required) The name of the action you wish to hook onto. Default: None

• $function_to_add - (callback) (required) The name of the function you wish to be called. Default: None

• $priority - (int) (optional) How important your function is. Alter this to make your function be called before or after other functions. Default: 10

• $accepted_args - (int) (optional) How many arguments your function takes. Default: 1

add_action( $tag, $function_to_add, $priority, $accepted_args );

...our code...

Deluxe Widget Codepublic function widget( $args, $instance ) { extract( $args ); $title = apply_filters( 'widget_title', $instance['title'] );

echo $before_widget; if ( ! empty( $title ) ) echo $before_title . $title . $after_title; do_action( 'before_awesome_widget' ); echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' ); do_action( 'after_awesome_widget' ); echo $after_widget;}

Deluxe Widget Codepublic function widget( $args, $instance ) { extract( $args ); $title = apply_filters( 'widget_title', $instance['title'] );

echo $before_widget; if ( ! empty( $title ) ) echo $before_title . $title . $after_title; do_action( 'before_awesome_widget' ); echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' ); do_action( 'after_awesome_widget' ); echo $after_widget;}

Deluxe Widget Codepublic function widget( $args, $instance ) { extract( $args ); $title = apply_filters( 'widget_title', $instance['title'] );

echo $before_widget; if ( ! empty( $title ) ) echo $before_title . $title . $after_title; do_action( 'before_awesome_widget' ); echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' ); do_action( 'after_awesome_widget' ); echo $after_widget;}

action!

add_action( ‘before_awesome_widget’, ‘puppy’ );

function puppy() {$src = 'http://placedog.com/g/188/150';echo '<img src="' . $src . '" />';

}

...in your functions.php script....

which action? which function of ours?

do_action( 'before_awesome_widget' );

add_action( ‘before_awesome_widget’, ‘puppy’ );

function puppy() {$src = 'http://placedog.com/g/188/150';echo '<img src="' . $src . '" />';

}

...in your functions.php script....

which action? which function of ours?

do_action( 'before_awesome_widget' );

add_action( ‘before_awesome_widget’, ‘puppy’ );

function puppy() {$src = 'http://placedog.com/g/188/150';echo '<img src="' . $src . '" />';

}

...in your functions.php script....

which action? which function of ours?

do_action( 'before_awesome_widget' );

Use a unique function name

add_action( ‘before_awesome_widget’, ‘puppy’ );function puppy() {

$src = 'http://placedog.com/g/188/150';echo '<img src="' . $src . '" />';

}

add_action( ‘before_awesome_widget’, ‘warning’ );function warning() {

echo '<p>Warning: puppies!</p>';}

...in your functions.php script....

Multiple Calls to Action

Multiple Calls to Action

Multiple Calls to Action

Action: before_awesome_widgetFunction: puppy

Multiple Calls to Action

Action: before_awesome_widgetFunction: puppy

Action: before_awesome_widgetFunction: warning

$priority (default 10)

...in your functions.php script....

Ordering Actionsadd_action( ‘before_awesome_widget’, ‘puppy’, 2 );function puppy() {

$src = 'http://placedog.com/g/188/150';echo '<img src="' . $src . '" />';

}

add_action( ‘before_awesome_widget’, ‘warning’, 1 );function warning() {

echo '<p>Warning: puppies!</p>';}

Ordering Actions

Ordering ActionsAction: before_awesome_widgetFunction: warningPriority: 1

Ordering ActionsAction: before_awesome_widgetFunction: warningPriority: 1

Action: before_awesome_widgetFunction: puppyPriority: 2

remove_action( $tag, $function_to_remove, $priority, $accepted_args );

remove_action( 'before_awesome_widget', 'warning', 1 );

Actions: remove_action()

remove_action( $tag, $function_to_remove, $priority, $accepted_args );

remove_action( 'before_awesome_widget', 'warning', 1 );

Be as specific as the original action

Actions: remove_action()

Deluxe Widget Codepublic function widget( $args, $instance ) { extract( $args ); $title = apply_filters( 'widget_title', $instance['title'] );

echo $before_widget; if ( ! empty( $title ) ) echo $before_title . $title . $after_title; do_action( 'before_awesome_widget' ); echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' ); do_action( 'after_awesome_widget' ); echo $after_widget;}

Deluxe Widget Codepublic function widget( $args, $instance ) { extract( $args ); $title = apply_filters( 'widget_title', $instance['title'] );

echo $before_widget; if ( ! empty( $title ) ) echo $before_title . $title . $after_title; do_action( 'before_awesome_widget' ); echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' ); do_action( 'after_awesome_widget' ); echo $after_widget;}

filter!

Filters

• apply_filters() - Calls the functions added to a filter hook via add_filter()

• add_filter() - Hooks a function onto a specific filter action created with add_filters()

• remove_filter() - Removes a function attached to a specified filter action hook

(change text)

Filters: apply_filters()

• $tag - (string) (required) The name of the filter hook.Default: None

• $value - (mixed) (required) The value which the filters hooked to $tag may modify.Default: None

• $var - (mixed) (optional) One or more additional variables passed to the filter functions.Default: None

apply_filters( $tag, $value, $var ... );

Filters: add_filter()

• $tag - (string) (required) The name of the filter to hook the $function_to_add to. Default: None

• $function_to_add - (callback) (required) The name of the function to be called when the filter is applied. Default: None

• $priority - (int) (optional) Used to specify the order in which the functions associated with a particular action are executed. Functions with the same priority are executed in the order in which they were added to the action. Default: 10

• $accepted_args - (int) (optional) Number of arguments the function(s) accept(s). Default: 1

add_filter( $tag, $function_to_add, $priority, $accepted_args );

add_filter( ‘filter_awesome_text’, ‘filter_awesome’ );

function filter_awesome( $text ) {$text .= ‘<h4>puppies</h4>’;

return $text;}

...in your functions.php script....

which filter? which function of ours?

echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' );

add_filter( ‘filter_awesome_text’, ‘filter_awesome’ );

function filter_awesome( $text ) {$text .= ‘<h4>puppies</h4>’;

return $text;}

...in your functions.php script....

echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' );

Use a unique function name

add_filter( ‘filter_awesome_text’, ‘filter_awesome’ );

function filter_awesome( $text ) {$text .= ‘<h4>puppies</h4>’;

return $text;}

...in your functions.php script....

echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' );

add_filter( ‘filter_awesome_text’, ‘filter_awesome’ );

function filter_awesome( $text ) {$text .= ‘<h4>puppies</h4>’;

return $text;}

...in your functions.php script....

echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' );

always return!

add_filter( ‘filter_awesome_text’, ‘filter_awesome’ );

function filter_awesome( $text ) {$text .= ‘<h4>puppies</h4>’;

return $text;}

...in your functions.php script....

echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' );

always return!

add_filter( ‘filter_awesome_text’, ‘filter_awesome’ );function filter_awesome( $text ) {

$text .= ‘<h4>puppies</h4>’;return $text;

}

add_filter( ‘filter_awesome_text’, ‘second_filter’ );function second_filter( $text ) {

$text = ‘<h2>dogs!</h2>’;return $text;

}

...in your functions.php script....

echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' );

add_filter( ‘filter_awesome_text’, ‘filter_awesome’ );function filter_awesome( $text ) {

$text .= ‘<h4>puppies</h4>’;return $text;

}

add_filter( ‘filter_awesome_text’, ‘second_filter’ );function second_filter( $text ) {

$text = ‘<h2>dogs!</h2>’;return $text;

}

...in your functions.php script....

echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' );

add_filter( ‘filter_awesome_text’, ‘filter_awesome’ );function filter_awesome( $text ) {

$text .= ‘<h4>puppies</h4>’;return $text;

}

add_filter( ‘filter_awesome_text’, ‘second_filter’ );function second_filter( $text ) {

$text = ‘<h2>dogs!</h2>’;return $text;

}

...in your functions.php script....

echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' );

add_filter( ‘filter_awesome_text’, ‘filter_awesome’ );function filter_awesome( $text ) {

$text .= ‘<h4>puppies</h4>’;return $text;

}

add_filter( ‘filter_awesome_text’, ‘second_filter’ );function second_filter( $text ) {

$text = ‘<h2>dogs!</h2>’;return $text;

}

...in your functions.php script....

echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' );

add_filter( ‘filter_awesome_text’, ‘filter_awesome’ );function filter_awesome( $text ) {

$text .= ‘<h4>puppies</h4>’;return $text;

}

add_filter( ‘filter_awesome_text’, ‘second_filter’ );function second_filter( $text ) {

$text = ‘<h2>dogs!</h2>’;return $text;

}

...in your functions.php script....

echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' );

add_filter( ‘filter_awesome_text’, ‘filter_awesome’, 2 );function filter_awesome( $text ) {

$text .= ‘<h4>puppies</h4>’;return $text;

}

add_filter( ‘filter_awesome_text’, ‘second_filter’, 1 );function second_filter( $text ) {

$text = ‘<h2>dogs!</h2>’;return $text;

}

...in your functions.php script....

echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' );

add_filter( ‘filter_awesome_text’, ‘filter_awesome’, 2 );function filter_awesome( $text ) {

$text .= ‘<h4>puppies</h4>’;return $text;

}

add_filter( ‘filter_awesome_text’, ‘second_filter’, 1 );function second_filter( $text ) {

$text = ‘<h2>dogs!</h2>’;return $text;

}

...in your functions.php script....

echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' );

add_filter( ‘filter_awesome_text’, ‘filter_awesome’, 2 );function filter_awesome( $text ) {

$text .= ‘<h4>puppies</h4>’;return $text;

}

add_filter( ‘filter_awesome_text’, ‘second_filter’, 1 );function second_filter( $text ) {

$text = ‘<h2>dogs!</h2>’;return $text;

}

...in your functions.php script....

echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' );

add_filter( ‘filter_awesome_text’, ‘filter_awesome’, 2 );function filter_awesome( $text ) {

$text .= ‘<h4>puppies</h4>’;return $text;

}

add_filter( ‘filter_awesome_text’, ‘second_filter’, 1 );function second_filter( $text ) {

$text = ‘<h2>dogs!</h2>’;return $text;

}

...in your functions.php script....

echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' );

add_filter( ‘filter_awesome_text’, ‘filter_awesome’, 2 );function filter_awesome( $text ) {

$text .= ‘<h4>puppies</h4>’;return $text;

}

add_filter( ‘filter_awesome_text’, ‘second_filter’, 1 );function second_filter( $text ) {

$text = ‘<h2>dogs!</h2>’;return $text;

}

...in your functions.php script....

echo apply_filters( 'filter_awesome_text', '<h2>awesome</h2>' );

remove_filter()

remove_filter( $tag, $function_to_remove, $priority, $accepted_args );

remove_filter( 'the_content', 'wpautop' );

Ridiculous Filterpublic function widget( $args, $instance ) { extract( $args ); $title = apply_filters( 'widget_title', $instance['title'] );

echo $before_widget; if ( ! empty( $title ) ) echo $before_title . $title . $after_title; do_action( 'before_ridiculous_widget' ); $wrap = ( is_home() ) ? 'h2' : 'h3'; $text = 'awesome'; $pattern = '<%s class="awesome">%s</%s>'; $awesome = sprintf( $pattern, $wrap, $text, $wrap ); echo apply_filters( 'filter_ridiculous_text', $awesome, $wrap, $text ); do_action( 'after_ridiculous_widget' ); echo $after_widget;}

Ridiculous Filterpublic function widget( $args, $instance ) { extract( $args ); $title = apply_filters( 'widget_title', $instance['title'] );

echo $before_widget; if ( ! empty( $title ) ) echo $before_title . $title . $after_title; do_action( 'before_ridiculous_widget' ); $wrap = ( is_home() ) ? 'h2' : 'h3'; $text = 'awesome'; $pattern = '<%s class="awesome">%s</%s>'; $awesome = sprintf( $pattern, $wrap, $text, $wrap ); echo apply_filters( 'filter_ridiculous_text', $awesome, $wrap, $text ); do_action( 'after_ridiculous_widget' ); echo $after_widget;}

filter!

$wrap = ( is_home() ) ? 'h2' : 'h3';$text = 'awesome';$pattern = '<%s>%s</%s>';$awesome = sprintf( $pattern, $wrap, $text, $wrap ); echo apply_filters( 'filter_ridiculous_text', $awesome, $wrap, $text );

Ridiculous Filter

$wrap = ( is_home() ) ? 'h2' : 'h3';$text = 'awesome';$pattern = '<%s>%s</%s>';$awesome = sprintf( $pattern, $wrap, $text, $wrap ); echo apply_filters( 'filter_ridiculous_text', $awesome, $wrap, $text );

Ridiculous Filter

is_home()

<h2>awesome</h2>

!is_home()

<h3>awesome</h3>

$wrap = ( is_home() ) ? 'h2' : 'h3';$text = 'awesome';$pattern = '<%s>%s</%s>';$awesome = sprintf( $pattern, $wrap, $text, $wrap ); echo apply_filters( 'filter_ridiculous_text', $awesome, $wrap, $text );

Ridiculous Filter

is_home()

<h2>awesome</h2>

!is_home()

<h3>awesome</h3>

??????

add_filter( 'filter_ridiculous_text', 'ridiculous_filter', 10, 3 );

function ridiculous_filter( $text, $var1, $var2 ) { $var2 = "not awesome"; $new = sprintf( '<%s>%s</%s>', $var1, $var2, $var1 ); return $new;}

...in your functions.php script....

echo apply_filters( 'filter_ridiculous_text', $awesome, $wrap, $text );

...assume is_home()...

add_filter( 'filter_ridiculous_text', 'ridiculous_filter', 10, 3 );

function ridiculous_filter( $text, $var1, $var2 ) { $var2 = "not awesome"; $new = sprintf( '<%s>%s</%s>', $var1, $var2, $var1 ); return $new;}

...in your functions.php script....

echo apply_filters( 'filter_ridiculous_text', $awesome, $wrap, $text );

...assume is_home()...

add_filter( 'filter_ridiculous_text', 'ridiculous_filter', 10, 3 );

function ridiculous_filter( $text, $var1, $var2 ) { $var2 = "not awesome"; $new = sprintf( '<%s>%s</%s>', $var1, $var2, $var1 ); return $new;}

...in your functions.php script....

echo apply_filters( 'filter_ridiculous_text', $awesome, $wrap, $text );

...assume is_home()...

add_filter( 'filter_ridiculous_text', 'ridiculous_filter', 10, 3 );

function ridiculous_filter( $text, $var1, $var2 ) { $var2 = "not awesome"; $new = sprintf( '<%s>%s</%s>', $var1, $var2, $var1 ); return $new;}

...in your functions.php script....

echo apply_filters( 'filter_ridiculous_text', $awesome, $wrap, $text );

<h2>awesome</h2>...assume is_home()...

add_filter( 'filter_ridiculous_text', 'ridiculous_filter', 10, 3 );

function ridiculous_filter( $text, $var1, $var2 ) { $var2 = "not awesome"; $new = sprintf( '<%s>%s</%s>', $var1, $var2, $var1 ); return $new;}

...in your functions.php script....

echo apply_filters( 'filter_ridiculous_text', $awesome, $wrap, $text );

<h2>awesome</h2> h2...assume is_home()...

add_filter( 'filter_ridiculous_text', 'ridiculous_filter', 10, 3 );

function ridiculous_filter( $text, $var1, $var2 ) { $var2 = "not awesome"; $new = sprintf( '<%s>%s</%s>', $var1, $var2, $var1 ); return $new;}

...in your functions.php script....

echo apply_filters( 'filter_ridiculous_text', $awesome, $wrap, $text );

<h2>awesome</h2> h2 awesome...assume is_home()...

add_filter( 'filter_ridiculous_text', 'ridiculous_filter', 10, 3 );

function ridiculous_filter( $text, $var1, $var2 ) { $var2 = "not awesome"; $new = sprintf( '<%s>%s</%s>', $var1, $var2, $var1 ); return $new;}

...in your functions.php script....

echo apply_filters( 'filter_ridiculous_text', $awesome, $wrap, $text );

...assume is_home()...

add_filter( 'filter_ridiculous_text', 'ridiculous_filter', 10, 3 );

function ridiculous_filter( $text, $var1, $var2 ) { $var2 = "not awesome"; $new = sprintf( '<%s>%s</%s>', $var1, $var2, $var1 ); return $new;}

...in your functions.php script....

echo apply_filters( 'filter_ridiculous_text', $awesome, $wrap, $text );

...assume is_home()...

Examples

Genesis Framework

Genesis Actions

Genesis Filters

Other Themes and Plugins?

• WordPress: 790+ actions, 1250+ filters

• Genesis Framework: 180+ actions; 100+ filters

• Gravity Forms: 120+ actions; 270+ filters

• Shopp: 130+ actions; 230+ filters

Where Hooks?

• Plugin/Theme Wiki

• Documentation

• Actual Code (search for do_action and apply_filters)

• Google search!

• http://codex.wordpress.org/Plugin_API

Yes, Hooks!

•Actions - Do Stuff

•Filters - Change Stuff

do_action( ‘the_end’ )

add_action( ‘the_end’, ‘questions’ );function questions() { echo ‘Are there any questions?’;}

slides: http://slideshare.net/jeffreyzinn/hooks-wcsd12

code: https://gist.github.com/2163780