WordPress.org

Forums

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

  1. vicstick
    Member
    Posted 11 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');
    
        ?>
  2. hkonno
    Member
    Posted 1 day ago #

    I don't know if you managed to find a solution to this. Also I'm not sure what you mean by Older Posts widget, but if you meant the default Archives widget, adding a filter to getarchives_where should work.

    function my_arc_widget_exclude_category($x) {
    	global $wpdb;
    	$excl_cat = get_cat_id('category_to_be_excluded');
        $where_cond = !empty($x) ? $x . ' AND ' : 'WHERE ';
        $where_cond = $where_cond
            . "$wpdb->posts.ID NOT IN (SELECT p.ID FROM $wpdb->posts AS p "
            .  " INNER JOIN $wpdb->term_relationships AS r ON (p.ID = r.object_id)"
            .  " INNER JOIN $wpdb->term_taxonomy AS t ON (r.term_taxonomy_id = t.term_taxonomy_id)"
            .  " WHERE t.taxonomy = 'category' AND t.term_id IN ($excl_cat))";
        return $where_cond;
    }
    add_filter( 'getarchives_where', 'my_arc_widget_exclude_category' );

    Replace category_to_be_excluded with the category you want to exclude and place the above code in your function.php. You might experience performance issue if you have many posts.

Reply

You must log in to post.

About this Topic