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' ] ); ?>



    >
    >
    >
    >


    />
    />


    />
    />



    Enter 0 for no limit.' ); ?>

    ' ); ?>

    Enter 0 to show full tag names.' ); ?>



    Leave blank to use an elipsis (…).' ); ?>

    />

    />


    />
    />



    Enter comma-separated list of term IDs.' ); ?>



    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; ?>