Tag List Widget.
Author: Erick Hitter
Version: 1.1.1
Author URI: http://www.ethitter.com/
*/
/**
** TAXONOMY WIDGET PLUGIN
**/
class taxonomy_list_widget_plugin {
/*
* Class variables
*/
var $option_defaults = array(
'taxonomy' => 'post_tag',
'max_name_length' => 0,
'cutoff' => '…',
'delimiter' => 'ul',
'limit' => 0,
'order' => 'ASC',
'orderby' => 'name',
'threshold' => 0,
'incexc' => 'exclude',
'incexc_ids' => array(),
'hide_empty' => true,
'post_counts' => false,
'rel' => 'nofollow'
);
/*
* Register actions and activation/deactivation hooks
* @uses add_action, register_activation_hook, register_deactivation_hook
* @return null
*/
function __construct() {
add_action( 'widgets_init', array( $this, 'action_widgets_init' ) );
register_activation_hook( __FILE__, array( $this, 'activation_hook' ) );
register_deactivation_hook( __FILE__, array( $this, 'deactivation_hook' ) );
}
/*
* Run plugin cleanup on activation
* @uses $this::cleanup
* @hook activation
* @return null
*/
function activation_hook() {
$this->cleanup();
}
/*
* Unregister widget when plugin is deactivated and run cleanup
* @uses unregister_widget, $this::cleanup
* @hook deactivation
* @return null
*/
function deactivation_hook() {
unregister_widget( 'taxonomy_list_widget' );
$this->cleanup();
}
/*
* Remove options related to plugin versions older than 2.0.
* @uses delete_option
* @return null
*/
function cleanup() {
$legacy_options = array(
'TLW',
'TLW_direct'
);
foreach( $legacy_options as $legacy_option )
delete_option( $legacy_option );
}
/*
* Register widget
* @uses register_widget
* @action widgets_init
* @return null
*/
function action_widgets_init() {
if( class_exists( 'taxonomy_list_widget' ) )
register_widget( 'taxonomy_list_widget' );
}
/*
* Render list
* @param array $options
* @param string|int $id
* @uses wp_parse_args, sanitize_title, apply_filters, get_terms, is_wp_error, is_tag, is_tax, esc_url, get_term_link, selected
* @return string or false
*/
function render_list( $options, $id = false ) {
$options = wp_parse_args( $options, $this->option_defaults );
extract( $options );
//ID
if( is_numeric( $id ) )
$id = intval( $id );
elseif( is_string( $id ) )
$id = sanitize_title( $id );
//Set up options array for get_terms
$options = array(
'order' => $order,
'orderby' => $orderby,
'hide_empty' => $hide_empty,
'hierarchical' => false
);
if( $limit )
$options[ 'number' ] = $limit;
if( !empty( $incexc_ids ) )
$options[ $incexc ] = $incexc_ids;
$options = apply_filters( 'taxonomy_list_widget_options', $options, $id );
//Get terms
$terms = get_terms( $taxonomy, $options );
if( !is_wp_error( $terms ) && is_array( $terms ) && !empty( $terms ) ) {
//CSS ID
if( is_int( $id ) )
$css_id = ' id="taxonomy_list_widget_list_' . $id . '"';
elseif( is_string( $id ) && !empty( $id ) )
$css_id = ' id="' . $id . '"';
else
$css_id = '';
//Delimiters
$before_list = '';
$after_list = '
';
$before_item = '';
$after_item = ' ';
if( is_array( $delimiter ) )
extract( $delimiter );
else {
switch( $delimiter ) {
case 'ol':
$before_list = '';
$after_list = '
';
$before_item = '';
$after_item = '';
break;
case 'nl':
$after_item = '
';
break;
case 'ul':
default:
$before_list = '';
$before_item = '';
$after_item = '';
break;
}
}
//Start list
$output = $before_list;
//Populate dropdown
$i = 1;
foreach( $terms as $term ) {
if( $threshold > 0 && $term->count < $threshold )
continue;
//Open item
$output .= $before_item;
$output .= '';
//Tag name
$name = esc_attr( $term->name );
if( $max_name_length > 0 && strlen( $name ) > $max_name_length )
$name = substr( $name, 0, $max_name_length ) . $cutoff;
$output .= $name;
//Count
if( $post_counts )
$output .= ' (' . intval( $term->count ) . ')';
//Close item
$output .= '';
$output .= $after_item;
$i++;
}
//End list
$output .= $after_list;
return $output;
}
else
return false;
}
/*
* Sanitize plugin options
* @param array $options
* @uses taxonomy_exists, sanitize_text_field, absint, wp_parse_args
* @return array
*/
function sanitize_options( $options ) {
$options_sanitized = array(
'hide_empty' => true,
'post_counts' => false
);
$keys = array_merge( array_keys( $this->option_defaults ), array( 'title' ) );
if( is_array( $options ) ) {
foreach( $keys as $key ) {
if( !array_key_exists( $key, $options ) )
continue;
$value = $options[ $key ];
switch( $key ) {
case 'taxonomy':
if( taxonomy_exists( $value ) )
$options_sanitized[ $key ] = $value;
break;
case 'title':
case 'cutoff':
$value = sanitize_text_field( $value );
if( !empty( $value ) || $key == 'title' )
$options_sanitized[ $key ] = $value;
break;
case 'max_name_length':
case 'limit':
case 'threshold':
$options_sanitized[ $key ] = absint( $value );
break;
case 'order':
if( $value == 'ASC' || $value == 'DESC' )
$options_sanitized[ $key ] = $value;
break;
case 'orderby':
if( $value == 'name' || $value == 'count' )
$options_sanitized[ $key ] = $value;
break;
case 'incexc':
if( $value == 'include' || $value == 'exclude' )
$options_sanitized[ $key ] = $value;
break;
case 'incexc_ids':
$options_sanitized[ $key ] = array();
if( is_string( $value ) )
$value = explode( ',', $value );
if( is_array( $value ) ) {
foreach( $value as $term_id ) {
$term_id = intval( $term_id );
if( $term_id > 0 )
$options_sanitized[ $key ][] = $term_id;
unset( $term_id );
}
sort( $options_sanitized[ $key ], SORT_NUMERIC );
}
break;
case 'hide_empty':
case 'post_counts':
$options_sanitized[ $key ] = (bool)$value;
break;
case 'delimiter':
if( is_array( $value ) ) {
$options_sanitized[ $key ] = array();
foreach( $value as $delim_key => $delim )
$options_sanitized[ $key ][ $delim_key ] = wp_filter_post_kses( $delim );
}
elseif( $value == 'custom' && array_key_exists( 'delimiter_custom', $options ) && is_array( $options[ 'delimiter_custom' ] ) ) {
$options_sanitized[ $key ] = array();
foreach( $options[ 'delimiter_custom' ] as $delim_key => $delim )
$options_sanitized[ $key ][ $delim_key ] = wp_filter_post_kses( $delim );
}
elseif( is_string( $value ) ) {
$delims = array(
'ul',
'ol',
'nl'
);
if( in_array( $value, $delims ) )
$options_sanitized[ $key ] = $value;
}
break;
case 'rel':
if( in_array( $value, array( 'nofollow', 'dofollow' ) ) )
$options_sanitized[ $key ] = $value;
break;
default:
continue;
break;
}
}
}
//Ensure array contains all keys by parsing against defaults after options are sanitized
$options_sanitized = wp_parse_args( $options_sanitized, $this->option_defaults );
return $options_sanitized;
}
/*
* PHP 4 compatibility
*/
function taxonomy_list_widget_plugin() {
$this->__construct();
}
}
global $taxonomy_list_widget_plugin;
if( !is_a( $taxonomy_list_widget_plugin, 'taxonomy_list_widget_plugin' ) )
$taxonomy_list_widget_plugin = new taxonomy_list_widget_plugin;
/**
** Taxonomy List WIDGET
**/
class taxonomy_list_widget extends WP_Widget {
/*
* Class variables
*/
var $defaults = array(
'title' => 'Tags'
);
/*
* Register widget and populate class variables
* @uses $this::WP_Widget, $taxonomy_list_widget_plugin
* @return null
*/
function taxonomy_list_widget() {
$this->WP_Widget( false, 'Taxonomy List Widget', array( 'description' => 'Displays selected non-hierarchical taxonomy terms in a list format.' ) );
//Load plugin class and populate defaults
global $taxonomy_list_widget_plugin;
if( !is_a( $taxonomy_list_widget_plugin, 'taxonomy_list_widget_plugin' ) )
$taxonomy_list_widget_plugin = new taxonomy_list_widget_plugin;
if( is_object( $taxonomy_list_widget_plugin ) && property_exists( $taxonomy_list_widget_plugin, 'option_defaults' ) && is_array( $taxonomy_list_widget_plugin->option_defaults ) )
$this->defaults = array_merge( $taxonomy_list_widget_plugin->option_defaults, $this->defaults );
}
/*
* Render widget
* @param array $args
* @param array $instance
* @uses $taxonomy_list_widget_plugin, wp_parse_args, apply_filters
* @return string or null
*/
function widget( $args, $instance ) {
//Get plugin class for default options and to build widget
global $taxonomy_list_widget_plugin;
if( !is_a( $taxonomy_list_widget_plugin, 'taxonomy_list_widget_plugin' ) )
$taxonomy_list_widget_plugin = new taxonomy_list_widget_plugin;
//Options
$instance = wp_parse_args( $instance, $this->defaults );
extract( $args );
extract( $instance );
//Widget
if( $widget = $taxonomy_list_widget_plugin->render_list( $instance, $this->number ) ) {
//Wrapper and title
$output = $before_widget;
if( !empty( $title ) )
$output .= $before_title . apply_filters( 'taxonomy_list_widget_title', $title, $this->number ) . $after_title;
//Widget
$output .= $widget;
//Wrapper
$output .= $after_widget;
echo $output;
}
}
/*
* Options sanitization
* @param array $new_instance
* @param array $old_instance
* @uses $taxonomy_list_widget_plugin
* @return array
*/
function update( $new_instance, $old_instance ) {
//Get plugin class for sanitization function
global $taxonomy_list_widget_plugin;
if( !is_a( $taxonomy_list_widget_plugin, 'taxonomy_list_widget_plugin' ) )
$taxonomy_list_widget_plugin = new taxonomy_list_widget_plugin;
return $taxonomy_list_widget_plugin->sanitize_options( $new_instance );
}
/*
* Widget options
* @param array $instance
* @uses wp_parse_args, get_taxonomies, _e, $this::get_field_id, $this::get_field_name, esc_attr, selected, checked
* @return string
*/
function form( $instance ) {
//Get options
$options = wp_parse_args( $instance, $this->defaults );
extract( $options );
if( is_array( $delimiter ) ) {
$custom_delims = $delimiter;
$delimiter = 'custom';
}
//Get taxonomies and remove nav_menu
$taxonomies = get_taxonomies( array(
'public' => true,
'hierarchical' => false,
'object_type' => array( 'any' )
), 'objects' );
if( array_key_exists( 'nav_menu', $taxonomies ) )
unset( $taxonomies[ 'nav_menu' ] );
?>
_e( 'Basic Settings' ); ?>
_e( 'List Style' ); ?>
>
>
>
>
_e( 'Order' ); ?>
/>
/>
/>
/>
_e( 'Term Display' ); ?>
_e( 'Enter 0 for no limit.' ); ?>
' ); ?>
_e( 'Enter 0 to show full tag names.' ); ?>
_e( 'Leave blank to use an elipsis (…).' ); ?>
/>
/>
_e( 'Include/Exclude Terms' ); ?>
/>
/>
_e( 'Enter comma-separated list of term IDs.' ); ?>
_e( 'Advanced' ); ?>
_e( 'Set to 0 to display all terms matching the above criteria.' ); ?>
/>
/>
sanitize_options( $options );
return $taxonomy_list_widget_plugin->render_list( $options, $id );
}
/**
** LEGACY FUNCTIONS FOR BACKWARDS COMPATIBILITY
**/
if( !function_exists( 'TLW_direct' ) ):
/*
* Build term list based on provided arguments
* @since 0.3
* @uses $taxonomy_list_widget_plugin
* @return string or false
*/
function TLW_direct( $limit = false, $count = false, $before_item = '', $after_item = ' ', $exclude = false ) {
global $taxonomy_list_widget_plugin;
if( !is_a( $taxonomy_list_widget_plugin, 'taxonomy_list_widget_plugin' ) )
$taxonomy_list_widget_plugin = new taxonomy_list_widget_plugin;
//Build options array from function parameters
$options = array(
'max_name_length' => $limit,
'post_count' => $count,
'delimiter' => array(
'before_list' => '',
'after_list' => '',
'before_item' => $before_item,
'after_item' => $after_item
)
);
if( $exclude ) {
$options[ 'incexc' ] = 'exclude';
$options[ 'incexc_ids' ] = $exclude;
}
//Sanitize options
$options = $taxonomy_list_widget_plugin->sanitize_options( $options );
echo '' . $taxonomy_list_widget_plugin->render_list( $options, 'legacy_tlw' );
}
endif;
?>