Tests whether the catalog has any categories.

shopp('storefront', 'has-categories', 'options')

@param string $object the object or object.tag combination, if object.tag is used, the tag parameter can be omitted
@param string $tag the tag, can be hyphenated or not. Prefix with 'get' as shorthand for the return=true option
@param mixed $options associative array, or url-style name=value pairs separated by ampersands (&). Each pair is passed to the theme api tag as an option.
@returns boolean true if any product categories exist in the catalog, false if no product categories exist.

Used to test for product categories in the catalog.

This function will also load the product categories for looping using the shopp(‘storefront’,’categories’) call. This is similar to “The Loop” structure in WordPress for displaying a custom layout for WordPress posts. Use the Collection Theme API calls inside the loop to display category information specific to the current category of the loop.


  • showsmart: (optional default false) set to ‘before’ or ‘after’ to include all smart pre-programmed collections in before or after the list of product categories.

Universal Options

All Theme API calls have these options.

  • return: when set to true, 1, or on, this option forces the tag to return the value instead of displaying/echoing the value to the page. Alternatively, prefix the tag parameter with get to get the same effect. All theme api tags that return a boolean value will return by default.
  • echo: when set to false, 0, or off, this option forces the tag to display the value to the page. This is the default for all non-boolean tags.
  • is: when set to true, 1, or on, this option will evaluate the return of the theme api call as a boolean true or false value. See how values are converted to boolean.

Alternative Forms

shopp('storefront.has-categories', 'options');


if (shopp('storefront', 'has-categories')) {
    // do something
// load smart categories before product categories
if (shopp('storefront', 'has-categories','showsmart=before')) {
    // do something
<?php if(shopp('storefront','has-categories')): //required ?>
// The categories loop
while(shopp('storefront','categories')): ?>
    …content shown for a specific category…
<?php endwhile; ?>
<?php endif; ?>

See Also

  1. This theme API tag invokes the get_terms function in WordPress and directly passes in the options to this function.

    So, you can do things like this:

    // get only top level categories
    if ( shopp('storefront','has-categories','parent=0') ) {
       // do stuff

    Just like WordPress loop functions, this not only tests for the presence of categories but also loads them into memory for looping.

    June 26th   #

You must be logged in to post a comment.

© Ingenesis Limited. Shopp™ is a registered trademark of Ingenesis Limited.