0

I'm new to WordPress WooCommerce and I can't figure out how to add a "default sorting" drop-down filter to my category shop pages. I know it's on the plain old "SHOP" page, but my navigation doesn't even show that page (I set that up that way by choice). I have category pages (Cupcakes, Balloons, Plush, Cakes) and sub-category pages (for example: Cupcakes—Flavors Cupcakes—Assortments, Cupcakes—Holiday&Seasonal [etc.]), and I would like to have a "sort-by (price, popularity, average rating, newest) drop-down menu on ALL of those unique pages.

Seems like such a basic thing. Does anyone know how to do this? Is it even possible?

I am using the "Shoppest" theme.

Here is my full archive-product.php page code.

<?php

/**

 * The Template for displaying product archives, including the main shop page 
which is a post type archive.

 *

 * Override this template by copying it to yourtheme/woocommerce/archive-
product.php
 *
 * @author      WooThemes
 * @package     WooCommerce/Templates
 * @version     2.0.0
 */


if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly


get_header('shop'); ?>


    <?php

        /**
     * Shoppest - remove woocommerce_output_content_wrapper & breadcrumb
     * 
     * woocommerce_before_main_content hook
     *
     * @hooked woocommerce_output_content_wrapper - 10 (outputs opening divs for the content)
     * @hooked woocommerce_breadcrumb - 20
     */
    do_action('woocommerce_before_main_content');
?>

<?php
    // check sidebar position
    $options = get_option('shoppest');
    $layout = ( isset($options['shop_layout']) && !empty($options['shop_layout']) ) ? $options['shop_layout'] : 'sidebarleft';
    //echo $option['shop_layout'];
    if ( $layout != 'fullwidth' ) {
        $cssclass = 'span9';
        if ( $layout == 'sidebarleft') $cssclass .= ' contentright';
    } else {
        $cssclass = 'span12';
    }
?>

<div role="main" id="content" class="<?php echo $cssclass; ?>">

    <?php // make show page title false ?>

    <?php if ( apply_filters( 'woocommerce_show_page_title', false ) ) : ?>

        <h1 class="page-title"><?php woocommerce_page_title(); ?></h1>

    <?php endif; ?>

    <?php 
        /*
         *  Shoppest - remove woocommerce_archive_description [ that display description]
         *
         *  @hooked sama_shop_slider - 10
         */
        do_action( 'woocommerce_archive_description' );
    ?>

    <?php if ( have_posts() ) : ?>

        <?php
            $options = get_option('shoppest');
            $icon_layout = ( isset($options['shop_icon_layout']) ) ? $options['shop_icon_layout'] : true;
        ?>

            <div class="productFilter clearfix">

                <?php
                    /**
                     * Shoppest - remove woocommerce_result_count
                     *
                     * woocommerce_before_shop_loop hook
                     *
                     * @hooked woocommerce_result_count - 20
                     * @hooked woocommerce_catalog_ordering - 30
                     */
                    do_action( 'woocommerce_before_shop_loop' );
                ?>

                <?php if ($icon_layout) { ?>
                    <div class="displaytBy inline pull-right">
                        <?php _e( 'Display', 'samathemes' ); ?>
                        <div class="btn-group">
                            <button id="grid" class="btn btn-primary active"><i class="icon-th"></i></button>
                            <button id="list" class="btn"><i class="icon-list"></i></button>
                        </div>
                    </div><!--end displaytBy-->
                <?php } ?>

            </div><!--end productFilter-->
        <?php woocommerce_product_loop_start(); ?>

            <?php woocommerce_product_subcategories(); ?>

            <?php while ( have_posts() ) : the_post(); ?>

                <?php woocommerce_get_template_part( 'content', 'product' ); ?>

            <?php endwhile; // end of the loop. ?>

        <?php woocommerce_product_loop_end(); ?>

        <?php
            /**
             * woocommerce_after_shop_loop hook
             *
             * @hooked woocommerce_pagination - 10
             */
            do_action( 'woocommerce_after_shop_loop' );
        ?>

    <?php elseif ( ! woocommerce_product_subcategories( array( 'before' => woocommerce_product_loop_start( false ), 'after' => woocommerce_product_loop_end( false ) ) ) ) : ?>

        <?php woocommerce_get_template( 'loop/no-products-found.php' ); ?>

    <?php endif; ?>

    <?php
        /**
         * woocommerce_after_main_content hook
         *
         * @hooked woocommerce_output_content_wrapper_end - 10 (outputs closing divs for the content)
         */
        do_action('woocommerce_after_main_content');
    ?>

</div> <!-- end span9 -->

<?php
    /**
     * woocommerce_sidebar hook
     *
     * @hooked woocommerce_get_sidebar - 10
     */
    if ( $layout != 'fullwidth' ) {
        do_action('woocommerce_sidebar');
    }
?>

<?php get_footer('shop'); ?>

1 Answer 1

1

Take a look at whether or not your theme has an archive-product.php file in the woocommerce folder. This is a copy of the WooCommerce category template (which is displayed by archive-product.php. As long as your template has the do_action( 'woocommerce_before_shop_loop' ); action hook then the woocommerce_catalog_ordering() function should automatically be called with a priority of 30... as it says directly in the code comments. Either your theme templates need to be updated for WooCommerce 2.0 or your theme has intentionally removed the woocommerce_catalog_ordering() function from the woocommerce_before_shop_loop.

<?php
/**
 * The Template for displaying product archives, including the main shop page which is a post type archive.
 *
 * Override this template by copying it to yourtheme/woocommerce/archive-product.php
 *
 * @author      WooThemes
 * @package     WooCommerce/Templates
 * @version     2.0.0
 */

if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly

get_header('shop'); ?>

    <?php
        /**
         * woocommerce_before_main_content hook
         *
         * @hooked woocommerce_output_content_wrapper - 10 (outputs opening divs for the content)
         * @hooked woocommerce_breadcrumb - 20
         */
        do_action('woocommerce_before_main_content');
    ?>

        <?php if ( apply_filters( 'woocommerce_show_page_title', true ) ) : ?>

            <h1 class="page-title"><?php woocommerce_page_title(); ?></h1>

        <?php endif; ?>

        <?php do_action( 'woocommerce_archive_description' ); ?>

        <?php if ( have_posts() ) : ?>

            <?php
                /**
                 * woocommerce_before_shop_loop hook
                 *
                 * @hooked woocommerce_result_count - 20
                 * @hooked woocommerce_catalog_ordering - 30
                 */
                do_action( 'woocommerce_before_shop_loop' );
            ?>

            <?php woocommerce_product_loop_start(); ?>

                <?php woocommerce_product_subcategories(); ?>

                <?php while ( have_posts() ) : the_post(); ?>

                    <?php woocommerce_get_template_part( 'content', 'product' ); ?>

                <?php endwhile; // end of the loop. ?>

            <?php woocommerce_product_loop_end(); ?>

            <?php
                /**
                 * woocommerce_after_shop_loop hook
                 *
                 * @hooked woocommerce_pagination - 10
                 */
                do_action( 'woocommerce_after_shop_loop' );
            ?>

        <?php elseif ( ! woocommerce_product_subcategories( array( 'before' => woocommerce_product_loop_start( false ), 'after' => woocommerce_product_loop_end( false ) ) ) ) : ?>

            <?php woocommerce_get_template( 'loop/no-products-found.php' ); ?>

        <?php endif; ?>

    <?php
        /**
         * woocommerce_after_main_content hook
         *
         * @hooked woocommerce_output_content_wrapper_end - 10 (outputs closing divs for the content)
         */
        do_action('woocommerce_after_main_content');
    ?>

    <?php
        /**
         * woocommerce_sidebar hook
         *
         * @hooked woocommerce_get_sidebar - 10
         */
        do_action('woocommerce_sidebar');
    ?>

<?php get_footer('shop'); ?>

Updated based on your template code:

Just because you are using WooCommerce 2.0 doesn't mean that your theme's templates were updated. I have had to do that for several clients. However, the action hook do_action( 'woocommerce_before_shop_loop' ); is present.

I would:

  1. verify whether it is in the markup (view source) and being hidden by CSS
  2. check all the functions for something that would remove the function: remove_action('woocommerce_before_shop_loop', 'woocommerce_catalog_ordering', 30);
  3. check all the function for a modified definition of woocommerce_catalog_ordering()
  4. rename the archive-product.php template to something else temporarily archive-productTEST.php so that WooCommerce will load it's default template instead

Without access to your site/code that is about all I can suggest.

1
  • Thank you for the response @helgatheviking! My archive product page definitely looks different than what you posted and I am running 2.0.0. I posted my full archive-product.php code within my original question. HAve you any idea what needs changing? Or perhaps I have set the store pages up incorrectly??? I don't think I have though since the browser reads "/shop/" before all of my added product category pages and single items. I am at a loss here!
    – Naomi
    Sep 27, 2013 at 5:02

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.