Categories: News

How to: Limiting the posts in you archive widget

I have show you how to create a custom widget in a previous post. But how about adding and additional “Archives” widget that won’t list the last 3 years (if you’ve been around that long) in month form stretching down your whole sidebar?

Well, lets take a look at the original code found in the widgets.php file in the ./wp-includes/ folder.

<?php

/**
* Display archives widget.
*
* @since 2.2.0
*
* @param array $args Widget arguments.
*/function wp_widget_archives($args) {
extract($args);
$options = get_option('widget_archives');
$c = $options['count'] ? '1' : '0';
$d = $options['dropdown'] ? '1' : '0';
$title = empty($options['title']) ? __('Archives') : apply_filters('widget_title', $options['title']);

echo $before_widget;
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 attribute_escape(__('Select Month')); ?></option> <?php wp_get_archives("type=monthly&format=option&show_post_count=$c"); ?> </select>
<?php
} else {
?>
<ul>
<?php wp_get_archives("type=monthly&show_post_count=$c"); ?>
</ul>
<?php
}

echo $after_widget;
}

/**
* Display and process archives widget options form.
*
* @since 2.2.0
*/function wp_widget_archives_control() {
$options = $newoptions = get_option('widget_archives');
if ( isset($_POST["archives-submit"]) ) {
$newoptions['count'] = isset($_POST['archives-count']);
$newoptions['dropdown'] = isset($_POST['archives-dropdown']);
$newoptions['title'] = strip_tags(stripslashes($_POST["archives-title"]));
}
if ( $options != $newoptions ) {
$options = $newoptions;
update_option('widget_archives', $options);
}
$count = $options['count'] ? 'checked="checked"' : '';
$dropdown = $options['dropdown'] ? 'checked="checked"' : '';
$title = attribute_escape($options['title']);
?>
<p><label for="archives-title"><?php _e('Title:'); ?> <input class="widefat" id="archives-title" name="archives-title" type="text" value="<?php echo $title; ?>" /></label></p>
<p>
<label for="archives-count"><input class="checkbox" type="checkbox" <?php echo $count; ?> id="archives-count" name="archives-count" /> <?php _e('Show post counts'); ?></label>
<br />
<label for="archives-dropdown"><input class="checkbox" type="checkbox" <?php echo $dropdown; ?> id="archives-dropdown" name="archives-dropdown" /> <?php _e('Display as a drop down'); ?></label>
</p>
<input type="hidden" id="archives-submit" name="archives-submit" value="1" />
<?php } ?>

Simple enough? Or not..

Anyway lets just add on and change a few things. Then will add the final code to your functions.php file.

Okay, starting with the first function: wp_widget_archive and rename to widget_archive_limit

Should look like this now:

function widget_archives_limit($args) {

Then under the this line:

$title = empty($options['title']) ? __('Archives') : apply_filters('widget_title', $options['title']);

Add:

$limit = empty($options['limit']) ? __('Limit') : apply_filters('widget_limit', $options['limit']);

At this line:

<?php wp_get_archives("type=monthly&format=option&show_post_count=$c&limit=$limit"); ?>

We have added in &limit=$limit. The same goes for the second wp_get_archives:

<?php wp_get_archives("type=monthly&show_post_count=$c&limit=$limit"); ?>

At the end of this code add:

wp_register_sidebar_widget('archives limit', __('Archives Limit'), 'widget_archives_limit', $widget_ops);

The whole code should look like this:

function widget_archives_limit($args) {
 extract($args);
 $options = get_option('widget_archives');
 $c = $options['count'] ? '1' : '0';
 $d = $options['dropdown'] ? '1' : '0';
 $title = empty($options['title']) ? __('Archives') : apply_filters('widget_title', $options['title']);
 $limit = empty($options['limit']) ? __('Limit') : apply_filters('widget_limit', $options['limit']);

 echo $before_widget;
 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 attribute_escape(__('Select Month')); ?></option> <?php wp_get_archives("type=monthly&format=option&show_post_count=$c&limit=$limit"); ?> </select>
<?php
 } else {
?>
  <ul>
  <?php wp_get_archives("type=monthly&show_post_count=$c&limit=$limit"); ?>
  </ul>
<?php
 }

 echo $after_widget;
}

wp_register_sidebar_widget('archives limit', __('Archives Limit'), 'widget_archives_limit', $widget_ops);

That takes care of the widget its self, now we need to create the controls. Once again find the second function and change wp_widget_archive_control to widget_archives_limit_control

Find this line:

$newoptions['title'] = strip_tags(stripslashes($_POST["archives-title"]));

and add this line below:

$newoptions['limit'] = strip_tags(stripslashes($_POST["archives-limit"]));

Then find this line:

$title = attribute_escape($options['title']);

and add this line below:

$limit = attribute_escape($options['limit']);

Finally look for this line:

<label for="archives-dropdown"><input class="checkbox" type="checkbox" <?php echo $dropdown; ?> id="archives-dropdown" name="archives-dropdown" /> <?php _e('Display as a drop down'); ?></label>
   </p>

and add this line below:

<p><label for="archives-limit"><?php _e('Limit (enter a number):'); ?> <input class="widefat" id="archives-limit" name="archives-limit" type="text" value="<?php echo $limit; ?>" /></label></p>

then register the widget controls:

wp_register_widget_control('archives limit', __('Archives Limit'), 'widget_archives_limit_control' );

The code should look like this:

function widget_archives_limit_control() {
 $options = $newoptions = get_option('widget_archives');
 if ( isset($_POST["archives-submit"]) ) {
  $newoptions['count'] = isset($_POST['archives-count']);
  $newoptions['dropdown'] = isset($_POST['archives-dropdown']);
  $newoptions['title'] = strip_tags(stripslashes($_POST["archives-title"]));
  $newoptions['limit'] = strip_tags(stripslashes($_POST["archives-limit"]));
 }
 if ( $options != $newoptions ) {
  $options = $newoptions;
  update_option('widget_archives', $options);
 }
 $count = $options['count'] ? 'checked="checked"' : '';
 $dropdown = $options['dropdown'] ? 'checked="checked"' : '';
 $title = attribute_escape($options['title']);
 $limit = attribute_escape($options['limit']);
?>
   <p><label for="archives-title"><?php _e('Title:'); ?> <input class="widefat" id="archives-title" name="archives-title" type="text" value="<?php echo $title; ?>" /></label></p>
   <p>
    <label for="archives-count"><input class="checkbox" type="checkbox" <?php echo $count; ?> id="archives-count" name="archives-count" /> <?php _e('Show post counts'); ?></label>
    <br />
    <label for="archives-dropdown"><input class="checkbox" type="checkbox" <?php echo $dropdown; ?> id="archives-dropdown" name="archives-dropdown" /> <?php _e('Display as a drop down'); ?></label>
   </p>
   <p><label for="archives-limit"><?php _e('Limit (enter a number):'); ?> <input class="widefat" id="archives-limit" name="archives-limit" type="text" value="<?php echo $limit; ?>" /></label></p>
   <input type="hidden" id="archives-submit" name="archives-submit" value="1" />
<?php } 

wp_register_widget_control('archives limit', __('Archives Limit'), 'widget_archives_limit_control' );

The final code:

/**
 * Display archives widget.
 *
 * @since 2.2.0
 *
 * @param array $args Widget arguments.
 */function widget_archives_limit($args) {
 extract($args);
 $options = get_option('widget_archives');
 $c = $options['count'] ? '1' : '0';
 $d = $options['dropdown'] ? '1' : '0';
 $title = empty($options['title']) ? __('Archives') : apply_filters('widget_title', $options['title']);
 $limit = empty($options['limit']) ? __('Limit') : apply_filters('widget_limit', $options['limit']);

 echo $before_widget;
 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 attribute_escape(__('Select Month')); ?></option> <?php wp_get_archives("type=monthly&format=option&show_post_count=$c&limit=$limit"); ?> </select>
<?php
 } else {
?>
  <ul>
  <?php wp_get_archives("type=monthly&show_post_count=$c&limit=$limit"); ?>
  </ul>
<?php
 }

 echo $after_widget;
}

wp_register_sidebar_widget('archives limit', __('Archives Limit'), 'widget_archives_limit', $widget_ops);

/**
 * Display and process archives widget options form.
 *
 * @since 2.2.0
 */function widget_archives_limit_control() {
 $options = $newoptions = get_option('widget_archives');
 if ( isset($_POST["archives-submit"]) ) {
  $newoptions['count'] = isset($_POST['archives-count']);
  $newoptions['dropdown'] = isset($_POST['archives-dropdown']);
  $newoptions['title'] = strip_tags(stripslashes($_POST["archives-title"]));
  $newoptions['limit'] = strip_tags(stripslashes($_POST["archives-limit"]));
 }
 if ( $options != $newoptions ) {
  $options = $newoptions;
  update_option('widget_archives', $options);
 }
 $count = $options['count'] ? 'checked="checked"' : '';
 $dropdown = $options['dropdown'] ? 'checked="checked"' : '';
 $title = attribute_escape($options['title']);
 $limit = attribute_escape($options['limit']);
?>
   <p><label for="archives-title"><?php _e('Title:'); ?> <input class="widefat" id="archives-title" name="archives-title" type="text" value="<?php echo $title; ?>" /></label></p>
   <p>
    <label for="archives-count"><input class="checkbox" type="checkbox" <?php echo $count; ?> id="archives-count" name="archives-count" /> <?php _e('Show post counts'); ?></label>
    <br />
    <label for="archives-dropdown"><input class="checkbox" type="checkbox" <?php echo $dropdown; ?> id="archives-dropdown" name="archives-dropdown" /> <?php _e('Display as a drop down'); ?></label>
   </p>
   <p><label for="archives-limit"><?php _e('Limit (enter a number):'); ?> <input class="widefat" id="archives-limit" name="archives-limit" type="text" value="<?php echo $limit; ?>" /></label></p>
   <input type="hidden" id="archives-submit" name="archives-submit" value="1" />
<?php } 

wp_register_widget_control('archives limit', __('Archives Limit'), 'widget_archives_limit_control' );
Web Master

Hi, I am Miguel, I bought this site in 2009. So I now run or manage the site. Please visit my new website or follow me on twitter @W3i.

View Comments

Recent Posts

Add additional meta boxes to Hybrid Theme

At the time of writing this post I have Theme Hybrid as my parent theme,…

16 hours ago

What do Software as a Service (SaaS) Companies Do?

What do Software as a Service (SaaS) Companies Do?

1 day ago

Sick of images being to large for the content area?

Have you ever uploaded an image that might have been a tad bigger than the…

2 days ago

And the winners who receive a free book are.

See, I really did pull the winner out of a hat, lol. Well In my…

2 days ago

45X Ways to Skyrocket Your Search Traffic

This Traffic guide offers 45 strategies to boost search traffic, focusing on technical SEO, content,…

3 days ago