Add variable to link in wordpress archive widget

I’ve got a problem with the default wordpress Archives widget. I want to add a variable to each link it outputs. But for some reason it doesn’t seem to add the variable to the link or any normal text.

This is what I’ve got so far (I’m reworking the widget in my own theme so no edits to the wp core files.):

Read More
$archive = wp_get_archives(apply_filters('widget_archive_args', array('type' => 'monthly', 'show_post_count' => $c, 'echo' => 0)));
$archive = explode( '</li>' , $archive );
foreach( $archive as $link ) {
    $catid='?catid='.$category.'/"';
    $link = str_replace('/"',$catid, $link);
    echo $link;
}

But this still outputs the link as it does normally without the str_replace. I still get this when I view my pagesource:

<a title="bla" href="http://www.mysite.com/2013/02/">February 2013</a>

instead of

<a title="bla" href="http://www.mysite.com/2013/02/?catid=24">February 2013</a>

So can anybody please tell me what I’m doing wrong? Thanks!

This is the complete class:

<?php class WP_widget_archive_by_category extends WP_Widget {

function __construct() {
    $widget_ops = array('classname' => 'widget_archive_by_category', 'description' => __( 'A monthly archive of your site’s posts from selected category') );
    parent::__construct('Archives-By-Category', __('Archives By Category'), $widget_ops);
}

function widget( $args, $instance ) {
    extract($args);
    $c = ! empty( $instance['count'] ) ? '1' : '0';
    $d = ! empty( $instance['dropdown'] ) ? '1' : '0';
    $title = apply_filters('widget_title', empty($instance['title']) ? __('Archives By Category') : $instance['title'], $instance, $this->id_base);
    if( ! $category = $instance["cat"] )  $category='';

    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_archive_dropdown_args', array('type' => 'monthly', 'format' => 'option', 'show_post_count' => $c))); ?> </select>
<?php //'cat' => $category
    } else { ?>
    <ul>
    <?php // 'cat' => $category,
    $archive = wp_get_archives(apply_filters('widget_archive_args', array('type' => 'monthly', 'show_post_count' => $c, 'echo' => 0)));
$archive = explode( '</li>' , $archive );
foreach( $archive as $link ) {
$catid='?catid='.$category.'/"';
$link = str_replace('/"',$catid, $link);
echo $link;

}
?>


    </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' => '') );
    $instance['title'] = strip_tags($new_instance['title']);
    $instance['count'] = $new_instance['count'] ? 1 : 0;
    $instance['dropdown'] = $new_instance['dropdown'] ? 1 : 0;
    $instance['cat'] = (int) $new_instance['cat'];

    return $instance;
}

function form( $instance ) {
    $instance = wp_parse_args( (array) $instance, array( 'title' => '', 'count' => 0, 'dropdown' => '') );
    $title = strip_tags($instance['title']);
    $count = $instance['count'] ? 'checked="checked"' : '';
    $dropdown = $instance['dropdown'] ? 'checked="checked"' : '';
    $category  = isset( $instance['cat'] ) ? absint( $instance['cat'] ) : 1;
?>
    <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>
        <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>
<p>
<label>
<?php _e( 'Category' ); ?>
:
<?php wp_dropdown_categories( array( 'name' => $this->get_field_name('cat'), 'selected' => $instance['cat'], 'show_option_all' => 'All Categories', 'hide_empty' => '0') ); ?>
</label>
</p>
<?php }} ?>

Related posts

Leave a Reply

1 comment

  1. Possible solution using the filter get_archives_link:

    add_filter( 'get_archives_link', 'add_parameter_to_archive_link_so_14939880' );
    
    function add_parameter_to_archive_link_so_14939880( $html )
    {
        $dom = new DOMDocument();
        $dom->loadHTML($html);
    
        foreach ($dom->getElementsByTagName('a') as $item) 
        {
            $href = $item->getAttribute( 'href' );
            $item->setAttribute( 'href', $href.'?CUSTOM_PARAM' ); // <-- Adjust here
            $return = str_replace( 
                array( '<html>', '</html>', '<body>', '</body>' ), 
                array( '', '', '', '' ),
                $dom->saveHTML()
            );
            return $return;
        }
        return $html;
    }