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 has a simple way to pick "Featured" products by clicking a little star icon in the "Featured" column in the admin area.

I need to be able to filter and show only featured products in the admin area. Does anyone know of a straightforward way to do this?

I did some digging and it turns out this is done with meta key/values, where _featured is the key and the value is either yes or no.

Unfortunately, since it's not done with taxonomies like product categories, there is no way to use the filter functionality in the admin area to show only featured products. You can sort the featured column so they are all either at the top of bottom of the product list, but that's it.

share|improve this question

2 Answers 2

You can sort your products list by the featured status. Just click on the star at the top of the column.... once will put all non-featured items at the top, and twice should reverse this and put all featured items at the top.

Your admin url will look like: /wp-admin/edit.php?post_type=product&orderby=featured&order=desc

Sort products by featured status

EDIT:

Ok, so it turned out to not be that hard to filter by featured status. WooCommerce is filtering by "subtype", and since that is also filtering by meta, we can mostly just copy their code and make a few adjustments.

The first function adds the select/drop-down element, while the second handles the adjustments to the admin query.

/**
 * Filter products by type
 *
 * @access public
 * @return void
 */
function wpa104537_filter_products_by_featured_status() {

     global $typenow, $wp_query;

    if ($typenow=='product') :


        // Featured/ Not Featured
        $output .= "<select name='featured_status' id='dropdown_featured_status'>";
        $output .= '<option value="">'.__( 'Show All Featured Statuses', 'woocommerce' ).'</option>';

        $output .="<option value='featured' ";
        if ( isset( $_GET['featured_status'] ) ) $output .= selected('featured', $_GET['featured_status'], false);
        $output .=">".__( 'Featured', 'woocommerce' )."</option>";

        $output .="<option value='normal' ";
        if ( isset( $_GET['featured_status'] ) ) $output .= selected('normal', $_GET['featured_status'], false);
        $output .=">".__( 'Not Featured', 'woocommerce' )."</option>";

        $output .="</select>";

        echo $output;
    endif;
}

add_action('restrict_manage_posts', 'wpa104537_filter_products_by_featured_status');

/**
 * Filter the products in admin based on options
 *
 * @access public
 * @param mixed $query
 * @return void
 */
function wpa104537_featured_products_admin_filter_query( $query ) {
    global $typenow, $wp_query;

    if ( $typenow == 'product' ) {

        // Subtypes
        if ( ! empty( $_GET['featured_status'] ) ) {
            if ( $_GET['featured_status'] == 'featured' ) {
                $query->query_vars['meta_value']    = 'yes';
                $query->query_vars['meta_key']      = '_featured';
            } elseif ( $_GET['featured_status'] == 'normal' ) {
                $query->query_vars['meta_value']    = 'no';
                $query->query_vars['meta_key']      = '_featured';
            }
        }

    }

}

add_filter( 'parse_query', 'wpa104537_featured_products_admin_filter_query' );
share|improve this answer
    
Thank you. As I noted in the last sentence of my question, I am aware of that sorting function. However, I want to use the Sort Products feature, which allows drag and drop sorting, to sort Featured Products, which is not possible by default. You can filter by category, then hit "Sort Products" and drag them into the order you want. I want this for featured products... –  Gabriel Jun 28 '13 at 19:04
    
I was just reading an article today about how people don't read the entirety of articles on the web, looks like you caught me. Check my edit. –  helgatheviking Jun 28 '13 at 20:08
    
Looks like I was finding my solution as you were posting yours, and they look similar. Thanks! –  Gabriel Jun 28 '13 at 20:26
    
Yup, looks like we're doing the same thing. Kind of a nice tweak... might use it on my own sites. –  helgatheviking Jun 28 '13 at 20:48
up vote 0 down vote accepted

I found this plugin: http://wordpress.stackexchange.com/a/45447/15190, which I was able to customize to provide a select list to filter by Featured product. With that, I am able to then use WooCommerce's Sort Products drag and drop feature to easily change the order that Featured products appear in the Featured Products widget and other places.

Here is the code with my customizations that will make it work for WooCommerce Featured Products:

<?php
/*
Plugin Name: Admin Filter By WooCommerce Featured Products
Plugin URI: http://en.bainternet.info
Description: adapted from http://wordpress.stackexchange.com/q/45436/2487. Allows you to show only Featured products, which will then allow for drag and drop sorting of Featured products
Version: 1.0
Author: Bainternet
Author URI: http://en.bainternet.info
*/

add_action( 'restrict_manage_posts', 'wpse45436_admin_posts_filter_restrict_manage_posts' );
/**
 * First create the dropdown
 * 
 * @author Ohad Raz
 * 
 * @return void
 */
function wpse45436_admin_posts_filter_restrict_manage_posts(){
    $type = 'post';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }

    //only add filter to post type you want
    if ('product' == $type){
        //change this to the list of values you want to show
        //in 'label' => 'value' format
        $values = array(
            'Show Only Featured' => 'Yes', 
            'Show Only Non-Featured' => 'No',
        );
        ?>
        <select name="Featured">
        <option value=""><?php _e('Show Featured & Non-Featured', 'wpse45436'); ?></option>
        <?php
            $current_v = isset($_GET['Featured'])? $_GET['Featured']:'';
            foreach ($values as $label => $value) {
                printf
                    (
                        '<option value="%s"%s>%s</option>',
                        $value,
                        $value == $current_v? ' selected="selected"':'',
                        $label
                    );
                }
        ?>
        </select>
        <?php
    }
}

add_filter( 'parse_query', 'wpse45436_posts_filter' );
/**
 * if submitted filter by post meta
 * 
 * @author Ohad Raz
 * @param  (wp_query object) $query
 * 
 * @return Void
 */
function wpse45436_posts_filter( $query ){
    global $pagenow;
    $type = 'post';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }
    if ( 'product' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['Featured']) && $_GET['Featured'] != '') {
        $query->query_vars['meta_key'] = '_featured';
        $query->query_vars['meta_value'] = $_GET['Featured'];
    }
}
share|improve this answer
    
Don't forget to select one of our answers as the official answer to move this from the 'unanswered questions' pile. –  helgatheviking Jun 30 '13 at 14:17

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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