将变量添加到wordpress归档小部件中的链接


Add variable to link in wordpress archive widget

默认的wordpress Archives小部件有问题。我想为它输出的每个链接添加一个变量。但由于某种原因,它似乎没有将变量添加到链接或任何普通文本中。

这就是我到目前为止所得到的(我正在以自己的主题重新设计小部件,所以没有对wp核心文件进行编辑。):

$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;
}

但这仍然像正常情况下一样输出链接,而不使用str_replace。当我查看我的页面时,我仍然会得到这个来源:

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

而不是

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

有人能告诉我我做错了什么吗?谢谢

这是完整的类:

<?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&#8217;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 }} ?>

使用过滤器的可能解决方案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;
}