wordpress filters documentation? Trying to understand add_filter()
add_filter()
is a companion function to apply_filters()
. Before apply_filters
is run for a certain filter (the $tag
argument in add_filter()
), you can use add_filter
to register a filter for a tag. When apply_filters()
is executed with that tag name, it calls all the registered filters in order. Filters are used to pass data through functions for manipulation. For example, one that I often find myself using is the wp_list_pages filter. I use it to remove line breaks from the pages list. So here's how it works:
First I define a function that takes one parameter and returns it after working with it:
function my_list_pages_filter($pages){ $pages = preg_replace( array("\n","\r"), '', $pages ); return $pages;}
Then I add the filter hook:add_filter( 'wp_list_pages', 'my_list_pages_filter' );
add_filter
tells WordPress "When the function apply_filters
is called with the first argument being 'wp_list_pages', call my_list_pages_filter
." Filters must send at least one value (of any type: string, array, integer, etc.), and they expect the function to return one value.
They provide you a way to manipulate the input before sending it back.
do_action
is an entirely different hook. In order to send information to your filter function, do the following (taken from your example):
<div id="content" <?php $class='post post_content'; echo apply_filters('my_custom_classes', $class); ?>>
And then in your functions.php file, add this:
add_filter('my_custom_classes','my_custom_classes_function');function my_custom_classes_function($classes){ $output 'class="'. $classes.'"'; return $output;}
That's a pretty rudimentary use of filters, but it's a start. You can really get an idea of what you can do with filters with the same example with some enhancements:
function my_custom_classes_function($classes){ $classes = explode( ' ', $classes ); if(is_home()) $classes[] = 'home_content'; if(is_single()) $classes[] = 'single_content'; if(is_page()) $classes[] = 'page_content'; if(is_tag()) $classes[] = 'tag_content'; $output 'class="'. implode( ' ', $classes ) .'"'; return $output;}
Chris,You seem to be confused by a few things:
- Filters and Actions are not related (they're both a type of what WP calls a 'hook', but otherwise unrelated). Above you said "with my filter..." but do_action() is for Actions not Filters.
- The Tag (i.e. tag parameter to add_filter, apply_filter, add_action, do_action have nothing to do with tags in the XML/HTML sense (- maybe you know that).
- When invoking an Action, using do_action() you probably want to pass an argument in addition to the mandatory tag name. Above you called do_action('content_class'), which, firstly, will have no effect unless you've first registered an Action with the tag name "content_class", and secondly, in your action function content_class_filter (which would be better named content_class_action as is has nothing to do with filters), has an optional parameter $classes, which will always be '' since you didn't supply an argument to do_action after the tag name. Note also you probably meant to write $output = ..
- Filters don't "override" anything (especially in the OO language sense). Adding multiple filters with the same tag will result in all of them being called when the apply_filters for the tag is called. You can control the ordering using the priority parameter. Same goes for Actions.
it is very nice article, but I must do some stupid mistake, nevertheless....
I am trying to remove some items in WP3+ Navigation Menu under "Screen Options" via this "add_filter" technique:
wp-admin/includes/nav-menus.php:
function wp_nav_menu_manage_columns() { return array( '_title' => __('Show advanced menu properties'), 'cb' => '<input type="checkbox" />', 'link-target' => __('Link Target'), 'css-classes' => __('CSS Classes'), 'xfn' => __('Link Relationship (XFN)'), 'description' => __('Description'), );}
mytheme/function.php:
It seems the original functions is not a part of some CLASS:
add_filter('wp_nav_menu_manage_columns', 'new_wp_nav_menu_manage_columns');function new_wp_nav_menu_manage_columns() { return array( '_title' => __('Show advanced menu properties'), 'cb' => '<input type="checkbox" />', 'link-target' => __('Link Target'), );}
But as a result I can see the original "Screen Options" with all the items.If I remove the lines:'css-classes' => _('CSS Classes'),'xfn' => _('Link Relationship (XFN)'),'description' => __('Description'),directly in WP core, everything looks OK, so I am not sure it it is possible to override all the WP functons this way.
Thank you very much for your advice.With best regards, Milo