Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

Woocommerce out of the box provides many widgets, however the category widget for providing a product search, groups ALL the categories into one widget.

I want a widget for one category, i.e. 'shop by meaning' and another widget 'shop by letter' etc.

I grabbed the widget code for widget-product_categories.php from the woocommerce plugin...thinking I could simple modify the code for the 'size' category I created within the woocommerce plugin.

However, I quickly found it's beyond my scope.

Since I need to create 4 different widgets with 'shop by xxx' searches, any help would be appreciated. Below is the code from the woo widget that provides ALL the categories in one widget.

Is there a way to recode this for a single category return for 'size'?

var $woo_widget_cssclass;
var $woo_widget_description;
var $woo_widget_idbase;
var $woo_widget_name;
var $cat_ancestors;
var $current_cat;

/**
 * constructor
 *
 * @access public
 * @return void
 */
function WooCommerce_Widget_Product_Categories() {

    /* Widget variable settings. */
    $this->woo_widget_cssclass = 'widget_product_categories';
    $this->woo_widget_description = __( 'A list or dropdown of product categories.', 'woocommerce' );
    $this->woo_widget_idbase = 'woocommerce_product_categories';
    $this->woo_widget_name = __('WooCommerce Product Categories', 'woocommerce' );

    /* Widget settings. */
    $widget_ops = array( 'classname' => $this->woo_widget_cssclass, 'description' => $this->woo_widget_description );

    /* Create the widget. */
    $this->WP_Widget('product_categories', $this->woo_widget_name, $widget_ops);
}


/**
 * widget function.
 *
 * @see WP_Widget
 * @access public
 * @param array $args
 * @param array $instance
 * @return void
 */
function widget( $args, $instance ) {
    extract( $args );

    $title = apply_filters('widget_title', empty( $instance['title'] ) ? __( 'Product Categories', 'woocommerce' ) : $instance['title'], $instance, $this->id_base);
    $c = $instance['count'] ? '1' : '0';
    $h = $instance['hierarchical'] ? true : false;
    $s = (isset($instance['show_children_only']) && $instance['show_children_only']) ? '1' : '0';
    $d = $instance['dropdown'] ? '1' : '0';
    $o = isset($instance['orderby']) ? $instance['orderby'] : 'order';

    echo $before_widget;
    if ( $title ) echo $before_title . $title . $after_title;

    $cat_args = array('show_count' => $c, 'hierarchical' => $h, 'taxonomy' => 'product_cat');

    if ( $o == 'order' ) {

        $cat_args['menu_order'] = 'asc';

    } else {

        $cat_args['orderby'] = 'title';

    }

    if ( $d ) {

        // Stuck with this until a fix for http://core.trac.wordpress.org/ticket/13258
        woocommerce_product_dropdown_categories( $c, $h, 0 );

        ?>
        <script type='text/javascript'>
        /* <![CDATA[ */
            var dropdown = document.getElementById("dropdown_product_cat");
            function onCatChange() {
                if ( dropdown.options[dropdown.selectedIndex].value !=='' ) {
                    location.href = "<?php echo home_url(); ?>/?product_cat="+dropdown.options[dropdown.selectedIndex].value;
                }
            }
            dropdown.onchange = onCatChange;
        /* ]]> */
        </script>
        <?php

    } else {

        global $wp_query, $post, $woocommerce;

        $this->current_cat = false;
        $this->cat_ancestors = array();

        if ( is_tax('product_cat') ) :

            $this->current_cat = $wp_query->queried_object;
            $this->cat_ancestors = get_ancestors( $this->current_cat->term_id, 'product_cat' );

        elseif ( is_singular('product') ) :

            $product_category = wp_get_post_terms( $post->ID, 'product_cat' );

            if ($product_category) :
                $this->current_cat = end($product_category);
                $this->cat_ancestors = get_ancestors( $this->current_cat->term_id, 'product_cat' );
            endif;

        endif;

        include_once( $woocommerce->plugin_path() . '/classes/walkers/class-product-cat-list-walker.php' );

        $cat_args['walker']             = new WC_Product_Cat_List_Walker;
        $cat_args['title_li']           = '';
        $cat_args['show_children_only'] = ( isset( $instance['show_children_only'] ) && $instance['show_children_only'] ) ? 1 : 0;
        $cat_args['pad_counts']         = 1;
        $cat_args['show_option_none']   = __('No product categories exist.', 'woocommerce');
        $cat_args['current_category']   = ( $this->current_cat ) ? $this->current_cat->term_id : '';
        $cat_args['current_category_ancestors'] = $this->cat_ancestors;

        echo '<ul class="product-categories">';

        wp_list_categories( apply_filters( 'woocommerce_product_categories_widget_args', $cat_args ) );

        echo '</ul>';

    }

    echo $after_widget;
}


/**
 * update function.
 *
 * @see WP_Widget->update
 * @access public
 * @param array $new_instance
 * @param array $old_instance
 * @return array
 */
function update( $new_instance, $old_instance ) {
    $instance = $old_instance;
    $instance['title'] = strip_tags($new_instance['title']);
    $instance['orderby'] = strip_tags($new_instance['orderby']);
    $instance['count'] = !empty($new_instance['count']) ? 1 : 0;
    $instance['hierarchical'] = !empty($new_instance['hierarchical']) ? true : false;
    $instance['dropdown'] = !empty($new_instance['dropdown']) ? 1 : 0;
    $instance['show_children_only'] = !empty($new_instance['show_children_only']) ? 1 : 0;

    return $instance;
}


/**
 * form function.
 *
 * @see WP_Widget->form
 * @access public
 * @param array $instance
 * @return void
 */
function form( $instance ) {
    //Defaults
    $instance = wp_parse_args( (array) $instance, array( 'title' => '') );
    $title = esc_attr( $instance['title'] );
    $orderby = isset( $instance['orderby'] ) ? $instance['orderby'] : 'order';
    $count = isset($instance['count']) ? (bool) $instance['count'] :false;
    $hierarchical = isset( $instance['hierarchical'] ) ? (bool) $instance['hierarchical'] : false;
    $dropdown = isset( $instance['dropdown'] ) ? (bool) $instance['dropdown'] : false;
    $show_children_only = isset( $instance['show_children_only'] ) ? (bool) $instance['show_children_only'] : false;

?>

get_field_id('title'); ?>"> get_field_id('title') ); ?>" name="get_field_name('title') ); ?>" type="text" value="" />

    <p><label for="<?php echo $this->get_field_id('orderby'); ?>"><?php _e('Order by:', 'woocommerce') ?></label>
    <select id="<?php echo esc_attr( $this->get_field_id('orderby') ); ?>" name="<?php echo esc_attr( $this->get_field_name('orderby') ); ?>">
        <option value="order" <?php selected($orderby, 'order'); ?>><?php _e('Category Order', 'woocommerce'); ?></option>
        <option value="name" <?php selected($orderby, 'name'); ?>><?php _e('Name', 'woocommerce'); ?></option>
    </select></p>

    <p><input type="checkbox" class="checkbox" id="<?php echo esc_attr( $this->get_field_id('dropdown') ); ?>" name="<?php echo esc_attr( $this->get_field_name('dropdown') ); ?>"<?php checked( $dropdown ); ?> />
    <label for="<?php echo $this->get_field_id('dropdown'); ?>"><?php _e( 'Show as dropdown', 'woocommerce' ); ?></label><br />

    <input type="checkbox" class="checkbox" id="<?php echo esc_attr( $this->get_field_id('count') ); ?>" name="<?php echo esc_attr( $this->get_field_name('count') ); ?>"<?php checked( $count ); ?> />
    <label for="<?php echo $this->get_field_id('count'); ?>"><?php _e( 'Show post counts', 'woocommerce' ); ?></label><br />

    <input type="checkbox" class="checkbox" id="<?php echo esc_attr( $this->get_field_id('hierarchical') ); ?>" name="<?php echo esc_attr( $this->get_field_name('hierarchical') ); ?>"<?php checked( $hierarchical ); ?> />
    <label for="<?php echo $this->get_field_id('hierarchical'); ?>"><?php _e( 'Show hierarchy', 'woocommerce' ); ?></label><br/>

    <input type="checkbox" class="checkbox" id="<?php echo esc_attr( $this->get_field_id('show_children_only') ); ?>" name="<?php echo esc_attr( $this->get_field_name('show_children_only') ); ?>"<?php checked( $show_children_only ); ?> />
    <label for="<?php echo $this->get_field_id('show_children_only'); ?>"><?php _e( 'Only show children for the current category', 'woocommerce' ); ?></label></p>

}

share|improve this question

closed as off-topic by Mark Kaplun, gmazzap, birgire, mrwweb, Pieter Goosen Sep 3 '14 at 4:16

This question appears to be off-topic. The users who voted to close gave this specific reason:

  • "Your question should be specific to WordPress. Generic PHP/JS/HTML/CSS questions might be better asked at Stack Overflow or another appropriate site of the Stack Exchange network. Third party plugins and themes are off topic." – Mark Kaplun, gmazzap, birgire, mrwweb, Pieter Goosen
If this question can be reworded to fit the rules in the help center, please edit the question.

    
For some reason it didn't post all the code. –  user26485 Jan 24 '13 at 17:08

1 Answer 1

A bit late but perhaps this might still help someone...

If you don't mind hardcoding the parent category name, slug and ID (e.g. "All", "designer","38") this works for creating a dropdown to jump to child categories of the specified ID:

<?php   
$terms = get_terms( 'product_cat', 'child_of=38' );
if ( $terms ) {
    print( '<select name="product_cat" id="dropdown_product_cat">' );
    print( '<option value="designer" selected="selected">All</option>' );
    foreach ( $terms as $term ) {
        printf( '<option value="%s">%s</option>', esc_attr( $term->slug ), esc_html( $term->name ) );
    }
    print( '</select>' );
} ?>
<script type="text/javascript">
/* <![CDATA[ */
        var product_cat_dropdown = document.getElementById("dropdown_product_cat");
        function onProductCatChange() {
                if ( product_cat_dropdown.options[product_cat_dropdown.selectedIndex].value !=='' ) {
                        location.href = "<?php echo home_url(); ?>/?product_cat="+product_cat_dropdown.options[product_cat_dropdown.selectedIndex].value;
                }
        }
        product_cat_dropdown.onchange = onProductCatChange;
/* ]]> */
</script>
share|improve this answer

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