Ian Yates
Ian Yates

Reputation: 91

Query WooCommerce Products based on Attribute

This one's driving me nuts.. I'm trying to query and output WooCommerce products based on a specific attribute. For example, I set up an Attribute called on, with possible values of yes or no.

I query using the following:

$args = array(  
   'post_type' => 'product',  
   'meta_key' => 'pa_on',  
   'meta_value' => 'yes',  
   'posts_per_page' => -1  
);  

query_posts($args);

The meta_key is crucial perhaps; if I call it on I get nothing. If I call it pa_on (because that's how I understand WooCommerce custom attributes to be constructed) I get nothing.

However, if I try a different query and use _featured, which is a standard WooCommerce custom meta thingy, it returns the relevant featured posts. Help, anyone?

Upvotes: 8

Views: 18575

Answers (4)

anbinder
anbinder

Reputation: 55

If product attribute is saved as specific product attribute (i.e. not global), then you can't query it as taxonomy, instead you can use this snippet (copied from http://snippet.fm/snippets/query-woocommerce-products-product-specific-custom-attribute/):

// Set custom attribute name and value to search for
$attribute_name  = 'color';
$attribute_value = 'green';

$serialized_value = serialize( 'name' ) . serialize( $attribute_name ) . serialize( 'value' ) . serialize( $attribute_value ); // extended version: $serialized_value = serialize( $attribute_name ) . 'a:6:{' . serialize( 'name' ) . serialize( $attribute_name ) . serialize( 'value' ) . serialize( $attribute_value ) . serialize( 'position' );
$args = array(
    'post_type'      => 'product',
    'post_status'    => 'any',
    'posts_per_page' => -1,
    'orderby'        => 'title',
    'order'          => 'ASC',
    'meta_query' => array(
        array(
            'key'     => '_product_attributes',
            'value'   => $serialized_value,
            'compare' => 'LIKE',
        ),
    ),
);
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) {
    $loop->the_post();
    // do stuff here... e.g. get_the_ID()
}
wp_reset_postdata();

Upvotes: 3

NikolayS93
NikolayS93

Reputation: 66

For new woocommerce use:

$attribute = 'on';
$value = 'yes';
$args = array(
    'post_type' => 'product',
    'tax_query' => array(
    array(
        'taxonomy'      => 'pa_' . $attribute,
        'terms'         => $value,
        'field'         => 'slug',
        'operator'      => 'IN'
        )
    )
);

Upvotes: 4

hcd00045
hcd00045

Reputation: 131

I know this is an old one, but just in case someone stumbles upon it like I did today -- Woocommerce (I'm using v2.6.2) appears to store these custom attributes as taxonomies.

I suspect the correct args for the original question would look like this:

  $args = array(
    'post_type' => 'product',
    'tax_query' => array(
      array(
        'taxonomy' => 'pa_on',
        'field'    => 'name',
        'terms'    => 'yes'
      )
    )
  );

Using the appropriate values for my installation, it solved my problem.

Upvotes: 10

Kriesi
Kriesi

Reputation: 141

Guess what you need is a query with meta_query value set:

$args = array(
'post_type' => 'product',
'meta_query' => array(
    array(
        'key' => 'pa_on',
        'value' => 'yes',
        'compare' => '='
    )
)
);
$query = new WP_Query( $args );

You can learn more about those here: http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters

Upvotes: 0

Related Questions