WordPress.org

Support

Support » How-To and Troubleshooting » Loop stuck on get_categories and then foreach

Loop stuck on get_categories and then foreach

  • I’m using this code to style top level categories that have posts differently from the ones that don’t have posts. But the loop gets stuck now that I have more categories. It worked well with 200 categories, but now I have about 3000 categories and it get stuck on the first one.

    Has this to do with php limits or WordPress limits?

    $allcats = get_categories('hide_empty=0&exclude=1&orderby=slug&order=ASC');
    foreach($allcats as $thecat) {
    	$test=get_posts('category='.$thecat->cat_ID);
    	if ($thecat->parent < 1) {
    	if ($test) {
    	echo "<li><a href=\"" . get_category_link($thecat->cat_ID) . "\"><span>". get_cat_name($thecat->cat_ID) ."</span></a></li>";
    	} else {
    	echo "<li class=\"maincatinactief\"><span>". get_cat_name($thecat->cat_ID) ."</span></li>";
    	}
    	}
    }
Viewing 12 replies - 1 through 12 (of 12 total)
  • user “number” in the function

    What function?

    use like this get_categories(‘hide_empty=0&exclude=1&orderby=slug&order=ASC&number=10’);

    Thanks. I tried that with number=20 or number=20000 but no results. When I set hide_empty to 1 the code above works, when set to 0 it doesn’t, even with number set to 20000.

    Moderator keesiemeijer

    @keesiemeijer

    couldn’t you do something like this to test if top level categories have posts:

    <?php
    $allcats = get_categories('hide_empty=0&exclude=1&orderby=slug&order=ASC');
    
    foreach($allcats as $thecat) {
    	if ($thecat->parent == 0) {
    	  if($thecat->count > 0) {
    	    // top level category with posts
    	  } else {
    	    // top level category without posts
    	  }
    	}
    }
    
    ?>

    It looks like the code of keesiemeijer is working. No idea why that other code isn’t. Keesie, is this code ‘bullet proof’? 😉 I mean, I have parent > first child > second child categories, and only the second child categories actually have posts, the rest is pure for navigation purposes.

    Moderator keesiemeijer

    @keesiemeijer

    I think so, you can also do an else for child categories:

    if ($thecat->parent == 0) {
    	  if($thecat->count > 0) { // post count
    	    // top level category with posts
    	  } else {
    	    // top level category without posts
    	  }
    } else {
    // do stuff for child categories here
              if($thecat->count > 0) { // post count
    	    // child category with posts
    	  } else {
    	    // child category without posts
    	  }
    }

    Looks good. The only thing is it will only work when using the checkboxes for all levels: the top level parent, the first child category and the category on the second and deepest level. That’s no problem, but now my breadcrumbs aren’t working anymore 🙁 Perhaps looking for another breadcrumb plugin.

    Moderator keesiemeijer

    @keesiemeijer

    Did they work before my code? I think (not tested) in your code the conditionals should be this way around:

    if ($test) { // category has posts
    if ($thecat->parent < 1) { // this is a top level category

    Which code is faster? In my case that’s rather important. so if your code is faster, I’m happy to look for another plugin.

    Moderator keesiemeijer

    @keesiemeijer

    Well, my code is faster because it doesn’t need to query all posts belonging to a category (they are part of the the original query from get_categories()).

    Ah, ok 🙂 That sounds good! Do you by any chance also know how I could get the top level category to display in my searchresults? the_category() shows all three of them, but I only need the top level cat.

Viewing 12 replies - 1 through 12 (of 12 total)
  • The topic ‘Loop stuck on get_categories and then foreach’ is closed to new replies.