Title: Convert Widget Code to Function
Last modified: August 20, 2016

---

# Convert Widget Code to Function

 *  [ddeuster](https://wordpress.org/support/users/ddeuster/)
 * (@ddeuster)
 * [13 years, 6 months ago](https://wordpress.org/support/topic/convert-widget-code-to-function/)
 * I have a widget that will create monthly or yearly archives for CPT’s in WP. 
   I would like to take that widget function and use it to add a date filter to 
   the page located here:
 * [http://www.host4eighty5.com/sermon/](http://www.host4eighty5.com/sermon/)
 * In effect, the widget just needs to work as a drop down in place of the current
   one. I’m attacking the widget files for consideration. The specific CPT that 
   will need to filter out is called ‘tz_sermon’
 *     ```
       <?php
       /**
        * @package CPT_Archive
        * @version 0.1
        */
       /*
       Plugin Name: Custom Post Type Archive
       Description: Adds an Archive Widget that uses Custom Post TYpes
       Author: Brenda Egeland
       Version: 0.1
       Author URI: http://www.redletterdesign.net/
       */
   
       /**
        * Archives widget class, taken from core and modified for custom post type
        *
        * @since 2.8.0
        */
       class CPT_Archives extends WP_Widget {
   
       	function CPT_Archives() {
       		$widget_ops = array('classname' => 'widget_archive', 'description' => __( 'A monthly archive of your site’s custom post type') );
       		$this->WP_Widget('cpt_archives', __('CPT Archives'), $widget_ops);
       	}
   
       	function widget( $args, $instance ) {
       		extract($args);
       		$c = $instance['count'] ? '1' : '0';
       		$d = $instance['dropdown'] ? '1' : '0';
       		$title = apply_filters('widget_title', empty($instance['title']) ? __('Archives') : $instance['title'], $instance, $this->id_base);
       		$cpt = apply_filters('cpt', empty($instance['cpt']) ? __('post') : $instance['cpt'], $instance, $this->id_base);
       		$type = apply_filters('type', empty($instance['type']) ? __('monthly') : $instance['type'], $instance, $this->id_base);
   
       		echo $before_widget;
       		if ( $title )
       			echo $before_title . $title . $after_title;
   
       		if ( $d ) {
       ?>
       		<select name="archive-dropdown" onchange='document.location.href=this.options[this.selectedIndex].value;'> <option value=""><?php echo esc_attr(__('Select Month')); ?></option> <?php wp_get_archives(apply_filters('widget_archives_dropdown_args', array('type' => 'monthly', 'format' => 'option', 'show_post_count' => $c))); ?> </select>
       <?php
       		} else {
       ?>
       		<ul class="monkey">
       		<?php wp_get_cpt_archives(apply_filters('widget_cpt_archives_args', array('type' => $type, 'show_post_count' => $c, 'cpt' => $cpt))); ?>
       		</ul>
       <?php
       		}
   
       		echo $after_widget;
       	}
   
       	function update( $new_instance, $old_instance ) {
       		$instance = $old_instance;
       		$new_instance = wp_parse_args( (array) $new_instance, array( 'title' => '', 'count' => 0, 'dropdown' => '', 'cpt' => 'post') );
       		$instance['title'] = strip_tags($new_instance['title']);
       		$instance['count'] = $new_instance['count'] ? 1 : 0;
       		$instance['dropdown'] = $new_instance['dropdown'] ? 1 : 0;
       		$instance['cpt'] = strip_tags($new_instance['cpt']);
       		$instance['type'] = strip_tags($new_instance['type']);
   
       		return $instance;
       	}
   
       	function form( $instance ) {
       		$instance = wp_parse_args( (array) $instance, array( 'title' => '', 'count' => 0, 'dropdown' => '', 'cpt' => 'post', 'type' => 'monthly') );
       		$title = strip_tags($instance['title']);
       		$count = $instance['count'] ? 'checked="checked"' : '';
       		$dropdown = $instance['dropdown'] ? 'checked="checked"' : '';
       		$cpt= strip_tags($instance['cpt']);
       		$type= strip_tags($instance['type']);
       ?>
       		<p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label>
       		<input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo esc_attr($title); ?>" /></p>
   
       		<p><label for="<?php echo $this->get_field_id('cpt'); ?>"><?php _e('Post Type:'); ?></label>
       		<select id="<?php echo $this->get_field_id('cpt'); ?>" name="<?php echo $this->get_field_name('cpt'); ?>">
             <?php
       		  $post_types=get_post_types('','names'); 
   
       		  $badtypes=array('nav_menu_item','revision','attachment'); // others????
       		  foreach ($post_types as $ptype ) {
       			  if (!in_array($ptype,$badtypes)) {
       				  echo "<option value=\"$ptype\" ";
       				  if ($cpt==$ptype) echo 'selected="true"';
       				  echo ">$ptype</option>";
       			  }
       		  }
             ?>
           </select>
   
       		<p><label for="<?php echo $this->get_field_id('type'); ?>"><?php _e('Monthly, Yearly:'); ?></label>
       		<select id="<?php echo $this->get_field_id('type'); ?>" name="<?php echo $this->get_field_name('type'); ?>">
       		  <option value="monthly" <?php echo ($type=='monthly') ? 'selected="selected"' : '';?>>Monthly</option>
       		  <option value="yearly" <?php echo ($type=='yearly') ? 'selected="selected"' : '';?>>Yearly</option>
       		</select>
   
       		<p>
       			<input class="checkbox" type="checkbox" <?php echo $dropdown; ?> id="<?php echo $this->get_field_id('dropdown'); ?>" name="<?php echo $this->get_field_name('dropdown'); ?>" /> <label for="<?php echo $this->get_field_id('dropdown'); ?>"><?php _e('Display as dropdown'); ?></label>
       			<br/>
       			<input class="checkbox" type="checkbox" <?php echo $count; ?> id="<?php echo $this->get_field_id('count'); ?>" name="<?php echo $this->get_field_name('count'); ?>" /> <label for="<?php echo $this->get_field_id('count'); ?>"><?php _e('Show post counts'); ?></label>
       		</p>
       <?php
       	}
       }
   
       function CPT_Archives_widget_init() {
       	if ( !is_blog_installed() )
       		return;
   
       	register_widget('CPT_Archives');
   
       	do_action('widgets_init');
       }
   
       add_action('init', 'CPT_Archives_widget_init', 1);
   
       // MODIFIED VERSION FOR CUSTOM POST TYPES 
   
       /**
        * Display archive links based on type and format AND CUSTOM POST TYPE.
        *
        * The 'type' argument offers a few choices and by default will display monthly
        * archive links. The other options for values are 'daily', 'weekly', 'monthly',
        * 'yearly', 'postbypost' or 'alpha'. Both 'postbypost' and 'alpha' display the
        * same archive link list, the difference between the two is that 'alpha'
        * will order by post title and 'postbypost' will order by post date.
        *
        * The date archives will logically display dates with links to the archive post
        * page. The 'postbypost' and 'alpha' values for 'type' argument will display
        * the post titles.
        *
        * The 'limit' argument will only display a limited amount of links, specified
        * by the 'limit' integer value. By default, there is no limit. The
        * 'show_post_count' argument will show how many posts are within the archive.
        * By default, the 'show_post_count' argument is set to false.
        *
        * For the 'format', 'before', and 'after' arguments, see {@link
        * get_archives_link()}. The values of these arguments have to do with that
        * function.
        *
        * @since 1.2.0
        *
        * @param string|array $args Optional. Override defaults.
        */
       function wp_get_cpt_archives($args = '') {
       	global $wpdb, $wp_locale;
   
       	$defaults = array(
       		'type' => 'monthly', 'limit' => '',
       		'format' => 'html', 'before' => '',
       		'after' => '', 'show_post_count' => false,
       		'echo' => 1,
       		'cpt' => 'post'
       	);
   
       	$r = wp_parse_args( $args, $defaults );
       	extract( $r, EXTR_SKIP );
   
       	if ( '' == $type )
       		$type = 'monthly';
   
       	if ( '' != $limit ) {
       		$limit = absint($limit);
       		$limit = ' LIMIT '.$limit;
       	}
   
       	// this is what will separate dates on weekly archive links
       	$archive_week_separator = '–';
   
       	// over-ride general date format ? 0 = no: use the date format set in Options, 1 = yes: over-ride
       	$archive_date_format_over_ride = 0;
   
       	// options for daily archive (only if you over-ride the general date format)
       	$archive_day_date_format = 'Y/m/d';
   
       	// options for weekly archive (only if you over-ride the general date format)
       	$archive_week_start_date_format = 'Y/m/d';
       	$archive_week_end_date_format	= 'Y/m/d';
   
       	if ( !$archive_date_format_over_ride ) {
       		$archive_day_date_format = get_option('date_format');
       		$archive_week_start_date_format = get_option('date_format');
       		$archive_week_end_date_format = get_option('date_format');
       	}
   
       	//filters
       	$where = apply_filters('getarchives_where', "WHERE post_type = '" . $cpt . "' AND post_status = 'publish'", $r );
       	$join = apply_filters('getarchives_join', "", $r);
   
       	$output = '';
   
       	$cpt_query_var = '?post_type=' . $cpt;
   
       	if ( 'monthly' == $type ) {
       		$query = "SELECT YEAR(post_date) AS <code>year</code>, MONTH(post_date) AS <code>month</code>, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC $limit";
       		$key = md5($query);
       		$cache = wp_cache_get( 'wp_get_cpt_archives' , 'general');
       		if ( !isset( $cache[ $key ] ) ) {
       			$arcresults = $wpdb->get_results($query);
       			$cache[ $key ] = $arcresults;
       			wp_cache_set( 'wp_get_cpt_archives', $cache, 'general' );
       		} else {
       			$arcresults = $cache[ $key ];
       		}
       		if ( $arcresults ) {
       			$afterafter = $after;
       			foreach ( (array) $arcresults as $arcresult ) {
       				$url = get_month_link( $arcresult->year, $arcresult->month ) . $cpt_query_var;
       				/* translators: 1: month name, 2: 4-digit year */
       				$text = sprintf(__('%1$s %2$d'), $wp_locale->get_month($arcresult->month), $arcresult->year);
       				if ( $show_post_count )
       					$after = '&nbsp;('.$arcresult->posts.')' . $afterafter;
       				$output .= get_archives_link($url, $text, $format, $before, $after);
       			}
       		}
       	} elseif ('yearly' == $type) {
       		$query = "SELECT YEAR(post_date) AS <code>year</code>, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date) ORDER BY post_date DESC $limit";
       		$key = md5($query);
       		$cache = wp_cache_get( 'wp_get_cpt_archives' , 'general');
       		if ( !isset( $cache[ $key ] ) ) {
       			$arcresults = $wpdb->get_results($query);
       			$cache[ $key ] = $arcresults;
       			wp_cache_set( 'wp_get_cpt_archives', $cache, 'general' );
       		} else {
       			$arcresults = $cache[ $key ];
       		}
       		if ($arcresults) {
       			$afterafter = $after;
       			foreach ( (array) $arcresults as $arcresult) {
       				$url = get_year_link($arcresult->year) . $cpt_query_var;
       				$text = sprintf('%d', $arcresult->year);
       				if ($show_post_count)
       					$after = '&nbsp;('.$arcresult->posts.')' . $afterafter;
       				$output .= get_archives_link($url, $text, $format, $before, $after);
       			}
       		}
       	} elseif ( 'daily' == $type ) {
       		$query = "SELECT YEAR(post_date) AS <code>year</code>, MONTH(post_date) AS <code>month</code>, DAYOFMONTH(post_date) AS <code>dayofmonth</code>, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date), DAYOFMONTH(post_date) ORDER BY post_date DESC $limit";
       		$key = md5($query);
       		$cache = wp_cache_get( 'wp_get_cpt_archives' , 'general');
       		if ( !isset( $cache[ $key ] ) ) {
       			$arcresults = $wpdb->get_results($query);
       			$cache[ $key ] = $arcresults;
       			wp_cache_set( 'wp_get_cpt_archives', $cache, 'general' );
       		} else {
       			$arcresults = $cache[ $key ];
       		}
       		if ( $arcresults ) {
       			$afterafter = $after;
       			foreach ( (array) $arcresults as $arcresult ) {
       				$url	= get_day_link($arcresult->year, $arcresult->month, $arcresult->dayofmonth) . $cpt_query_var;
       				$date = sprintf('%1$d-%2$02d-%3$02d 00:00:00', $arcresult->year, $arcresult->month, $arcresult->dayofmonth);
       				$text = mysql2date($archive_day_date_format, $date);
       				if ($show_post_count)
       					$after = '&nbsp;('.$arcresult->posts.')'.$afterafter;
       				$output .= get_archives_link($url, $text, $format, $before, $after);
       			}
       		}
       	} elseif ( 'weekly' == $type ) {
       		$week = _wp_mysql_week( '<code>post_date</code>' );
       		$query = "SELECT DISTINCT $week AS <code>week</code>, YEAR( <code>post_date</code> ) AS <code>yr</code>, DATE_FORMAT( <code>post_date</code>, '%Y-%m-%d' ) AS <code>yyyymmdd</code>, count( <code>ID</code> ) AS <code>posts</code> FROM <code>$wpdb->posts</code> $join $where GROUP BY $week, YEAR( <code>post_date</code> ) ORDER BY <code>post_date</code> DESC $limit";
       		$key = md5($query);
       		$cache = wp_cache_get( 'wp_get_cpt_archives' , 'general');
       		if ( !isset( $cache[ $key ] ) ) {
       			$arcresults = $wpdb->get_results($query);
       			$cache[ $key ] = $arcresults;
       			wp_cache_set( 'wp_get_cpt_archives', $cache, 'general' );
       		} else {
       			$arcresults = $cache[ $key ];
       		}
       		$arc_w_last = '';
       		$afterafter = $after;
       		if ( $arcresults ) {
       				foreach ( (array) $arcresults as $arcresult ) {
       					if ( $arcresult->week != $arc_w_last ) {
       						$arc_year = $arcresult->yr;
       						$arc_w_last = $arcresult->week;
       						$arc_week = get_weekstartend($arcresult->yyyymmdd, get_option('start_of_week'));
       						$arc_week_start = date_i18n($archive_week_start_date_format, $arc_week['start']);
       						$arc_week_end = date_i18n($archive_week_end_date_format, $arc_week['end']);
       						$url  = sprintf('%1$s/%2$s%3$sm%4$s%5$s%6$sw%7$s%8$d', home_url(), '', '?', '=', $arc_year, '&', '=', $arcresult->week) . $cpt_query_var;
       						$text = $arc_week_start . $archive_week_separator . $arc_week_end;
       						if ($show_post_count)
       							$after = '&nbsp;('.$arcresult->posts.')'.$afterafter;
       						$output .= get_archives_link($url, $text, $format, $before, $after);
       					}
       				}
       		}
       	} elseif ( ( 'postbypost' == $type ) || ('alpha' == $type) ) {
       		$orderby = ('alpha' == $type) ? "post_title ASC " : "post_date DESC ";
       		$query = "SELECT * FROM $wpdb->posts $join $where ORDER BY $orderby $limit";
       		$key = md5($query);
       		$cache = wp_cache_get( 'wp_get_cpt_archives' , 'general');
       		if ( !isset( $cache[ $key ] ) ) {
       			$arcresults = $wpdb->get_results($query);
       			$cache[ $key ] = $arcresults;
       			wp_cache_set( 'wp_get_cpt_archives', $cache, 'general' );
       		} else {
       			$arcresults = $cache[ $key ];
       		}
       		if ( $arcresults ) {
       			foreach ( (array) $arcresults as $arcresult ) {
       				if ( $arcresult->post_date != '0000-00-00 00:00:00' ) {
       					$url  = get_permalink($arcresult) . $cpt_query_var;
       					$arc_title = $arcresult->post_title;
       					if ( $arc_title )
       						$text = strip_tags(apply_filters('the_title', $arc_title));
       					else
       						$text = $arcresult->ID;
       					$output .= get_archives_link($url, $text, $format, $before, $after);
       				}
       			}
       		}
       	}
       	if ( $echo )
       		echo $output;
       	else
       		return $output;
       }
       ```
   

The topic ‘Convert Widget Code to Function’ is closed to new replies.

 * In: [Fixing WordPress](https://wordpress.org/support/forum/how-to-and-troubleshooting/)
 * 0 replies
 * 1 participant
 * Last reply from: [ddeuster](https://wordpress.org/support/users/ddeuster/)
 * Last activity: [13 years, 6 months ago](https://wordpress.org/support/topic/convert-widget-code-to-function/)
 * Status: not resolved

## Topics

### Topics with no replies

### Non-support topics

### Resolved topics

### Unresolved topics

### All topics
