hooks wcsd12
Embed Size (px)
DESCRIPTION
Basic to intermediate skills for WordPress hooks (actions and filters).TRANSCRIPT

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• [email protected]

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

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....
Same A
ction
Multiple Calls to Action

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....
Same A
ction
Diff. Functions
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