[wp-hackers] Exclude Categories From The Loop

Kevin wyldwolf at gmail.com
Fri Oct 5 15:24:29 GMT 2007


Here is some actual SQL, which for the record will not work in WP 2.3,
and in addition to wp_posts.ID you probably want to pull out other
info (thus avoiding additional queries). Without digging in real deep
into the WP scheme this is as optimized query as I can come up with.

SELECT wpp.id
FROM wp_posts AS wpp, wp_post2cat AS wpc
WHERE wpp.id = wpc.post_id
AND wpc.category_id !=2

Kevin

On 10/5/07, Paul Menard <paul at codehooligans.com> wrote:
> This was not my original post but I do want to offer my opinion on
> your reply.
>
> You are correct this will 'filter' the post loop items and allow you
> to display just the ones you want.
> However, there are a couple issues with this off the top of my head.
>
> 1. As you also pointed out this is not very efficient because at this
> point WP have pre-selected all posts. If you only want a single
> category and that category only contain 10 items of the lager 3000
> post item of your blog then the If (in_category()) will be executed
> for 3000 to check.
>
> 2. If I set my display items per page count to 5 and considering the
> above information I may have to add even more code to ensure the user
> sees 5 items per page and the paging works correctly.
>
> 3. You could do what I've done many times in the past and ignore the
> post/loop provided by WordPress and build your own query in the
> template. But again this is grossly inefficient in my opinion since
> for WP performs the query (+1 database hit) then you hit the database
> again to run your custom query.
>
> P-
>
>
>
> On Oct 5, 2007, at 8:35 AM, Kevin wrote:
>
> > Unless something has changed shouldn't the code referenced in the
> > codex loop page work?
> > http://codex.wordpress.org/The_Loop
> >
> > Specificly:
> > <?php if (in_category('3')) continue; ?>
> >
> > Obviously this isn't optimized from a SQL perspective (you're still
> > pull all posts from the DB, just not displaying some of them), but it
> > does what was asked for.
> >
> > Kevin
> >
> > On 10/5/07, Paul Menard <paul at codehooligans.com> wrote:
> >> I generally exclude/include categories using a simple function I keep
> >> in the functions.php file. The following example was setup because
> >> the client only wanted content from the category '1' displayed on the
> >> home page.
> >>
> >> function myHomePostsFilter($query)
> >> {
> >>         if ($query->is_home)
> >>         {
> >>                 $query->set('cat','1');
> >>         }
> >>         return $query;
> >> }
> >> add_filter('pre_get_posts','myHomePostsFilter');
> >>
> >> The is_home has other sibling functions like is_search, is_list, etc.
> >> Via the query set() you can also pass the second argument as '-1, -2,
> >> -3'. I turned this into a simple plugin. It has two admin panels, one
> >> for categories and one for pages. The pages section is used to simply
> >> exclude pages from search. But there are other 'actions' where pages
> >> may need to be excluded. But it's not all that clean. If anyone wants
> >> to see this let me know. Also this code works well for WP2.2 and
> >> below. HAve not looked into using this similar for tags.
> >>
> >> There was a plugin I found for pre-WP2.1 called Category Visibility.
> >> It was doing some very complicated MySQL queries and would not work
> >> with 2.2. This seemed like overkill.
> >>
> >>
> >>
> >> P-
> >>
> >>
> >>
> >>
> >> On Oct 5, 2007, at 1:54 AM, Michael D Adams wrote:
> >>
> >>> On Oct 4, 2007, at 7:37 PM, Matt wrote:
> >>>> Is it possible to exclude certain catgories from displaying in the
> >>>> loop,
> >>>> with a plugin?
> >>>
> >>> Do you mean exclude posts from the loop that belong to a specific
> >>> category?  I don't know if there's a better way to do this now, but
> >>> there's an old plugin by Ryan that can do this.
> >>>
> >>> http://wordpress.org/extend/plugins/front-page-cats/
> >>>
> >>> There's no UI.  Change $cats_to_show to '-28' (or whatever category
> >>> you want to exclude), and remove the is_home reference to get it to
> >>> work everywhere (... or maybe change it to !is_admin...).
> >>>
> >>> Michael
> >>> _______________________________________________
> >>> wp-hackers mailing list
> >>> wp-hackers at lists.automattic.com
> >>> http://lists.automattic.com/mailman/listinfo/wp-hackers
> >>
> >> _______________________________________________
> >> wp-hackers mailing list
> >> wp-hackers at lists.automattic.com
> >> http://lists.automattic.com/mailman/listinfo/wp-hackers
> >>
> >
> >
> >
> > --
> > Kevin Kelley
> > http://technogeek.org/
> > _______________________________________________
> > wp-hackers mailing list
> > wp-hackers at lists.automattic.com
> > http://lists.automattic.com/mailman/listinfo/wp-hackers
>
> _______________________________________________
> wp-hackers mailing list
> wp-hackers at lists.automattic.com
> http://lists.automattic.com/mailman/listinfo/wp-hackers
>


-- 
Kevin Kelley
http://technogeek.org/


More information about the wp-hackers mailing list