WordPress.org

Forums

Exclude a post category from the Older Posts count. (1 post)

  1. vicstick
    Member
    Posted 10 months ago #

    Hello, sorry if this is a repeat post - I've searched all over but can't find an answer to this. I'm hoping you can help!

    I have managed to exclude an unwanted category of posts from my blog page - and also from the Recent Posts sidebar widget - by means of adding a couple of snippets of code that I found online to the bottom of my theme's functions.php file (I'll post the code I'm using below, in case it's useful).

    However, the count in the Older Posts widget is now wrong - the excluded posts are still counted! You can see this at http://www.wymondhamukulelegroup.com/our-blog/

    I'd like to amend the post count to exclude that category too. Can anyone point me in the right direction? I'd really appreciate it.

    function remove_my_categories( $wp_query ) {
       //5= 'Tabs' category
     	$remove_cat = '-5';
    
    	// remove from archives (except category archives), feeds, search, and home page
    	if( is_home() || is_feed() || is_search() || ( is_archive() && !is_category() )) {
    		set_query_var('cat', $remove_cat);
    		//which is merely the more elegant way to write:
    		//$wp_query->set('cat', '-' . $remove_cat);
    	}
    }
    
    add_action('pre_get_posts', 'remove_my_categories' );
    
        /**
         * Recent_Posts widget w/ category exclude class
         * This allows specific Category IDs to be removed from the Sidebar Recent Posts list
         *
         */
        class WP_Widget_Recent_Posts_Exclude extends WP_Widget {
    
                function __construct() {
                        $widget_ops = array('classname' => 'widget_recent_entries', 'description' => __( "The most recent posts on your site") );
                        parent::__construct('recent-posts', __('Recent Posts with Exclude'), $widget_ops);
                        $this->alt_option_name = 'widget_recent_entries';
    
                        add_action( 'save_post', array(&$this, 'flush_widget_cache') );
                        add_action( 'deleted_post', array(&$this, 'flush_widget_cache') );
                        add_action( 'switch_theme', array(&$this, 'flush_widget_cache') );
                }
    
                function widget($args, $instance) {
                        $cache = wp_cache_get('widget_recent_posts', 'widget');
    
                        if ( !is_array($cache) )
                                $cache = array();
    
                        if ( ! isset( $args['widget_id'] ) )
                                $args['widget_id'] = $this->id;
    
                        if ( isset( $cache[ $args['widget_id'] ] ) ) {
                                echo $cache[ $args['widget_id'] ];
                                return;
                        }
    
                        ob_start();
                        extract($args);
    
                        $title = apply_filters('widget_title', empty($instance['title']) ? __('Recent Posts') : $instance['title'], $instance, $this->id_base);
                        if ( empty( $instance['number'] ) || ! $number = absint( $instance['number'] ) )
                                $number = 10;
                        $exclude = empty( $instance['exclude'] ) ? '' : $instance['exclude'];
    
                        $r = new WP_Query(array('posts_per_page' => $number, 'no_found_rows' => true, 'post_status' => 'publish', 'ignore_sticky_posts' => true, 'category__not_in' => explode(',', $exclude) ));
                        if ($r->have_posts()) :
        ?>
                        <?php //echo print_r(explode(',', $exclude)); ?>
                        <?php echo $before_widget; ?>
                        <?php if ( $title ) echo $before_title . $title . $after_title; ?>
                        <ul>
                        <?php  while ($r->have_posts()) : $r->the_post(); ?>
                        <li><a href="<?php the_permalink() ?>" title="<?php echo esc_attr(get_the_title() ? get_the_title() : get_the_ID()); ?>"><?php if ( get_the_title() ) the_title(); else the_ID(); ?></a></li>
                        <?php endwhile; ?>
                        </ul>
                        <?php echo $after_widget; ?>
        <?php
                        // Reset the global $the_post as this query will have stomped on it
                        wp_reset_postdata();
    
                        endif;
    
                        $cache[$args['widget_id']] = ob_get_flush();
                        wp_cache_set('widget_recent_posts', $cache, 'widget');
                }
    
                function update( $new_instance, $old_instance ) {
                        $instance = $old_instance;
                        $instance['title'] = strip_tags($new_instance['title']);
                        $instance['number'] = (int) $new_instance['number'];
                        $instance['exclude'] = strip_tags( $new_instance['exclude'] );
                        $this->flush_widget_cache();
    
                        $alloptions = wp_cache_get( 'alloptions', 'options' );
                        if ( isset($alloptions['widget_recent_entries']) )
                                delete_option('widget_recent_entries');
    
                        return $instance;
                }
    
                function flush_widget_cache() {
                        wp_cache_delete('widget_recent_posts', 'widget');
                }
    
                function form( $instance ) {
                        $title = isset($instance['title']) ? esc_attr($instance['title']) : '';
                        $number = isset($instance['number']) ? absint($instance['number']) : 5;
                        $exclude = esc_attr( $instance['exclude'] );
        ?>
                        <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 $title; ?>" /></p>
    
                        <p><label for="<?php echo $this->get_field_id('number'); ?>"><?php _e('Number of posts to show:'); ?></label>
                        <input id="<?php echo $this->get_field_id('number'); ?>" name="<?php echo $this->get_field_name('number'); ?>" type="text" value="<?php echo $number; ?>" size="3" /></p>
    
                        <p>
                                <label for="<?php echo $this->get_field_id('exclude'); ?>"><?php _e( 'Exclude Category(s):' ); ?></label> <input type="text" value="<?php echo $exclude; ?>" name="<?php echo $this->get_field_name('exclude'); ?>" id="<?php echo $this->get_field_id('exclude'); ?>" class="widefat" />
                                <br />
                                <small><?php _e( 'Category IDs, separated by commas.' ); ?></small>
                        </p>
        <?php
                }
        }
    
        function WP_Widget_Recent_Posts_Exclude_init() {
            unregister_widget('WP_Widget_Recent_Posts');
            register_widget('WP_Widget_Recent_Posts_Exclude');
        }
    
        add_action('widgets_init', 'WP_Widget_Recent_Posts_Exclude_init');
    
        ?>

Reply

You must log in to post.

About this Topic