
Widget Logic control field added to every widget
The popular plugin Widget Logic allows custom control over all of your sidebar widgets. This allows you to pick and choose which pages or posts will have the widget.
Ordinarily, when you place a widget in a a sidebar under Appearance -> Widgets that widget will appear on all pages/posts.
With this powerful plugin, a layperson has complete control over when to display a widget.
A new control field is added to every widget (see picture). Don’t be intimidated by the php code in this field. The basics are very straightforward. If you only want the “recent posts” widget to display on the blog page for instance, add “is_home()” to the control field.
Examples
is_home() — just the main blog page
-
is_page('about') — just the page named about
is_user_logged_in() — shown when a user is logged in
is_category(array(5,9,10,11)) — category page of one of the given category IDs
is_single() && in_category('baked-goods') — single post that’s in the category with this slug
current_user_can('level_10') — admin only widget
strpos($_SERVER['HTTP_REFERER'], "google.com")!=false — widget to show when clicked through from a google search
is_category() && in_array($cat, get_term_children( 5, 'category')) — category page that’s a descendent of category 5
global $post; return (in_array(77,get_post_ancestors($post))); — WP page that is a child of page 77
global $post; return (is_page('home') || ($post->post_parent=="13")); — home page OR the page that’s a child of page 13
Note the extra ‘;’ on the end where there is an explicit ‘return’.
Basic Logic
These logic operators can be used in combination with the code above.
! (NOT) to reverse the logic, eg !is_home() is TRUE when this is NOT the home page.
|| (OR) to combine conditions. X OR Y is TRUE when either X is true or Y is true.
&& (AND) to make conditions more specific. X AND Y is TRUE when both X is true and Y is true.
example: !is_user_logged_in() — shown when a user is not logged in
A full list of WordPress built in conditional tags that can be used in the Widget Logic control field can be found here.
Writing Logic Code
The text in the ‘Widget logic’ field can be full PHP code and should return ‘true’ when you need the widget to appear. If there is no ‘return’ in the text, an implicit ‘return’ is added to the start and a ‘;’ is added on the end. (This is just to make single statements like is_home() more convenient.)
Very Advanced
The ‘widget_content’ filter
When this option is active (tick the option tickbox at the foot of the widget admin page) you can modify the text displayed by ANY widget from your own theme’s functions.php file. Hook into the filter with:
add_filter('widget_content', 'your_filter_function', [priority], 2);
where [priority] is the optional priority parameter for the add_filter function. The filter function can take a second parameter (if you provide that last parameter ’2′) like this:
function your_filter_function($content='', $widget_id='')
The second parameter ($widget_id) can be used to target specific widgets if needed.
A WordPress filter function ‘takes as input the unmodified data, and returns modified data’ which means that widget_content filters are provided with the raw HTML output by the widget, and you are then free to return something else entirely:
Example filters
add_filter('widget_content', 'basic_widget_content_filter'); function basic_widget_content_filter($content='') { return $content."<PRE>THIS APPEARS AFTER EVERY WIDGET</PRE>"; }
The motivation behind this filter is to to render all widget titles with the excellent ttftitles plugin like this:
add_filter('widget_content', 'ttftext_widget_title'); function ttftext_widget_title($content='') { preg_match("/<h2[^>]*>([^<]+)/",$content, $matches); $heading=$matches[1]; $insert_img=the_ttftext( $heading, false ); $content=preg_replace("/(<h2[^>]*>)[^<]+/","$1$insert_img",$content,1); return $content; }
People often ask for a way to give widgets alternating styles. This filter inserts widget_style_a/widget_style_b into the text usually found in a widget’s main definition:
add_filter('widget_content', 'make_alternating_widget_styles'); function make_alternating_widget_styles($content='') { global $wl_make_alt_ws; $wl_make_alt_ws=($wl_make_alt_ws=="style_a")?"style_b":"style_a"; return preg_replace('/(class="widget )/', "$1 widget_${wl_make_alt_ws} ", $content); }
Share on Facebook